Go 语言笔记 - 语法和数据类型

一、基础语法

一个标准 Go 语句如下:

fmt.Println("Hello, World!")
  • 一行代表一个语句结束。每个语句不需以分号 ; 结尾,也不是 Python 纯靠缩进来表示内容,需要大括号{}进行包裹
  • 标识符用来命名变量、类型等,第一个字符必须是字母或下划线而不能是数字。

Go 代码中会使用到的 25 个关键字或保留字:

  • default
  • func
  • interface
  • select
  • defer
  • go
  • map
  • struct
  • chan
  • if
  • else
  • switch
  • case
  • continue
  • for
  • break
  • range
  • goto
  • package
  • const
  • fallthrough
  • type
  • import
  • return
  • var

36 个预定义标识符:

  • append
  • bool
  • byte
  • cap
  • close
  • complex
  • complex64
  • complex128
  • uint16
  • copy
  • false
  • float32
  • float64
  • imag
  • int
  • int8
  • int16
  • uint32
  • int32
  • int64
  • iota
  • len
  • make
  • new
  • nil
  • panic
  • uint64
  • print
  • println
  • real
  • recover
  • string
  • true
  • uint
  • uint8
  • uintptr

二、数据类型

本部分的内容基本来自 《Go 语言设计与实现》 - draveness.me ,这里只是一些关键内容摘录,为了保持上下文内容连贯,还是推荐查看原文。

  • 布尔型 常量 true 或者 false。一个简单的例子:var b bool = true

  • 数字类型 整型 int 和浮点型 float,并且原生支持复数,其中位的运算采用补码。更详细的信息看文章末尾。

  • 字符串类型 使用UTF-8编码标识Unicode文本

  • 派生类型:

2.1 数组

arr1 := [3]int{1, 2, 3}
arr2 := [...]int{1, 2, 3}

字面量初始化方式,元素的个数小于或者等于四个时,在编译时会转换成如下命令:

var arr [3]int
arr[0] = 1
arr[1] = 2
arr[2] = 3

当前数组的元素大于四个,则会:

var arr [5]int
statictmp_0[0] = 1
statictmp_0[1] = 2
statictmp_0[2] = 3
statictmp_0[3] = 4
statictmp_0[4] = 5
arr = statictmp_0

数组在 Go 语言中没那么常用,更常用的数据结构是切片,即动态数组。

2.2 切片

[]int
[]interface{}

切片与数组的关系非常密切。切片引入了一个抽象层,提供了对数组中部分连续片段的引用,而作为数组的引用,我们可以在运行区间可以修改它的长度和范围。当切片底层的数组长度不足时就会触发扩容,切片指向的数组可能会发生变化,不过在上层看来切片是没有变化的.

2.2.1 基本操作

Go 语言中包含三种初始化切片的方式:

  1. 通过下标的方式获得数组或者切片的一部分,编译器会将 arr[0:3] 或者 slice[0:3] 等语句转换成 OpSliceMake 操作;
  2. 使用字面量初始化新的切片(编译时处理大部分工作);
  3. 使用关键字 make 创建切片(运行时处理相对多):

如果使用字面量的方式创建切片,大部分的工作都会在编译期间完成。但是当我们使用 make 关键字创建切片时,很多工作都需要运行时的参与。

arr[0:3] or slice[0:3] 
slice := []int{1, 2, 3}
slice := make([]int, 10)

使用 lencap 获取长度、容量是切片最常见的操作,编译器将这它们看成两种特殊操作,即 OLENOCAP

切片的长度是它所包含的元素个数。 切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数

切片的操作(init、查、改、长度、容量)基本都是在编译期间完成的,编译期间也会将包含 range 关键字的遍历转换成形式更简单的循环。

2.2.2 切片扩容

切片追加和扩容时,会先解构切片结构体获取它的数组指针、大小和容量,切片容量足够时向切片中追加元素,切片容量不足时会调用 runtime.growslice 对切片进行扩容,扩容根据切片的当前容量选择不同的策略:

  1. 如果期望容量大于当前容量的两倍就会使用期望容量;
  2. 如果当前切片的长度小于 1024 就会将容量翻倍;
  3. 如果当前切片的长度大于 1024 就会每次增加 25% 的容量,直到新容量大于期望容量;

确定了切片的大致容量,此外还需要根据切片中的元素大小对齐内存,runtime.roundupsize 函数会将待申请的内存向上取整,取整时会使用 runtime.class_to_size 数组(以提高内存的分配效率并减少碎片)

var arr []int64
arr = append(arr, 1, 2, 3, 4, 5)

简单总结一下扩容的过程,当我们执行上述代码时,会触发 runtime.growslice 函数扩容 arr 切片并传入期望的新容量 5,这时期望分配的内存大小为 40 字节;不过因为切片中的元素大小等于 sys.PtrSize,所以运行时会调用 runtime.roundupsize 向上取整内存的大小到 48 字节,所以新切片的容量为 48 / 8 = 6。

2.2.3 切片拷贝

如果当前 copy 不是在运行时调用的, runtime.memmove 会负责拷贝内存。

而如果拷贝是在运行时发生的,例如:go copy(a, b),编译器会使用 runtime.slicecopy 替换运行期间调用的 copy,再通过 runtime.memmove 将整块内存的内容拷贝到目标的内存区域中。

相比于依次拷贝元素,runtime.memmove 能够提供更好的性能。需要注意的是,整块拷贝内存仍然会占用非常多的资源,在大切片上执行拷贝操作时一定要注意对性能的影响。

