opcache.enable
类型: boolean
默认值: 1
说明: 是否启用 OPcache 扩展
opcache.enable=1 ; 启用
opcache.enable=0 ; 禁用
opcache.enable_cli
类型: boolean
默认值: 0
说明: 是否在 CLI 模式下启用 OPcache
opcache.enable_cli=0 ; CLI 模式禁用(默认)
opcache.enable_cli=1 ; CLI 模式启用
opcache.memory_consumption
类型: integer (MB)
默认值: 128
说明: OPcache 共享内存大小
opcache.memory_consumption=128 ; 128MB(默认)
opcache.memory_consumption=256 ; 256MB(推荐生产环境)
opcache.memory_consumption=512 ; 512MB(大型应用)
计算方式:
所需内存 ≈ (项目文件数 × 平均文件大小 × 1.5) / 1024 / 1024
Laravel 项目: 128-256 MB
检查方法:
$status = opcache_get_status();
echo "已使用: " . $status['memory_usage']['used_memory'] . "\n";
echo "可用: " . $status['memory_usage']['free_memory'] . "\n";
echo "浪费: " . $status['memory_usage']['wasted_memory'] . "\n";
如果 cache_full 为 true,需要增加此值
内存不足会导致缓存失效,性能下降
opcache.interned_strings_buffer
类型: integer (MB)
默认值: 8
说明: 字符串驻留(interned strings)缓存大小
opcache.interned_strings_buffer=8 ; 8MB(默认)
opcache.interned_strings_buffer=16 ; 16MB(推荐)
opcache.interned_strings_buffer=32 ; 32MB(大型应用)
PHP 8.0+ 优化了字符串处理
缓存重复字符串,减少内存占用
通常设置为 memory_consumption 的 10-20%
opcache.max_accelerated_files
类型: integer
默认值: 10000
说明: 最大可缓存文件数量
opcache.max_accelerated_files=10000 ; 默认
opcache.max_accelerated_files=20000 ; 推荐
opcache.max_accelerated_files=50000 ; 大型项目
# 统计项目 PHP 文件数
find . -name "*.php" | wc -l
# 建议设置为实际文件数的 1.5-2 倍
# 必须是质数,OPcache 会自动调整为最近的质数
opcache.validate_timestamps
类型: boolean
默认值: 1
说明: 是否验证文件时间戳
opcache.validate_timestamps=1 ; 每次请求检查文件是否更新(开发环境)
opcache.validate_timestamps=0 ; 不检查,需要手动重置缓存(生产环境)
使用场景:
- 开发环境: 1 - 代码修改后立即生效
- 生产环境: 0 - 最佳性能,部署后需重置缓存
性能影响:
- 0: 最佳性能,无文件系统检查开销
- 1: 每次请求检查文件修改时间,有性能损耗
重置缓存方法:
php -r "opcache_reset();" # 命令行
sudo service php8.3-fpm reload # 重启 PHP-FPM
opcache.revalidate_freq
类型: integer (秒)
默认值: 2
说明: 重新验证文件的时间间隔(仅在 validate_timestamps=1 时有效)
opcache.revalidate_freq=0 ; 每次都检查(开发环境)
opcache.revalidate_freq=2 ; 每 2 秒检查一次(默认)
opcache.revalidate_freq=60 ; 每 60 秒检查一次(测试环境)
opcache.max_life_time
类型: integer (秒)
默认值: 3600
说明: 缓存脚本的最大生存时间
opcache.max_life_time=3600 ; 1 小时(默认)
opcache.max_life_time=7200 ; 2 小时
opcache.max_life_time=0 ; 无限制
opcache.fast_shutdown
类型: boolean
默认值: 0
说明: 快速关闭机制(PHP 7.2+)
opcache.fast_shutdown=1 ; 启用(推荐)
opcache.fast_shutdown=0 ; 禁用
启用后可以更快地清理缓存
对性能有轻微提升
opcache.save_comments
类型: boolean
默认值: 1
说明: 是否保存注释和文档块
opcache.save_comments=1 ; 保存(默认,推荐)保留注释,支持反射、注解等功能
opcache.save_comments=0 ; 不保存
opcache.validate_permission
类型: boolean
默认值: 0
说明: 是否验证文件权限
opcache.validate_permission=0 ; 不验证(默认)
opcache.validate_permission=1 ; 验证权限
opcache.optimization_level
类型: integer (位掩码)
默认值: 0x7FFFBFFF
说明: 优化级别(位标志组合)
opcache.optimization_level=0x7FFFBFFF ; 全部优化(推荐)
opcache.optimization_level=0x7FFFFFFF ; 最大优化(PHP 8.0+)
优化标志:
* 0x0001: 常量折叠
* 0x0002: 死代码消除
* 0x0004: 函数调用优化
* 0x0008: 循环优化
* 0x0010: 分支预测
* 0x0020: 内联函数
* 0x0040: 类型推断
* 0x0080: 空值优化
* 0x0100: 数组优化
* 0x0200: 字符串优化
* 0x0400: 类型推断增强
* 0x0800: 常量传播
* 0x1000: 无用代码消除
* 0x2000: 循环展开
* 0x4000: 函数内联
* 0x7FFFBFFF: 所有优化(PHP 7.x)
* 0x7FFFFFFF: 所有优化(PHP 8.0+)
opcache.dups_fix
类型: boolean
默认值: 0
说明: 修复重复文件问题,仅在遇到 "duplicate function" 错误时启用
opcache.dups_fix=0 ; 禁用(默认)
opcache.dups_fix=1 ; 启用
opcache.consistency_checks
类型: integer
默认值: 0
说明: 一致性检查频率
opcache.consistency_checks=0 ; 不检查(默认,推荐)
opcache.consistency_checks=1 ; 每次请求检查
opcache.consistency_checks=10 ; 每 10 次请求检查
生产环境建议 0
opcache.preload
类型: string (文件路径)
默认值: ""
说明: 预加载脚本路径(PHP 7.4+)
opcache.preload=/var/www/html/preload.php
预加载脚本示例 (preload.php):
<?php
// 预加载常用类文件
if (function_exists('opcache_compile_file')) {
$files = [
__DIR__ . '/vendor/autoload.php',
__DIR__ . '/vendor/laravel/framework/src/Illuminate/Foundation/Application.php',
// 添加更多常用文件
];
foreach ($files as $file) {
if (file_exists($file)) {
opcache_compile_file($file);
}
}
}
opcache.preload_user
类型: string
默认值: ""
说明: 预加载脚本运行的用户
opcache.preload_user=www-data
opcache.file_cache
类型: string (目录路径)
默认值: ""
说明: 文件缓存目录(PHP 7.0+)
opcache.file_cache=/tmp/opcache
说明:
- 将编译后的字节码保存到文件系统
- 重启后可以快速恢复缓存
- 适合容器化环境
优势:
- 容器重启后缓存不丢失
- 多个 PHP 进程共享缓存
- 减少内存占用
注意事项:
- 需要确保目录可写
- 需要定期清理旧缓存文件
opcache.file_cache_only
类型: boolean
默认值: 0
说明: 仅使用文件缓存(不使用共享内存)
opcache.file_cache_only=0 ; 同时使用内存和文件缓存(推荐)
opcache.file_cache_only=1 ; 仅使用文件缓存
opcache.file_cache_consistency_checks
类型: boolean
默认值: 1
说明: 文件缓存一致性检查
opcache.file_cache_consistency_checks=1 ; 检查(默认)
opcache.file_cache_consistency_checks=0 ; 不检查(性能更好)
opcache.file_cache_fallback
类型: boolean
默认值: 1 (PHP 7.1+)
说明: 共享内存失败时是否回退到文件缓存
opcache.file_cache_fallback=1 ; 启用回退(推荐)
opcache.file_cache_fallback=0 ; 禁用回退
常用脚本
检查 OPcache 状态
<?php
if (!function_exists('opcache_get_status')) {
die("OPcache 未启用\n");
}
$status = opcache_get_status();
echo "=== OPcache 状态 ===\n";
echo "启用状态: " . ($status['opcache_enabled'] ? '是' : '否') . "\n";
echo "缓存已满: " . ($status['cache_full'] ? '是' : '否') . "\n\n";
echo "=== 内存使用 ===\n";
$mem = $status['memory_usage'];
echo "已使用: " . round($mem['used_memory'] / 1024 / 1024, 2) . " MB\n";
echo "可用: " . round($mem['free_memory'] / 1024 / 1024, 2) . " MB\n";
echo "浪费: " . round($mem['wasted_memory'] / 1024 / 1024, 2) . " MB\n";
echo "使用率: " . round($mem['used_memory_percentage'], 2) . "%\n\n";
echo "=== 统计信息 ===\n";
$stats = $status['opcache_statistics'];
echo "命中次数: " . number_format($stats['opcache_hits']) . "\n";
echo "未命中次数: " . number_format($stats['opcache_misses']) . "\n";
$hitRate = $stats['opcache_hit_rate'];
echo "命中率: " . round($hitRate, 2) . "%\n";
echo "缓存脚本数: " . $stats['num_cached_scripts'] . "\n";
echo "缓存键数: " . $stats['num_cached_keys'] . "\n";
echo "最大缓存键数: " . $stats['max_cached_keys'] . "\n";
重置 OPcache
<?php
if (function_exists('opcache_reset')) {
opcache_reset();
echo "OPcache 已重置\n";
} else {
echo "OPcache 未启用\n";
}