⚡
Hosting · Performance

如果您的PHP网站感觉很慢,即使已经选择了性能不错的主机套餐,最常见的原因之一是PHP在每次请求时都在做重复工作。解决这个问题最快、最便宜、无需修改任何代码的方法,就是启用 PHP OPcache —— 一个从PHP 5.5起就内置的扩展,但很多站长并不知道它的存在。

✓

AsiaGB 在每台共享主机服务器上默认启用PHP OPcache

AsiaGB所有共享主机套餐——从入门套餐到最高套餐——均已在系统级预先配置好OPcache。客户无需手动开启,也无需额外付费。您的网站从开通第一天起就在使用OPcache。如有需要,可通过DirectAdmin控制面板自定义OPcache参数。

什么是PHP OPcache?它是如何工作的?

要理解OPcache,首先需要了解PHP在没有OPcache时每次请求都做了什么。当浏览器请求一个页面时,PHP需要对涉及的每个 .php 文件执行以下步骤:

  1. 从磁盘读取文件 — PHP打开每个 .php 文件。即使是SSD存储,读取数百个文件也会带来可观的延迟。
  2. 词法分析(Tokenize/Lex) — PHP引擎逐字符读取源代码,将其分解为Token流(变量名、运算符、关键字、字符串字面量等)。
  3. 解析为抽象语法树(AST) — Token流被组装成抽象语法树,用于表示代码的逻辑结构。
  4. 编译为Opcode — AST被编译为低级操作码(Opcode),这是Zend引擎(PHP执行引擎)可以直接运行的指令集。
  5. 执行Opcode — Zend引擎运行Opcode,生成HTML并返回给浏览器。

问题在于:即使代码完全没有变化,步骤1到4在每次请求时都会重复执行。一个典型的WordPress页面加载涉及300至500个PHP文件。对于日访问量1000次的网站,这意味着PHP每天要重复读取和编译相同的文件数百万次——这是完全多余的CPU和I/O消耗。

OPcache消除了这种浪费。PHP首次编译某个文件的Opcode后,OPcache会将其存储在所有PHP进程可以访问的共享内存(RAM)中。下次有请求需要同一个文件时,PHP直接跳过步骤1至4,从RAM中取出Opcode立即执行。结果:更低的TTFB(首字节时间)、更低的CPU占用率,以及在相同硬件上处理更多并发请求的能力。

核心原理:OPcache = 存储在RAM中的Opcode缓存。PHP跳过了每次请求都要重复执行的文件读取和编译步骤。效果:更低的TTFB、更低的CPU负载、更高的吞吐量——无需修改任何应用代码。

实际性能数字

具体效果因应用而异,但在典型PHP工作负载上的测试数据大致如下:

30–60%
典型WordPress站点PHP侧TTFB降低幅度
2–5×
PHP文件较多的应用吞吐量提升倍数
40–70%
跳过重复编译后CPU使用率下降幅度

每次请求涉及PHP文件越多的应用,受益越显著:安装了大量插件的WordPress、WooCommerce商店、拥有庞大vendor目录的Laravel应用,以及拥有数千个类文件的Magento。相比之下,只有少量PHP文件的简单应用,或已完全使用页面缓存的站点,效果会相对小一些。

OPcache无法加速的场景

了解OPcache的局限性与了解其优势同样重要。OPcache只加速 PHP代码执行。如果您的网站因以下原因缓慢,OPcache无济于事:

AsiaGB:每台共享主机服务器均启用OPcache

AsiaGB共享主机的独特之处在于,OPcache不是可选附加项或高级功能 —— 它在AsiaGB运营的每台共享主机服务器上都在系统级启用,覆盖所有套餐层级。

这样做的理由很直接:OPcache让客户网站更快,同时降低服务器CPU负载。服务器整体CPU压力的降低意味着同一台机器上所有网站都有更多资源应对流量高峰。全局启用OPcache对客户和服务器两侧都是双赢。

对AsiaGB客户而言:您的网站从主机账户开通的第一刻起就在使用OPcache。您部署在AsiaGB共享主机上的WordPress、Laravel、CodeIgniter或任何PHP应用,都在OPcache的加持下运行。如有需要,可通过DirectAdmin或 .user.ini 文件覆盖特定参数,针对您的工作负载进行精细调优。

AsiaGB在系统级配置的参数

AsiaGB将核心OPcache参数预先配置为适合共享主机环境的值。客户可以通过DirectAdmin或 .user.ini 文件覆盖账户级别的设置。您可能希望自定义的参数:

如何验证OPcache正在您的网站上运行

方法一:phpinfo()

在网站根目录创建 info.php 文件,内容如下:

<?php phpinfo();

在浏览器中打开,按Ctrl+F搜索 "Zend OPcache"。如果找到该部分且 opcache.enable 显示为 On,则OPcache正在运行。查看"Cached scripts"数值了解已缓存了多少文件。