2.3 map

哈希表/map是除了数组之外,最常见的数据结构。几乎所有的语言都会有数组和哈希表两种集合元素,有的语言将数组实现成列表,而有的语言将哈希称作字典或者映射。无论如何命名或者如何实现,数组和哈希是两种设计集合元素的思路,数组用于表示元素的序列,而哈希表示的是键值对之间映射关系。

所谓哈希(hash),就是将不同的输入映射成独一无二的、固定长度的值(又称”哈希值”)。如果不同的输入得到了同一个哈希值,就发生了”哈希碰撞”(collision)。

img

黑客攻击的一种方法,就是设法制造”哈希碰撞”,然后入侵系统,窃取信息。防止哈希碰撞的最有效方法,就是扩大哈希值的取值空间。

16个二进制位的哈希值,产生碰撞的可能性是 65536 分之一。也就是说,如果有65537个用户,就一定会产生碰撞。哈希值的长度扩大到32个二进制位,碰撞的可能性就会下降到 4,294,967,296 分之一。

更长的哈希值意味着更大的存储空间、更多的计算,将影响性能和成本。开发者必须做出抉择,在安全与成本之间找到平衡。

哈希表是计算机科学中的最重要数据结构之一,这不仅因为它 O(1)O(1) 的读写性能非常优秀,还因为它提供了键值之间的映射。想要实现一个性能优异的哈希表,需要注意两个关键点 —— 哈希函数冲突解决方法

2.3.1 哈希函数

实现哈希表的关键点在于哈希函数的选择,哈希函数的选择在很大程度上能够决定哈希表的读写性能。在理想情况下,哈希函数应该能够将不同键映射到不同的索引上,这要求哈希函数的输出范围大于输入范围,但是由于键的数量会远远大于映射的范围,所以在实际使用时,这个理想的效果是不可能实现的。

如果使用结果分布较为均匀的哈希函数,那么哈希的增删改查的时间复杂度为 O(1);但是如果哈希函数的结果分布不均匀,那么所有操作的时间复杂度可能会达到 O(n),由此看来,使用好的哈希函数是至关重要的。

比较实际的方式是让哈希函数的结果能够尽可能的均匀分布,然后通过工程上的手段解决哈希碰撞的问题。

2.3.2 冲突解决
  • 开放寻址法 #

    开放寻址法中对性能影响最大的是装载因子,它是数组中元素的数量与数组大小的比值。随着装载因子的增加,线性探测的平均用时就会逐渐增加,这会影响哈希表的读写性能。当装载率超过 70% 之后,哈希表的性能就会急剧下降,而一旦装载率达到 100%,整个哈希表就会完全失效,这时查找和插入任意元素的时间复杂度都是 O(n)O(n) 的,这时需要遍历数组中的全部元素,所以在实现哈希表时一定要关注装载因子的变化。

  • 拉链法 #

    拉链法是哈希表最常见的实现方法,大多数的编程语言都用拉链法实现哈希表,它的实现比较开放地址法稍微复杂一些,但是平均查找的长度也比较短,各个用于存储节点的内存都是动态申请的,可以节省比较多的存储空间。

    实现拉链法一般会使用数组加上链表,不过一些编程语言会在拉链法的哈希中引入红黑树以优化性能,拉链法会使用链表数组作为哈希底层的数据结构,我们可以将它看成可以扩展的二维数组

哈希表可能会在装载因子过高或者溢出桶过多时进行扩容,哈希表扩容并不是原子过程,在扩容的过程中保证哈希的访问是比较有意思的话题.

2.3.3 map的数据结构

Go 语言使用拉链法来解决哈希碰撞的问题实现了哈希表,它的访问、写入和删除等操作都在编译期间转换成了运行时的函数或者方法。哈希在每一个桶中存储键对应哈希的前 8 位,当对哈希进行操作时,这些 tophash 就成为可以帮助哈希快速遍历桶中元素的缓存。

哈希表的每个桶都只能存储 8 个键值对,一旦当前哈希的某个桶超出 8 个,新的键值对就会存储到哈希的溢出桶中。随着键值对数量的增加,溢出桶的数量和哈希的装载因子也会逐渐升高,超过一定范围就会触发扩容,扩容会将桶的数量翻倍,元素再分配的过程也是在调用写操作时增量进行的,不会造成性能的瞬时巨大抖动。

Go 语言运行时同时使用了多个数据结构组合表示哈希表,其中 runtime.hmap 是最核心的结构体, runtime.hmap 的桶是 runtime.bmap。每一个 runtime.bmap 都能存储 8 个键值对,当哈希表中存储的数据过多,单个桶已经装满时就会使用 extra.nextOverflow 中桶存储溢出的数据。

溢出桶是在 Go 语言还使用 C 语言实现时使用的设计,由于它能够减少扩容的频率所以一直使用至今。

随着哈希表存储的数据逐渐增多,我们会扩容哈希表或者使用额外的桶存储溢出的数据,不会让单个桶中的数据超过 8 个。

溢出桶也只是临时的解决方案,创建过多的溢出桶最终也会导致哈希的扩容。

runtime.mapassign 函数会在以下两种情况发生时触发哈希的扩容:

  1. 装载因子已经超过 6.5;
  2. 哈希使用了太多溢出桶;

不过因为 Go 语言哈希的扩容不是一个原子的过程,所以 runtime.mapassign 还需要判断当前哈希是否已经处于扩容状态,避免二次扩容造成混乱。

