opcache从字面意思,肯定是缓存这一块的。但是你是否知道它的工作原理是怎样的呢?这里一点一点让你了解!
PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。 而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。
1. 概述 在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。 1.1 PHP-FPM + Nginx 的工作机制 请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤: 第一步:启动服务
启动PHP-FPM。PHP-FPM 支持两种通信模式:TCP socket和Unix socket;
PHP-FPM 会启动两种类型的进程:Master 进程 和 Worker 进程,前者负责监控端口、分配任务、管理Worker进程;后者就是PHP的cgi程序,负责解释编译执行PHP脚本。
启动Nginx。首先会载入 ngx_http_fastcgi_module 模块,初始化FastCGI执行环境,实现FastCGI协议请求代理
这里要注意:fastcgi的worker进程(cgi进程),是由PHP-FPM来管理,不是Nginx。Nginx只是代理
Nginx 接收请求,并基于location配置,选择一个合适handler
这里就是代理PHP的 handler
Nginx 把请求翻译成fastcgi请求
通过TCP socket/Unix Socket 发送给PHP-FPM 的master进程
PHP-FPM master 进程接收到请求
分配Worker进程执行PHP脚本,如果没有空闲的Worker,返回502错误
Worker(php-cgi)进程执行PHP脚本,如果超时,返回504错误
处理结束,返回结果
PHP-FPM Worker 进程返回处理结果,并关闭连接,等待下一个请求
PHP-FPM Master 进程通过Socket 返回处理结果
Nginx Handler顺序将每一个响应buffer发送给第一个filter → 第二个 → 以此类推 → 最终响应发送给客户端
<?phpif (!empty($_POST)) {echo "Response Body POST: ", json_encode($_POST), "\n";}if (!empty($_GET)) {echo "Response Body GET: ", json_encode($_GET), "\n";}
OPCache:前身是Zend Optimizer+ ,是 Zend Server 的一个开源组件;官方出品,强力推荐
APC:Alternative PHP Cache 是一个开放自由的 PHP opcode 缓存组件,用于缓存、优化 PHP 中间代码;已经不更新了不推荐
APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用
eAccelerate:同样是不更新了,不推荐
xCache:不再推荐使用了
OPCode
Interned String,如注释、变量名等
sysv shm是持久化的,除非被一个进程明确的删除,否则它始终存在于内存里,直到系统关机;
mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上
内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种
mmap的一大优点是把文件映射到进程的地址空间
避免了数据从用户缓冲区到内核page cache缓冲区的复制过程;
当然还有一个优点就是不需要频繁的read/write系统调用
PHP脚本涉及到的函数
PHP脚本中定义的Class
PHP脚本文件路径
PHP脚本OPArray
PHP脚本自身结构/内容
不要在高峰期发布代码,这是任何情况下都要遵守的规则
代码预热,比如使用脚本批量调PHP 访问URL,或者使用OPCache 暴露的API 如opcache_compile_file() 进行编译缓存
opcache.preferred_memory_model="mmap" OPcache 首选的内存模块。如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括:mmap,shm, posix 以及 win32。
opcache.memory_consumption=64 OPcache 的共享内存大小,以兆字节为单位,默认64M
opcache.interned_strings_buffer=4 用来存储临时字符串的内存大小,以兆字节为单位,默认4M
opcache.max_wasted_percentage=5 浪费内存的上限,以百分比计。如果达到此上限,那么 OPcache 将产生重新启动续发事件。默认5
opcache.max_accelerated_files=2000 OPcache 哈希表中可存储的脚本文件数量上限。真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于设置值的质数。设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。默认值2000
opcache.max_file_size=0 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。默认值0
opcache.load_commentsboolean 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。本选项可以和 opcache.save_comments 一起使用,以实现按需加载注释内容。
opcache.fast_shutdown boolean 如果启用,则会使用快速停止续发事件。所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
opcache.file_cache 配置二级缓存目录并启用二级缓存。启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。默认值为空字符串 "",表示禁用基于文件的缓存。
opcache.file_cache_onlyboolean 启用或禁用在共享内存中的 opcode 缓存。
opcache.file_cache_consistency_checksboolean 当从文件缓存中加载脚本的时候,是否对文件的校验和进行验证。
opcache.file_cache_fallbackboolean 在 Windows 平台上,当一个进程无法附加到共享内存的时候, 使用基于文件的缓存,也即:opcache.file_cache_only=1。需要显示的启用文件缓存。