重要提示:检查完毕后立即删除 info.php 文件。该文件会暴露服务器配置和PHP版本详情,可能被攻击者利用。

方法二:PHP代码检查

<?php
if (function_exists('opcache_get_status')) {
    $s = opcache_get_status();
    echo "OPcache已启用: " . ($s['opcache_enabled'] ? '是' : '否') . "\n";
    echo "已缓存文件数: " . $s['opcache_statistics']['num_cached_scripts'] . "\n";
    echo "命中率: " . round($s['opcache_statistics']['opcache_hit_rate'], 2) . "%\n";
    echo "已用内存: " . round($s['memory_usage']['used_memory'] / 1048576, 2) . " MB\n";
    echo "剩余内存: " . round($s['memory_usage']['free_memory'] / 1048576, 2) . " MB\n";
} else {
    echo "OPcache不可用";
}

方法三:WordPress插件

LiteSpeed Cache、W3 Total Cache 或 Query Monitor 等插件可在WordPress后台显示OPcache状态,并提供一键清除缓存的按钮,无需编写任何代码。

方法四:DirectAdmin控制面板

登录DirectAdmin › 选择PHP版本 › 查看扩展列表。如果您网站使用的PHP版本旁边 opcache 有勾选标记,则表示已为您的账户启用。

针对不同场景的OPcache调优方案

最佳配置因应用而异,以下是常见场景的推荐配置:

标准WordPress站点

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1

WordPress + WooCommerce 或插件密集型大型站点

opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.revalidate_freq=120
opcache.validate_timestamps=1
opcache.interned_strings_buffer=32
opcache.max_wasted_percentage=5

Laravel / Symfony 稳定生产环境

opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.interned_strings_buffer=32
opcache.save_comments=1

重要:设置 validate_timestamps=0 意味着OPcache永远不会检查源文件是否更改。每次部署代码后,您必须手动清除OPcache(例如运行 php artisan opcache:clear 或调用 opcache_reset()),否则PHP将继续执行旧的编译版本。

配置项作用建议值
opcache.enable总开关生产环境始终为1
memory_consumption分配给Opcode存储的RAM(MB)普通站点128,WooCommerce/Laravel用256
max_accelerated_filesOPcache可缓存的最大文件数普通10000;插件密集型WordPress可增大
revalidate_freq检查文件变更的间隔秒数开发中60秒;稳定生产可设0
validate_timestamps是否检查文件修改时间开发中1;稳定生产0以获最高速度
interned_strings_buffer去重字符串存储的RAM(MB)普通16,大型代码库32
save_comments是否在缓存中保留PHP注释使用Doctrine注解或PHP属性时必须为1

PHP 8.0+ 的JIT编译器:更进一步的性能提升

PHP 8.0引入了 JIT(即时编译器),它在OPcache基础上进一步提升性能。核心区别在于:

启用JIT(PHP 8.0+):

opcache.jit=on
opcache.jit_buffer_size=64M

JIT对CPU密集型工作负载效果最显著:图像处理、数学计算、数据转换脚本和CLI应用。对于典型的以数据库为瓶颈的Web CRUD应用,JIT带来的提升通常不明显。建议在生产环境启用前对您的具体应用进行基准测试。

AsiaGB支持PHP 8.0至8.3,所有共享主机套餐均可使用,均支持JIT。您可以通过DirectAdmin随时切换PHP版本和调整JIT设置。如需帮助,请联系客服支持。

在DirectAdmin上覆盖OPcache设置

  1. 登录DirectAdmin — 通常地址为 yourdomain.com:2222。
  2. 打开"选择PHP版本" — 在控制面板的高级功能或扩展功能区域中找到此选项。
  3. 确认OPcache已启用 — 在扩展选项卡中,opcache 应已有勾选标记(AsiaGB默认已启用)。
  4. 打开PHP选项/设置 — 点击选项或设置选项卡,访问账户级别的PHP ini覆盖配置。
  5. 设置参数并保存 — 更改立即对新的PHP请求生效。

备选方案:.user.ini文件 — 在 public_html 目录创建 .user.ini 文件,写入您的OPcache配置。PHP会在数分钟内自动读取。此方法适合通过版本控制系统部署配置变更。

何时以及如何清除OPcache

需要手动清除的场景

清除OPcache的方法

方法命令/步骤适用场景
PHP函数opcache_reset();(在受保护的脚本中调用)部署脚本、CLI自动化
WordPress插件LiteSpeed Cache › 清除OPcache按钮不熟悉代码的WordPress管理员
SSH(如可用)php -r "opcache_reset();"有SSH访问权限的开发者
重启PHP-FPMDirectAdmin › 重启服务紧急情况下的完全重置
自动(通过时间戳)validate_timestamps=1 + revalidate_freq=60频繁更新且可接受60秒延迟的站点

监控OPcache健康状态

在生产环境中,关注两个OPcache指标可以判断缓存是否正常运行:

1. 内存使用率