2.3.4 map初始化
  1. 字面量

    hashMap := map[string]int{
    	"1": 2,
    	"3": 4,
    	"5": 6,
    }
    

    当哈希表中的元素数量少于或者等于 25 个时,编译器会将字面量初始化的结构体转换成以下的代码,将所有的键值对一次加入到哈希表中,初始化的方式与数组和切片几乎完全相同

    hashMap := make(map[string]int, 3)
    hashMap["1"] = 2
    hashMap["3"] = 4
    hashMap["5"] = 6
    

    一旦哈希表中元素的数量超过了 25 个,编译器会创建两个数组分别存储键和值,这些键值对会通过如下所示的 for 循环加入哈希:

    hashMap := make(map[string]int, 26)
    vstatk := []string{"1", "2", "3", ...  "26"}
    vstatv := []int{1, 2, 3, ... , 26}
    for i := 0; i < len(vstak); i++ {
        hashMap[vstatk[i]] = vstatv[i]
    }
    
  2. 运行时

    hashMap := make(map[string]int, 3)
    

    当创建的哈希被分配到栈上并且其容量小于 BUCKETSIZE = 8 时,Go 语言在编译阶段会使用如下方式快速初始化哈希,这也是编译器对小容量的哈希做的优化:

    var h *hmap
    var hv hmap
    var bv bmap
    h := &hv
    b := &bv
    h.buckets = b
    h.hash0 = fashtrand0()
    

    除了上述特定的优化之外,无论 make 是从哪里来的,只要我们使用 make 创建哈希,Go 语言编译器都会在类型检查期间将它们转换成 runtime.makemap,使用字面量初始化哈希也只是语言提供的辅助工具,最后调用的都是 runtime.makemap

2.3.5 一般使用
_ = hashMap[key]

for k, v := range hashMap {
    // k, v
}

hashMap[key] = value
hashMap[key] = newValue
delete(hashMap, key)

2.4 字符串

变量

声明变量的一般形式是使用 var 关键字:

var identifier type

变量声明

操作符 := 可以高效地创建一个新的变量,是使用变量的首选形式,但是只能被用在函数体内,不可以用于全局变量的声明与赋值。

var a int  =  10  // 指定变量类型,声明后若不赋值,使用默认值。
var b =  10 		// 根据值自行判定变量类型。
c :  =  10  		// 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。

多变量声明

//类型相同多个变量, 非全局变量  
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3 

var vname1, vname2, vname3 = v1, v2, v3

vname1, vname2, vname3 := v1, v2, v3 

// 这种因式分解关键字的写法一般用于声明全局变量
var  ( 
	vname1 v_type1
	vname2 v_type2 
)

常量

常量的定义格式:

const identifier [type]  = value

多个相同类型的声明可以简写为:

const c_name1, c_name2 = value1, value2

常量还可以用作枚举:

const  (  
	Unknown  =  0  
	Female  =  1  
	Male  =  2  
)

iota,特殊常量,可以认为是一个可以被编译器修改的常量。每当 iota 在新的一行被使用时,它的值都会自动加 1。

运算符

与 C/C++ 相当接近,不写了。速查手册

条件循环语句

条件语句

if  布尔表达式  {  
	/* 在布尔表达式为 true 时执行 */  
}  else  {  
	/* 在布尔表达式为 false 时执行 */  
}

switch var1 {  
	case val1:  ...  
	case val2:  ...  
	default:  ...  
}

var c1, c2, c3 chan int  
var i1, i2 int  

select  {  
	case i1 =  <-c1: 
		fmt.Printf("received ", i1,  " from c1\n")  
	case c2 <- i2: 
		fmt.Printf("sent ", i2,  " to c2\n")  
	
	default: 
		fmt.Printf("no communication\n")  
}

循环语句

package main

import "fmt"

func main() {

   var b int = 15
   var a int

   numbers := [6]int{1, 2, 3, 5} 

   /* for 循环 */
   for a := 0; a < 10; a++ {
      fmt.Printf("a 的值为: %d\n", a)
   }

   for a < b {
      a++
      fmt.Printf("a 的值为: %d\n", a)
      }

   for i,x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   
}

附录:数字类型

整型:

序号 类型和描述
1 uint8 无符号 8 位整型 (0 到 255)
2 uint16 无符号 16 位整型 (0 到 65535)
3 uint32 无符号 32 位整型 (0 到 4294967295)
4 uint64 无符号 64 位整型 (0 到 18446744073709551615)
5 int8 有符号 8 位整型 (-128 到 127)
6 int16 有符号 16 位整型 (-32768 到 32767)
7 int32 有符号 32 位整型 (-2147483648 到 2147483647)
8 int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

浮点型:

序号 类型和描述
1 float32 IEEE-754 32位浮点型数
2 float64 IEEE-754 64位浮点型数
3 complex64 32 位实数和虚数
4 complex128 64 位实数和虚数

其他数字类型

序号 类型和描述
1 byte 类似 uint8
2 rune 类似 int32
3 uint 32 或 64 位
4 int 与 uint 一样大小
5 uintptr 无符号整型,用于存放一个指针

参考资料


负载均衡、LVS概述

本文转自 负载均衡、LVS概述

1. 负载均衡概述

负载均衡的基本思路是:在一个服务器集群中尽可能的平衡负载量。通常的做法是在服务器前端设置一个负载均衡器(一般是专门的硬件设备)。然后负载均衡器将请求的连接路由到最空闲的可用服务器。下图显示了一个典型的大型网站负载均衡设置,其中一个负载均衡器用于HTTP流量,另一个用于MySQL访问。

