PHP性能优化--OPCache


前言

随着业务的发展,性能优化成为了不可避免的课题。优化后的业务承载能力可以是未优化前的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 新特性说明(官方)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值