引言
CGI 全称是“公共网关接口”(Common Gateway Interface),HTTP 服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
CGI 可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如 PHP, Perl, Tcl 等。
CGI是一个协议,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议,返回什么数据。例如:Nginx根据协议吧Url、查询字符串、POST数据、HTTP header等信息传给PHP解析器。
FastCGI 是语言无关的、可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中并因此获得较高的性能。Fastcgi会先启一个master(主进程),解析配置文件,初始化执行环境,然后再启动多个worker(子进程)。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率高。
PHP-CGI是PHP提供的FastCGI进程管理器,缺点是不支持平滑启动,修改配置文件后需要重启服务。
PHP-FPM 提供了更好的 PHP 进程管理方式对 PHP-CGI 管理,可以有效控制内存和进程、可以平滑重载 PHP 配置。PHP-FPM 处理机制是新的worker用新的配置,通过这种机制来实现平滑过度。
OPCache
OPCache 是Zend官方出品的,开放自由的 opcode 缓存扩展,还具有代码优化功能,省去了每次加载和解析 PHP 脚本的开销。
PHP内核
OPCACHE 工作逻辑
OPCache 原理
OPCache缓存的机制主要是:将编译好的操作码放入共享内存,提供给其他进程访问。
共享内存默认mmap API,还有System-V shm API、POSIX API、Unix socket API可以选择。
依据PHP字节码缓存的场景,OPCache的内存管理设计非常简单,快速读写,不释放内存,过期数据置为Wasted。
当Wasted内存大于设定值时,自动重启OPCache机制,清空并重新生成缓存。
缓存两类内容:
OPCode
Interned String,如注释、变量名等
OPCode 缓存内容
PHP脚本涉及到的函数
PHP脚本中定义的Class
PHP脚本文件路径
PHP脚本OPArray
PHP脚本自身结构/内容
Interned String 缓存
Interned String 缓存的内容包括: 变量名称、类名、方法名、字符串、注释等。
在PHP-FPM模式中,Interned String 缓存字符,仅限于Worker 进程内部。
而缓存到OPCache中,那么Worker进程之间可以使用 Interned String 缓存的字符串,节省内存。
我们需要注意一个事情,在PHP开发中,一般会有大段的注释,也会被缓存到OPCache中。
可以通过php.ini的配置,关闭注释的缓存。
但是,像Zend Framework等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。
OPCACHE 配置