负载均衡有5个常见的目的。

(1)可扩展性:负载均衡对于某些扩展策略有所帮助,例如读写分离时从备库读数据。

(2)高效性:负载均衡有助于更有效的使用资源,因为它能够控制请求被路由到何处。

(3)可用性:一个灵活的负载均衡解决方案能够使用时刻保持可用的服务器。

(4)透明性:客户端无须知道是否存在负载均衡设置,也不需要关心在负载均衡器的背后有多少机器,名字是什么。负载均衡器给客户端看到的只是一个虚拟的服务器。

(5)一致性:如果应用是有状态的(数据库事务、网站会话等),那么负载均衡器就应将相关的查询指向同一个服务器,以防止数据丢失。应用无须去跟踪到底连接哪一个服务器。

2. 四层/七层负载均衡

服务器负载均衡,顾名思义就是对一组服务器提供负载均衡业务。这一组服务器一般来说都处于同一个局域网络内,并同时对外提供一组(或多组)相同(或相似)的服务。服务器负载均衡是数据中心最常见的组网模型。

服务器负载均衡分为四层(L4)服务器负载均衡和七层(L7)服务器负载均衡两种:

  • L4服务器负载均衡支持IPv4协议和IPv6协议,是基于流的服务器负载均衡,对报文进行逐流分发,将同一条流的报文分发给同一个服务器。L4服务器负载均衡对基于HTTP的7层业务无法做到按内容进行分发,限制了负载均衡业务的适用范围。依据转发方式,L4服务器负载均衡分为NAT方式和DR方式。
  • L7服务器负载均衡只支持IPv4协议,是基于内容的服务器负载均衡,对报文的承载内容进行深度解析,包括HTTP协议、RTSP协议等,根据其中的内容进行逐包分发,按既定策略将连接导向指定的服务器,实现了业务使用范围更广泛的服务器负载均衡。L7服务器负载均衡仅支持NAT方式。

2.1 NAT方式L4服务器负载均衡

NAT方式L4服务器负载均衡的组网灵活,后端服务器可以位于不同的物理位置,不同的局域网内。NAT方式下,LB设备分发服务请求时,进行目的IP地址转换(目的IP地址为实服务的IP),通过路由将报文转发给各个实服务。NAT方式L4服务器负载均衡的典型组网如图所示。


Go 语言笔记 - 环境配置

嗯,最近一个项目需要用到 Go 语言开发。捡起来复习一下,于是出了这篇文章。最近几天还会继续总结,欢迎和我讨论。

简介

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

观点

Go语言,Docker和Kubernetes -王垠

安装

Go 语言支持以下系统:

  • Linux
  • FreeBSD
  • Mac OS X
  • Window

安装包下载地址为:https://golang.org/dl/

Windows

Windows 只要安装 msi 安装包即可。

Mac

安装包下载地址为:https://golang.org/dl/

我用的是 Mac,直接下载 pkg 安装包即可。需要在系统路径里增加 go 的地址


Linux命令之tcpdump

简介

tcpdump是非常强大的网络安全分析工具,可以将网络上截获的数据包保存到文件以备分析。可以定义过滤规则,只截获感兴趣的数据包,以减少输出文件大小和数据包分析时的装载和处理时间。

tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

我在文章Linux 网络监控与统计实例有过一些例子。这篇文章做一个简单的介绍。详细的内容可以参考文末的参考资料。

用法

tcpdump [-adeflnNOpqRStuvxX] [ -c count ] [ -C file_size ]
                 [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ]
                 [ -T type ] [ -U user ] [ -w file ] [ -E algo:secret ] [ expression ]

	-c 捕获指定数量的报文 
	-F使用文件作为过滤表达式的源 
	-i 使用可选网络接口捕获报文 
	-p 禁止在杂凑模式下捕获
	- r读取捕获文件而非网络接口 
	-w保存原始报文到文件中

实用命令实例

tcpdump

普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。

1.1、过滤主机

  • 抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据

    tcpdump -i eth1 host 192.168.1.1
    
  • 指定源地址

    tcpdump -i eth1 src host 192.168.1.1
    
  • 指定目的地址

    tcpdump -i eth1 dst host 192.168.1.1
    

1.2、过滤端口

  • 抓取所有经过eth1,目的或源端口是25的网络数据

    tcpdump -i eth1 port 25
    
  • 指定源端口

    tcpdump -i eth1 src port 25
    
  • 指定目的端口

    tcpdump -i eth1 dst port 25
    
  • 有些版本的tcpdump允许指定端口范围

      tcpdump tcp portrange 20-24
    

1.3、网络过滤

tcpdump -i eth1 net 192.168
tcpdump -i eth1 src net 192.168
tcpdump -i eth1 dst net 192.168

1.4、协议过滤

tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp

1.5、常用表达式

非 : ! or "not" (去掉双引号)  
且 : && or "and"  
或 : || or "or"
  • 抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据

    tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
    
  • 抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据

    tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
    
  • 抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据

    tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
    
防止包截断:tcpdump -s0
tcpdump -i bond0 -s 0 -nn -S  -w tcpdump_nodetest1_1127_1.cap

tcpdump -i eth0 -s 0 -nn -S  -w tcpdump_`hostname`_`date '+%Y-%m-%d_%H:%M'`.cap
tcpdump -i bond1 -s 0 -nn -S  -w tcpdump_`hostname`_`date '+%Y-%m-%d_%H:%M'`.cap

python -m SimpleHTTPServer 40000

其他

