前言
随着业务的发展,性能优化成为了不可避免的课题。优化后的业务承载能力可以是未优化前的10倍,下面介绍一下php中的优化利器OPcache。
OPcache
介绍
OPcache 是由 PHP 官方公司 Zend 开发的一款免费使用的 PHP 优化加速拓展。他可以将 PHP 脚本编译后的 bytecode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速 PHP 应用响应。PHP 自 5.5 版开始,就已经内置了 OPcache 扩展。不过默认是关闭状态的
启用
编辑配置文件
vim /path/php.ini
opcache.enable=1
查看是否启用成功
[root@VM-0-7-centos ~]# php -m|grep OPcache
Zend OPcache
配置项说明
; 是否在命令行开启,这里默认设置为 0 ,暂且关闭
;opcache.enable_cli=0
; 这个内存是用来存储编译后的字节码的,视你的程序
; 代码量而定,Laravel 应用一般建议设置为 256,单位 MB,
; 默认是 128
opcache.memory_consumption=256
; 会对程序所有的字符串进行统一存储以加快存取速度,
; 默认是 8m,建议 32 或者不超过 64。
opcache.interned_strings_buffer=32
; 最大加速多少个脚本文件,视项目脚本文件数而定,
; 合理区间 200~1000000 ,默认是 10000 ,建议 500000
opcache.max_accelerated_files=1000000
; 最大作废比例百分比,到达这个比例会重启,默认是 5 ,建议 10
opcache.max_wasted_percentage=10
; 开启情况下会在脚本名称前加上当前目录信息做为缓存的 Key,关闭可以
; 提高性能,但是会面临出错的风险(文件名一致时),建议开启,关闭使用 0
opcache.use_cwd=1
; 开启的话,会按照 opcache.revalidate_freq 设置的频率去检查文件
; 是否修改以便重新缓存,默认开启,生产环境下请设置为关闭,然后
; 写自动化脚本,在每次更新代码后自动重启 OPcache
opcache.validate_timestamps=0
; 文件更新检测频率,单位秒,只有在 opcache.validate_timestamps
; 开启时才有效。默认为 2,意味着 2 秒钟检查一次,会对文件系统造
; 成负担,如果是在开发环境中请酌情使用,生产环境随意设置,因为
; 我们会设置 validate_timestamps 为关闭。
opcache.revalidate_freq=2200
; 文件加载的逻辑,默认关闭,无需修改
;opcache.revalidate_path=0
; 开启的话会把代码注释一起缓存,关闭可减低内存使用,但是
; 如果有一些代码依赖于注释里的指令,例如 Doctrine,
; Zend Framework 2 和 PHPUnit,将会出现问题。建议开启
opcache.save_comments=1
;指定要在服务器启动时期进行编译和缓存的 PHP 脚本文件,
;这些文件也可能通过 include 或者 opcache_compile_file() 函数 来预加载其他文件。
;所有这些文件中包含的实体,包括函数、类等,在服务器启动的时候就被加载和缓存,
;对于用户代码来讲是“开箱可用”的。
;该特性为php7.4加入
opcache.preload=/path/to/preload.php # preload 脚本路径
;考虑到安全因素,禁止以 root 用户预加载代码。该指令方便以其他用户预加载。
opcache.preload_user=www # preload 用户,安全考虑禁止 root 用户
;PHP 8 引入了两个即时编译引擎,tracing JIT、function JIT。
;Tracing JIT 在两个中更有潜力,
;长时间运行的程序(`命令行`)中显示了 1.5-2 倍的性能改进。
;典型的应用(`web`)性能则和 PHP 7.4 不相上下。
;JIT在运算密集的需求中更具优势
opcache.jit=tracing
;jit 缓冲区大小
opcache.jit_buffer_size=64M
opcache.preload预加载文件示例
wordpress 示例
<?php
declare( strict_types=1 );
$wp_dir = '/path/to/wordpress'; // WordPress 所在的物理路径
$preload_patterns = [
$wp_dir . "wp-includes/Text/Diff/Renderer.php",
$wp_dir . "wp-includes/Text/Diff/Renderer/inline.php",
$wp_dir . "wp-includes/SimplePie/**/*.php",
$wp_dir . "wp-includes/SimplePie/*.php",
$wp_dir . "wp-includes/Requests/**/*.php",
$wp_dir . "wp-includes/Requests/*.php",
$wp_dir . "wp-includes/**/class-*.php",
$wp_dir . "wp-includes/class-*.php",
];
$exclusions = [
$wp_dir . 'wp-includes/class-simplepie.php',
$wp_dir . 'wp-includes/SimplePie/File.php',
$wp_dir . 'wp-includes/SimplePie/Core.php',
$wp_dir . 'wp-includes/class-wp-simplepie-file.php',
$wp_dir . 'wp-includes/class-snoopy.php',
$wp_dir . 'wp-includes/class-json.php',
];
foreach ( $preload_patterns as $pattern ) {
$files = glob( $pattern );
foreach ( $files as $file ) {
if ( ! in_array( $file, $exclusions, true ) ) {
opcache_compile_file( $file );
}
}
}
删除缓存
开启OPcache后,项目更新后需要重新缓存(当然你也可以设置成OPcache在规定的时间内重新缓存,但是会有一定的开销)。
<?php
if (opcache_reset()) {
return '清除OPCache缓存成功';
}
return '清除OPCache缓存失败';
?>
下面这段shell是我在生成环境中使用的供大家参考
#!/bin/bash
WEBDIR="$(pwd)/public/"
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
echo "<?php if (opcache_reset()) {return '清除OPCache缓存成功';}return '清除OPCache缓存失败'; ?>" > ${WEBDIR}${RANDOM_NAME}.php
ENVIRONMENT=`cat .env`
HOSTNAME=`cat .env.${ENVIRONMENT} | grep APP_HOST `
HOSTNAME=${HOSTNAME#*'= '}
(date +%F && svn update && curl ${HOSTNAME}/${RANDOM_NAME}.php && php think optimize:schema common && composer dump-autoload -o) >>./update.log
rm ${WEBDIR}${RANDOM_NAME}.php
可视化界面opcache-gui
A clean and responsive interface for Zend OPcache information, showing statistics, settings and cached files, and providing a real-time update for the information.
This interface uses ReactJS and Axios and is for modern browsers and requires a minimum of PHP 7.1.
总结
以上就是今天要讲的内容,本文介绍了OPcache的使用,配置不是一成不变的大家还需多多结合实际的生产需求调整配置
参考资料:
LX3 Laravel 性能优化入门
PHP7.4 新特性 预缓存(Preload )介绍
php8 新特性介绍
php8 新特性说明(官方)