PHP代码的生命周期
不启用OPcache的流程
启用OPcache的流程
- Scanning:将PHP代码转换为语言片段(Tokens)
- Parsingg:将Tokens转换成简单而有意义的表达式
- Compilation:将表达式编译成opcodes
- Execution:执行opcodes,每次一条,从而实现PHP脚本的功能
opcodes
当一个 PHP 文件被解释执行的时候,首先是被编译成名为 opcode (CPU专用的机器语言指令)的中间代码,然后才被底层的虚拟机执行。 如果PHP文件没有被修改过,opcode 始终是一样的。这就意味着编译步骤白白浪费了 CPU 的资源。
此时 opcode 缓存就派上用场了。通过将 opcode 缓存在内存中,它能防止冗余的编译步骤,并且在下次调用执行时得到重用。一般执行过程是先检查文件的签名(signature)或者修改时间,以防文件有改动。
PHP 5.5 以后的所有版本都内置了一个 opcode 缓存工具,叫做 Zend OPcache。 根据你所使用的 PHP 安装包/发行版的不同,一般情况下是默认开启的,请查看 OPcache.enable phpinfo() 和 phpinfo() 输出的信息确认是否已经开启。
Operate Code:当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。
OPcache
opcode cache的目地是避免重复编译,减少CPU和内存开销。
PHP配置
PHP5.5以上默认有OPcache,如果需要安装,则使用以下脚本:
1 | wget http://pecl.php.net/get/zendOPcache-7.0.3.tgz |
php.ini配置说明
1 | [Zend Opcache] |
监测OPcache
- 可视化显示:https://github.com/PeeHaa/OpCacheGUI
- **简易的显示缓存信息(PHP7+)**:https://github.com/rlerdorf/opcache-status
相关PHP的API使用
1 | opcache_is_script_cached(string $filename):bool 是否缓存 |