-c参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工CTRL+C还是抓的太多,甚至导致服务器宕机,于是可以用-c参数指定抓多少个包。

time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null

上面的命令计算抓10000个SYN包花费多少时间,可以判断访问量大概是多少。

参考资料


php 开源项目整理

转载自:

Awesome PHP

一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等

贡献

详细内容请查看贡献代码管理.

目录

Composer源 Composer Repositories

Composer源

依赖管理 Dependency Management

依赖和包管理库

其他的依赖管理 Dependency Management Extras

其他的相关依赖管理

  • Composed - 一个在运行时解析你项目Composer环境的库
  • Composer Checker - 一个校验Composer配置的工具
  • Composer Merge Plugin - 一个用于合并多个composer.json文件的Composer插件
  • Composition - 一个在运行时检查Composer环境的库
  • NameSpacer - 一个转化下划线到命名空间的库
  • Patch Installer - 一个使用Composer安装补丁的库
  • Prestissimo - 一个开启并行安装进程的Composer插件
  • Satis - 一个静态Composer存储库的生成器
  • tooly - 一个在项目中使用Composer管理PHAR文件的库
  • Toran Proxy - 一个静态Composer存储库和代理

框架 Frameworks

Web开发框架

  • Aura Framework - 一个独立的组件框架
  • CakePHP - 一个快速应用程序开发框架 (CP)
  • Laravel 5 - 另一个PHP框架 (L5)
  • Nette - 另一个由个体组件组成的框架
  • Phalcon - 通过C扩展实现的框架
  • PPI Framework 2 - 一个互操作性框架
  • Symfony - 一个独立组件组成的框架 (SF)
  • Yii2 - 另一个PHP框架
  • Zend Framework 2 - 另一个由独立组件组成的框架 (ZF2)
  • Ice - 另一个通过C扩展实现的简单快速的PHP框架

其他框架 Framework Extras

其他Web开发框架

框架组件 Components

来自web开发框架的独立组件

微型框架 Micro Frameworks

微型框架和路由

  • Bullet PHP - 用于构建REST APIs的微型框架
  • Lumen - 一个Laravel的微型框架
  • Proton - 一个StackPHP兼容的微型框架
  • Radar - 一个PHP的Action-Domain-Responder的实现
  • Silex - 基于Symfony2组件的微型框架
  • Slim - 另一个简单的微型框架

其他微型框架 Micro Framework Extras

其他相关的微型框架和路由

路由 Routers

处理应用路由的库

  • Aura.Router - 一个全功能的路由库
  • Fast Route - 一个快速路由的库
  • Klein - 一个灵活的路由的库
  • Pux - 另一个快速路由的库
  • Route - 一个基于Fast Route的路由的库

模板 Templating

模板化和词法分析的库和工具

  • Aura.View - 提供TemplateView和TwoStepView,支持partials, sections和helpers
  • Foil - 另一个原生PHP模板库
  • Lex - 一个轻量级模板解析器
  • MtHaml - 一个HAML模板语言的PHP实现
  • Mustache - 一个Mustache模板语言的PHP实现
  • Phly Mustache - 另一个Mustache模板语言的PHP实现
  • PHPTAL - 一个TAL模板语言的PHP实现
  • Plates - 一个原生PHP模板库
  • Smarty - 一个模板引擎
  • Twig - 一个全面的模板语言
  • Tale Jade - Jade模版语言的PHP实现

静态站点生成器 Static Site Generators

用来生成web页面的预处理内容的工具

  • Couscous - 一个将Markdown转化为漂亮的网站的工具
  • Phrozn - 另一个转换Textile,Markdown和Twig为HTML的工具
  • Sculpin - 转换Markdown和Twig为静态HTML的工具
  • Spress - 一个能够将Markdown和Twig转化为HTML的可扩展工具

超文本传输协议 HTTP

用于HTTP的库

  • Buzz - 另一个HTTP客户端
  • Guzzle - 一个全面的HTTP客户端
  • HTTPFul - 一个链式HTTP库
  • PHP VCR - 一个录制和重放HTTP请求的库
  • Requests - 一个简单的HTTP库
  • Retrofit - 一个能轻松创建REST API客户端的库
  • zend-diactoros - PSR-7 HTTP消息实现

爬虫 Scraping

用于网站爬取的库

  • Embed - 一个从web服务或网页中提取的信息的工具
  • Goutte - 一个简单的web爬取器
  • PHP Spider - 一个可配置和可扩展的PHP web爬虫

中间件 Middlewares

使用中间件构建应用程序的库

  • Expressive - 基于PSR-7的Zend中间件
  • PSR7-Middlewares - 灵感来源于方便的中间件
  • Relay - 一个PHP 5.5 PSR-7的中间件调度器
  • Stack - 一个用于Silex/Symfony的可堆叠的中间件的库
  • zend-stratigility - 基于PHP PSR-7之上的中间件之上

网址 URL

解析URL的库

电子邮件 Email

发送和解析邮件的库

文件 Files

文件处理和MIME类型检测的库

流 Streams

处理流的库

  • Streamer - 一个简单的面向对象的流包装库

依赖注入 Dependency Injection

实现依赖注入设计模式的库

  • Aura.Di - 一个依赖注入容器
  • Acclimate - 一个依赖注入容器和服务定位的通用接口
  • Auryn - 一个递归的依赖注入容器
  • Container - 另一个可伸缩的依赖注入容器
  • Disco - 一个兼容PSR-11基于annotation的依赖注入容器
  • PHP-DI - 一个支持自动装配和PHP配置的依赖注入容器
  • Pimple - 一个小的依赖注入容器
  • Symfony DI - 一个依赖注入容器组件 (SF2)

