使用 OpCache 提升 PHP 5.5+ 程序性能

说明#

PHP 5.5 以后内建了 OpCache , OpCache 的加速原理是把编译后的 bytecode 存储在内存里面,避免重复编译 PHP 所造成的资源浪费.

引用#

如何启用#

虽然内建了,但是默认没有启用,下面是开启的布置,以这套环境为例子:

PHP 5.5
Ubuntu 14.04
Nginx
PHP-FPM

修改 php.ini 文件#

sudo vim /etc/php5/fpm/php.ini

在文件最后面加入:

; 开关打开
opcache.enable=1

; 可用内存, 酌情而定, 单位 megabytes
opcache.memory_consumption=256

; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=5000

; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=240

重启服务器

sudo service php5-fpm restart
sudo service nginx restart

APC VS OpCache#

APC 是将要被遗弃的项目,PHP 5.5 都不支持,而在 PHP 5.5 和 5.6 版本,OpCache 是默认内建的,并且支持 5.2 到 5.4 的安装.

如何查看效果#

效果图 :sparkles:#

下图是 PHPHub 开启了 OpCache 后的效果 ( New Relic 监控后台截屏 ) :

file

开启后的 PHP 平均响应时间不到 60ms, 之前是 120 ~ 130ms

file

大家有没有觉得访问的时候快了一点点呢. :smile:

摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
Summer
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 8
Summer

@zhuzhichao

顺便提下有下面这个函数可以调用,可以写一个 artisan command, 在 envoy 里,更新代码后调用 Reset Cache.

opcache_reset(); 
10年前 评论
Summer

@zhuzhichao

顺便提下有下面这个函数可以调用,可以写一个 artisan command, 在 envoy 里,更新代码后调用 Reset Cache.

opcache_reset(); 
10年前 评论
Summer

@lijinma 哈哈,用的 New Relic 监控.

10年前 评论
Jourdon

@Summer 可以具体说下 opcache_reset () 的使用吗?

7年前 评论

@王东哲 要啥具体的,如果想清理,直接放入口文件,跑一次下就清理了

7年前 评论

opcache_reset () 在 CLI 模式下运行,一直返回 false,是因为没有开始 opcache.enable_cli 吗?

7年前 评论

php.net 中,有人留言
使用以下脚本 opcache-clear

#!/bin/bash
WEBDIR=/var/www/html/
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
echo "<?php opcache_reset(); ?>" > ${WEBDIR}${RANDOM_NAME}.php
curl http://localhost/${RANDOM_NAME}.php
rm ${WEBDIR}${RANDOM_NAME}.php

存放到 /usr/local/bin/opcache-clear ,需要重置的时候执行一下: "opcache-clear"

5年前 评论
mingzaily 5年前

我配置的 opcache 出现以下错误,能否帮忙看看

php artisan opcache:optimize

Optimize started, this can take a while... The requested URL returned error: 500 Internal Server Error Url: 127.0.0.1/opcache-api/optimize?key=...

1年前 评论