介绍 Opcode 缓存
- Operation code,解析 PHP 脚本分析代码,生成 Zend 引擎可以直接执行的中间码
- PHP 解析流程:词法分析(Scanning) -> 语法分析(Parsing) -> 编译(compilation) -> Execution
- Scanning:扫描,将 PHP 代码转换成语言片段(Tokens)
- Parsing:解析,将片段转换成简单而又有意义的表达式
- Compilation:编译,将表达式编译成 Opcode
- Execution:依次执行 Opcode(如果 PHP 代码没有变更,那对应的 Opcode 也不会变更。如果将 PHP 代码对应的 Opcode 缓存起来,那 PHP 执行就可以跳过”词法分析“、”语法分析“、”编译“这三步骤,这样就极大提高了 PHP 的性能)
- 常用的 Opcode 缓存
- Apc 缓存(Alternative PHP Cache),可选 PHP 缓存, 提供内存缓存(类似 Redis、Memcached),不支持 PHP5.5 之后的版本
- Xcache 缓存,3.2版本后支持 PHP5.1-5.6
- OPcache 缓存,PHP5.5 之后内置,优化Opcode,拥有更好的性能,推荐使用
使用 OPcache
- 脚本开始,判断对应的 Opcode 是否存在缓存,如果存在,执行 Opcode,脚本结束。
- 如果缓存不存在,则进行词法分析、语法分析、编译code、如果 OPcache 开启了,则会优化和缓存 Opcode,最后执行 Opcode,脚本结束。
OPcache 安装和配置
ls -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
# Opcode 默认安装在扩展目录,如果检查目录下不存在,需进入 PHP 源码包进行安装
# 进入 PHP 源码包目录(在编译安装完 PHP 后,不要将源码包删掉,因为后面可能会要安装一些 PHP 扩展)
cd /usr/local/src/php-7.2.18/ext/opcache/
# 通过phpize建立php的外挂模块
/usr/local/php/bin/phpize
# 配置,指定php-config目录
./configure --with-php-config=/usr/local/php/bin/php-config
# 配置安装 && 编译安装
make
make install
# 编辑 php.ini
vim /usr/local/php/etc/php.ini
# 按 shift + G 到文本最后一行,添加内容
[opcache]
;执行OPcache目录
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
; OPcache的共享内存大小,以兆字节为单位。总共能够存储多少预编译的PHP代码(单位:MB)
opcache.memory_consumption=128
;用来存储字符串的内存大小(单位:MB)
opcache.interned_strings_buffer=8
;最大缓存的文件数目200-100000
opcache.max_accelerated_files=4000
; 检查脚本时间戳是否有更新的周期,以秒为单位。设置为0会导致针对每个请求,OPcache 都会检查脚本更新
opcache.revalidate_freq=60
; 打开快速关闭,打开这个在PHP Request Shutdown的时候会收内存的速度会提高.
opcache.fast_shutdown=1
; 如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件,这样可以有效减小优化后的文件体积,禁用此配置指令可能会导致一些依赖注释或注解的应用或框架无法正常工作,比如:Doctrine,Zend Framework2等.
; 推荐0
opcache.save_comments=0
;支持cli模式
opcache.enable_cli=1
# 保存退出,重启 PHP 和Nginx
systemctl restart nginx
/etc/init.d/php-fpm restart
# 或
kill -9 $(pidof php-fpm)
/usr/local/php/sbin/php-fpm
/usr/local/nginx/sbin/nginx -s reload
<?php
var_dump(opcache_get_status());
opcache_reset();