图像 Imagery

处理图像的库

测试 Testing

测试代码和生成测试数据的库

  • Alice - 富有表现力的一代库
  • AspectMock - 一个PHPUnit/Codeception的模拟框架。
  • Atoum - 一个简单的测试库
  • Behat - 一个行为驱动开发(BDD)测试框架
  • Codeception - 一个全栈测试框架
  • DBUnit - 一个PHPUnit的数据库测试库
  • Faker - 一个伪数据生成库
  • HTTP Mock - 一个在单元测试模拟HTTP请求的库
  • Kahlan - 全栈Unit/BDD测试框架,内置stub,mock和代码覆盖率的支持
  • Mink - Web验收测试
  • Mockery - 一个用于测试的模拟对象的库
  • ParaTest - 一个PHPUnit的并行测试库
  • Peridot - 一个事件驱动开发的测试框架
  • Phake - 另一个用于测试的模拟对象的库
  • Pho - 另一个行为驱动开发测试框架
  • PHP-Mock - 一个基于PHP函数的模拟库
  • PHPSpec - 一个基于功能点设计的单元测试库
  • PHPT - 一个使用PHP本身的测试工具
  • PHPUnit - 一个单元测试框架
  • Prophecy - 一个可选度很高的模拟框架
  • Samsui - 另一个伪数据生成库
  • VFS Stream - 一个用于测试的虚拟文件系统流的包装器
  • VFS - 另一个用于测试虚拟的文件系统

持续集成 Continuous Integration

持续集成的库和应用

  • CircleCI - 一个持续集成平台
  • GitlabCi - 使用GitLab CI测试、构建、部署你的代码,像TravisCI
  • Jenkins - 一个PHP支持的持续集成平台
  • JoliCi - 一个用PHP编写的由Docker支持的持续集成的客户端
  • PHPCI - 一个PHP的开源的持续集成平台
  • SemaphoreCI - 一个开放源码和私人项目的持续集成平台
  • Shippable - 一个基于开源和私人项目持续集成平台的docker
  • Sismo - 一个持续测试的服务库
  • Travis CI - 一个持续集成平台
  • Wercker - 一个持续集成平台

文档 Documentation

生成项目文档的库

  • APIGen - 另一个API文档生成器
  • daux.io - 一个使用Markdown文件的文档生成器
  • PHP Documentor 2 - 一个API文档生成器
  • phpDox - 一个PHP项目的文档生成器(不限于API文档)
  • Sami - 一个API文档生成器

安全 Security

生成安全的随机数,加密数据,扫描漏洞的库

密码 Passwords

处理和存储密码的库和工具

代码分析 Code Analysis

分析,解析和处理代码库的库和工具

Architectural Architectural

相关的设计模式库,组织代码编程的方法和途径

  • Compose - 一个功能组合库
  • Design Patterns PHP - 一个使用PHP实现的设计模式存储库
  • Finite - 一个简单的PHP有限状态机
  • Functional PHP - 一个函数式编程库
  • Galapagos - 语言转换进化
  • Iter - 一个使用生成器提供迭代原语的库
  • Monad PHP - 一个简单Monad库
  • Patchwork - 一个重新定义用户的函数库
  • PHP Option - 一个可选的类型库
  • Pipeline - 一个管道模式的实现
  • Ruler - 一个简单的无状态的生产环境规则引擎
  • RulerZ - 一个强大的规则引擎和规范模式的实现

调试和分析 Debugging and Profiling

调试和分析代码的库和工具

  • APM - 一个收集SQLite/MySQL/StatsD错误信息和统计信息的监控扩展
  • Barbushin PHP Console - 另一个使用Google Chrome的web调试控制台
  • Blackfire.io - 一个低开销的代码分析器
  • Kint - 一个调试和分析工具
  • PHP Console - 一个web调试控制台
  • PHP Debug Bar - 一个调试工具栏
  • PHPBench - 一个基准测试框架
  • PHPDBG - 一个交互的PHP调试器
  • Tideways.io - Monitoring and profiling tool
  • Tracy - A一个简单的错误检测,写日志和时间测量库
  • xDebug - 一个调试和分析PHP的工具
  • XHProf - 一个最初由Facebook开发的分析工具
  • Z-Ray - 一个调试和配置Zend服务器的工具

构建工具 Build Tools

项目构建和自动化工具

  • Bob - 一个简单的项目自动化工具
  • Box - 一个构建PHAR文件的工具
  • Construct - 一个PHP项目的生成器
  • Phake - 一个PHP克隆库
  • Phing - 一个灵感来自于Apache Ant的PHP项目构建系统

任务运行器 Task Runners

自动运行任务的库

  • Bldr - 一个构建在Symfony组件上的PHP任务运行器
  • Jobby - 一个没有修改crontab的PHP定时任务管理器
  • Robo - 一个面向对象配置的PHP任务运行器
  • Task - 一个灵感来源于Grunt和Gulp的纯PHP任务运行器

导航 Navigation

构建导航结构的工具

资源管理 Asset Management

管理,压缩和最小化web站点资源的工具

  • JShrink - 一个JavaScript的最小化库
  • Munee - 一个资源优化库
  • Puli - 一个检测资源绝对路径的库
  • BowerPHP - Bower的一个PHP实现,一个web包管理工具

地理位置 Geolocation

地理编码地址和使用纬度经度的库