如果已用内存超过 memory_consumption 设定值的约80%,OPcache会开始频繁淘汰已缓存的文件,迫使PHP重新编译。通过 opcache_get_status() 检查,如果内存持续占满,请增大 memory_consumption。

2. 缓存命中率

健康的命中率应在90%以上。低于此阈值说明文件被淘汰过于频繁。解决方案是增加内存,或减小 max_accelerated_files,使缓存保持在预算范围内。

<?php
$s = opcache_get_status();
$stats = $s['opcache_statistics'];
echo "命中率: " . round($stats['opcache_hit_rate'], 2) . "%\n";
echo "已缓存文件: " . $stats['num_cached_scripts'] . "\n";
echo "已用内存: " . round($s['memory_usage']['used_memory']/1048576, 1) . " MB\n";
echo "剩余内存: " . round($s['memory_usage']['free_memory']/1048576, 1) . " MB\n";

OPcache与其他缓存层:各司其职,相辅相成

缓存类型缓存内容加速的环节示例
OPcachePHP编译字节码(Opcode)PHP代码执行速度Zend OPcache(内置)
对象缓存数据库查询结果、计算值减少数据库访问次数Redis、Memcached
页面缓存完整渲染的HTML页面完全绕过PHP(最快)LiteSpeed Cache、W3 Total Cache
CDN / 边缘缓存静态资源(CSS、JS、图片)通过靠近用户的边缘节点降低延迟Cloudflare、BunnyCDN
浏览器缓存客户端设备上的静态资源避免重复下载Cache-Control响应头

WordPress性能优化的理想技术栈是五层叠加:OPcache(PHP执行加速)→ 对象缓存Redis(减少数据库查询)→ 页面缓存(提供预构建HTML)→ CDN(静态资源分发)→ 浏览器缓存头。OPcache是最先应该启用的层,因为它是免费的、对绝大多数站点没有副作用,并且在AsiaGB所有服务器上已默认激活。

PHP OPcache:PHP 7.4 与 PHP 8.x 的区别

功能PHP 7.4PHP 8.0+
核心OPcache支持,功能完整支持,功能完整
JIT编译器不支持支持(opcache.jit)
预加载(Preloading)支持(opcache.preload)支持,有所改进
fast_shutdown需手动设为1自动启用
安全支持已于2022年11月结束PHP 8.3支持至2026年11月;PHP 8.2支持至2025年12月

AsiaGB建议所有新项目使用 PHP 8.1或更高版本。它比PHP 7.x更快,安全支持期更长,并解锁了JIT等PHP 8系列的众多改进。您可以随时通过DirectAdmin切换PHP版本,不会影响网站文件。

常见问题解答

AsiaGB会自动开启OPcache吗?

是的。AsiaGB在所有共享主机套餐的每台服务器上默认启用PHP OPcache,客户无需手动开启也无需额外付费。服务器已在系统级预先配置好OPcache,客户可随时通过DirectAdmin进一步自定义设置。

需要root权限才能配置OPcache吗?

不需要。在DirectAdmin上可以通过PHP版本选择界面或在网站根目录添加 .user.ini 文件来调整OPcache设置,无需root或SSH访问权限。

OPcache和Redis有什么区别?

OPcache缓存已编译的PHP字节码,加速代码执行层面。Redis是对象缓存,存储数据库查询结果以减少MySQL访问次数。两者工作在不同层面,可以同时使用,互为补充而非替代关系。

开启OPcache后网站还是很慢怎么办?

OPcache只加速PHP代码执行。如果网站慢是因为数据库查询缺少索引、外部API调用延迟、图片未优化或JavaScript体积过大,需要在各自的层面分别解决,OPcache对这些问题无能为力。

修改了PHP文件但网站没有更新?

OPcache仍在提供旧的编译版本。可以等待 revalidate_freq 窗口过期,调用 opcache_reset(),或通过缓存插件清除。开发期间建议设置 validate_timestamps=1 并将 revalidate_freq 降低到较小的值(如2秒)。

OPcache会占用更多内存吗?

会的。OPcache会预留一块共享内存(通常通过 memory_consumption 设为128MB)。AsiaGB共享主机服务器在规划时已将OPcache内存需求纳入考量,因此不会计入您的账户存储配额,也不会影响您网站的正常内存限制。

什么是PHP JIT?AsiaGB支持吗?

JIT是PHP 8.0+引入的即时编译器,将频繁执行的Opcode直接编译为原生机器码,CPU无需解释器层即可直接执行,对CPU密集型任务效果显著。AsiaGB支持PHP 8.0至8.3,所有版本均包含JIT,可通过DirectAdmin PHP设置或 .user.ini 启用。

每台服务器均默认开启OPcache的共享主机

AsiaGB共享主机从开通第一天起即在所有服务器上启用PHP OPcache,无需额外配置。支持PHP 8.x、SSD存储、99%正常运行时间、DirectAdmin控制面板,以及每天可用的泰语客服支持。

查看主机套餐

查看泰国虚拟主机全部套餐 →