opcode

php使用opcache扩展,来进行缓存php的字节码,提升代码的执行速度。

资源

https://www.cnblogs.com/lamp01/p/8985068.html

安装

#1、找到opcache的扩展,我的是php7.1
yum list php71*
# 2、安装扩展
yum install php71w-opcache.x86_64

配置

zend_extension=opcache.so
[opcache]
;开启opcache
opcache.enable=1  

;CLI环境下,PHP启用OPcache
opcache.enable_cli=1

;OPcache共享内存存储大小,单位MB
opcache.memory_consumption=128  

;PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
; 这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB
opcache.interned_strings_buffer=8

;这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。
; 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是说在200到1000000之间。
opcache.max_accelerated_files=4000

;设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=60

;从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。
opcache.fast_shutdown=1

;如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果
;强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web服务器。
opcache.validate_timestamps=0 

;开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
;这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
opcache.file_cache=/tmp

函数

1、opcache_get_configuration;

形式:array opcache_get_configuration(void);

获取设置的缓存配置信息,以数组形式返回配置信息、黑名单及版本号。

2、opcache_get_status;

形式:array opcache_get_status(void);

获取设置的缓存状态信息。

3、opcache_invalidate;

形式:boolean opcache_invalidate (string);

该函数的作用是使得指定脚本的字节码缓存失效。如果force 没有设置或者传入的是 FALSE,那么只有当脚本的修改时间 比对应字节码的时间更新,脚本的缓存才会失效。

4、opcache_reset;

形式:boolean opcache_reset(void);

该函数将重置整个字节码缓存。在调用 opcache_reset() 之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。

5、opcache_compile_file;

形式:boolean opcache_compile_file (string);

无需运行,就可以编译并缓存脚本。

6、opcache_is_script_cached

形式:boolean opcache_is_script_cached (string);

判断某个脚本是否已经缓存到Opcache。

探索

删除的文件

删除的文件,请求nginx时,由于该文件不存在,会立马访问不到。但是,如果我们再重新新建一个同名的文件,其实还是能访问到旧的缓存的文件。

记录一次尝试过程

opcache模块,已经是php的标准模块了,故,只需要从同版本的源码中,提取安装即可。版本不匹配,安装不成功,报错。

php版本:with Zend OPcache v7.4.8,,使用pecl下载的2015年7.0.5安装出错,又尝试7.3.17版本的,也会报错。

以下使用本地代理,加快下载源码速度。

curl --proxy http://localhost:7890 -o php-7.4.26.tar.gz  https://www.php.net/distributions/php-7.4.26.tar.gz

安装及配置

cd path/to/ext/opcache
# 常规安装过程
/usr/local/php/bin/phpize 
./configure  --with-php-config=/usr/local/php/bin/php-config
make 
make test
make install
ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/

# 添加配置文件
mkdir -p /usr/local/php/conf.d
cat > /usr/local/php/conf.d/opcache.ini <<EOL
zend_extension=opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
EOL

重启fpm进程,使配置生效

ps aux|grep  php-fpm
# 找到要重启的进程,并重启
kill -USR2 1022
kill -USR2 16938

测试文件:

在测试的过程中,改变输出的结果,大概发现,1分钟后才会更新。这说明opcache生效了。

<?php

echo "hello world";