日期和时间 Date and Time

处理日期和时间的库

  • CalendR - 一个日历管理库
  • Carbon - 一个简单的日期时间API扩展
  • Chronos - 一个支持可变和不可变日期时间的DateTime API扩展
  • ExpressiveDate - 另一个日期时间API扩展
  • Moment.php - 灵感来源于Moment.js的PHP DateTime处理库,支持国际化
  • Yasumi - 一个帮助你计算节日日期和名称的库

事件 Event

时间驱动或实现非阻塞事件循环的库

日志 Logging

生成和处理日志文件的库

  • Analog - 一个基于闭包的微型日志包
  • KLogger - 一个易用的兼容PSR-3的日志类
  • Monolog - 一个全面的日志工具

电子商务 E-commerce

处理支付和构建在线电子商务商店的库和应用

  • Money - 一个Fowler金钱模式的PHP实现
  • OmniPay - 一个框架混合了多网关支付处理的库
  • Payum - 一个支付抽象库
  • Shopware - 一个可高度定制的电子商务软件
  • Swap - 一个汇率库
  • Sylius - 一个开源的电子商务解决方案

PDF PDF

处理PDF文件的库和软件

  • Dompdf - 一个将HTML转换为PDF的工具
  • PHPPdf - 一个将XML文件转换为PDF和图片的库
  • Snappy - 一个PDF和图像生成器库
  • WKHTMLToPDF - 一个将HTML转换为PDF的工具

Office Office

Libraries for working with office suite documents.

数据库 Database

使用对象关系映射(ORM)或数据映射技术的数据库交互的库

  • Aura.Sql - 一个使用PDO的ORM
  • Aura.SqlQuery - 支持MySQL, PostgreSQL, SQLite和Microsoft SQL Server的ORM
  • Baum - 一个Eloquent的嵌套集实现
  • Cake ORM - 对象关系映射工具,利用DataMapper模式实现 (CP)
  • Doctrine Extensions - 一个Doctrine行为扩展的集合
  • Doctrine - 一个全面的DBAL和ORM
  • Eloquent - 一个简单的ORM(L5)
  • LazyRecord - 一个简单、可扩展、高性能的ORM
  • Pomm - 一个PostgreSQL对象模型管理器
  • Propel - 一个快速的ORM,迁移库和查询构架器
  • ProxyManager - 一个为数据映射生成代理对象的工具集
  • RedBean - 一个轻量级,低配置的ORM
  • Spot2 - 一个MySQL的ORM映射器

迁移 Migrations

帮助管理数据库模式和迁移的库

  • Doctrine Migrations - 一个Doctrine的迁移库
  • Migrations - 一个迁移管理库
  • Phinx - 另一个数据库迁移的管理库
  • PHPMig - 另一个迁移管理库
  • Ruckusing - 基于PHP下ActiveRecord的数据库迁移,支持MySQL, Postgres, SQLite

NoSQL NoSQL

处理NoSQL后端的库

  • Monga - 一个MongoDB抽象库
  • MongoQB - 一个MongoDB查询构建库
  • PHPMongo - 一个MongoDB ORM.
  • Predis - 一个功能完整的Redis库

队列 Queue

处理事件和任务队列的库

在数据上索引和执行查询的库和软件

命令行 Command Line

关于命令行工具的库

  • Aura.Cli - 一个命令行库
  • Boris - 一个微型PHP REPL
  • Cilex - 一个构建命令行工具的微型框架
  • CLI Menu - 一个构建CLI菜单的库
  • CLIFramework - 一个支持完全zsh/bash、子命令和选项约束的命令行框架,这也归功于phpbrew
  • CLImate - 一个输出带颜色的和特殊格式的命令行库
  • Commando - 另一个简单的命令行选择解析器
  • Cron Expression - 一个计算cron运行日期的库
  • GetOpt - 一个命令行选择解析器
  • GetOptionKit - 另一个命令行选择解析器
  • Hoa Console - 另一个命令行库
  • OptParse - 另一个命令行选择解析器
  • Pecan - 一个事件驱动和非阻塞的shell
  • PsySH - 另一个PHP REPL
  • ShellWrap - -一个简单的命令行包装库

身份验证和授权 Authentication and Authorization

实现身份验证和授权的库

标记 Markup

处理标记的库

字符串 Strings

解析和处理字符串的库

  • Agent - 一个基于Mobiledetect的桌面/手机端user agent解析库
  • ANSI to HTML5 - 一个将ANSI转化为HTML5的库
  • Color Jizz - 处理和转换颜色的库
  • Device Detector - 另一个解析user agent字符串的库
  • Hoa String - 另一个UTF-8字符串库
  • Jieba-PHP - Python的jieba的PHP端口,自然语言处理的中文文本分词
  • Mobile-Detect - 一个用于检测移动设备的轻量级PHP类(包括平板电脑)
  • Patchwork UTF-8 - 一个处理UTF-8字符串的便携库
  • Slugify - 转换字符串到slug的库
  • SQL Formatter - 一个格式化SQL语句的库
  • Stringy - 一个多字节支持的字符串处理库
  • Text - 一个文本处理库
  • UA Parser - 一个解析user agent字符串的库
  • URLify - 一个Django中URLify.js的PHP版本
  • UUID - 生成UUIDs的库

数字 Numbers

处理数字的库

过滤和验证 Filtering and Validation

过滤和验证数据的库

API API

开发REST-ful API的库和web工具

  • API Platform - 暴露出REST API的项目,包含JSON-LD, Hydra格式
  • Apigility - 一个使用Zend Framework 2构建的API构建器
  • Drest - 一个将Doctrine实体暴露为REST资源节点的库
  • HAL - 一个超文本应用语言(HAL)构建库
  • Hateoas - 一个HOATEOAS REST web服务库
  • Negotiation - 一个内容协商库
  • Restler - 一个将PHP方法暴露为RESTful web API的轻量级框架
  • wsdl2phpgenerator - 一个从SOAP WSDL文件生成PHP类的工具

缓存 Caching

缓存数据的库

数据结构和存储 Data Structure and Storage

实现数据结构和存储技术的库

  • Ardent - 一个数据结构库
  • Cake Collection - 一个简单的集合库 (CP)
  • Collections - 一个PHP的集合抽象库
  • Fractal - 一个转换复杂数据结构到JSON输出的库
  • Ginq - 另一个基于.NET实现的PHP的LINQ库
  • JsonMapper - 一个将内嵌JSON结构映射为PHP类的库
  • Knapsack - 一个集合的库,灵感来自Clojure的相关库
  • PHP Collections - 一个简单的集合库
  • PINQ - 一个基于.NET实现的PHP的LINQ(Language Integrated Query)库
  • Porter - 数据导入的抽象框架
  • Serializer - 一个序列化和反序列化数据的库
  • Totem - -一个管理和创建数据交换集的库
  • YaLinqo - 另一个PHP的LINQ库
  • Zend Serializer - 另一个序列化和反序列化数据的库 (ZF2)

通知 Notifications

处理通知软件的库

  • JoliNotif - 一个跨平台的桌面通知库(支持Growl, notify-send, toaster等)
  • Nod - 一个通知库(Growl等)
  • Notification Pusher - 一个设备推送通知的独立库
  • Notificato - 一个处理推送通知的库
  • Notificator - 一个轻量级的通知库
  • Php-pushwoosh - 一个使用Pushwoosh REST Web服务轻松推送通知的PHP库

部署 Deployment

项目部署库

  • Deployer - 一个部署工具
  • Envoy - 一个用PHP运行SSH任务的工具
  • Plum - 一个部署库
  • Pomander - 一个PHP应用部署工具
  • Rocketeer - PHP世界里的一个快速简单的部署器

国际化和本地化 Internationalisation and Localisation

国际化(I18n)和本地化(L10n)的库

  • Aura.Intl - 一个国际化的库
  • Cake I18n - 消息国际化和日期和数字的本地化 (CP)

第三方API Third Party APIs

访问第三方API的库

扩展 Extensions

帮助构建PHP扩展的库

  • PHP CPP - 一个开发PHP扩展的C++库
  • Zephir - 用于开发PHP扩展,且介于PHP和C++之间的编译语言

杂项 Miscellaneous

创建一个开发环境的软件

PHP安装 PHP Installation

在你的电脑上帮助安装和管理PHP的工具

开发环境 Development Environment

创建沙盒开发环境的软件和工具

  • Ansible - 一个非常简单的编制框架
  • Phansible - 一个用Ansible构建PHP开发虚拟机的web工具
  • Protobox - 另一个构建PHP开发虚拟机的web工具
  • PuPHPet - 一个构建PHP开发虚拟机的web工具
  • Puppet - 一个服务器自动化框架和应用
  • Vagrant - 一个便携的开发环境工具
  • Docker - 一个容器化的平台

虚拟机 Virtual Machines

相关的PHP虚拟机

  • Hack - 一个PHP进行无缝操作的HHVM编程语言
  • HHVM - Facebook出品的PHP虚拟机,Runtime和JIT
  • HippyVM - 另一个PHP虚拟机

集成开发环境(IDE) Integrated Development Environment

支持PHP的集成开发环境

Web应用 Web Applications

基于Web的应用和工具

  • 3V4L - 一个在线的PHP和HHVM shell
  • DBV - 一个数据库版本控制应用
  • PHP Queue - A一个管理后端队列的应用
  • MailCatcher - 一个抓取和查看邮件的web工具
  • Cachet - 开源状态页面系统
  • phpBeanstalkdAdmin - 一个Beanstalkd的监控管理页面
  • phpRedisAdmin - 一个用于管理Redis数据库的简单web界面
  • phpPgAdmin - 一个PostgreSQL的web管理工具
  • phpMyAdmin - 一个MySQL/MariaDB的web界面
  • Adminer - 一个数据库管理工具
  • Grav - 一个现代的flat-file的CMS

基础架构 Infrastructure

提供PHP应用和服务的基础架构

  • appserver.io - 一个用PHP写的多线程的PHP应用服务器
  • php-pm - 一个PHP应用的进程管理器、修改器和负载平衡器

PHP网站 PHP Websites

PHP相关的有用的网站

其他网站 Other Websites

web开发相关的有用网站

PHP书籍 PHP Books

PHP相关的非常好的书籍

其他书籍 Other Books

与一般计算和web开发相关的书

PHP视频 PHP Videos

PHP相关的非常不错的视频

PHP播客 PHP Podcasts

专注于PHP话题的博客

  • PHP Town Hall - 一个随意的Ben Edmunds和Phil Sturgeon的PHP播客
  • PHP Roundtable - PHP Roundtable是一个讨论PHP开发者关心话题的临时聚会

PHP阅读 PHP Reading

PHP相关的阅读资料

PHP内核阅读 PHP Internals Reading

阅读PHP内核或性能相关的资料

PHP杂志 PHP Magazines

有趣的PHP相关的杂志