FrankenPHP官方镜像已预装OPcache但需手动启用:取消php.ini中opcache.enable=1注释,确保zend_extension=opcache.so未注释,配置合理参数后重启容器即可生效。

FrankenPHP 官方镜像(dunglas/frankenphp)默认已预装 opcache.so,但不会自动启用。你不需要手动编译或用 pecl install,只需两步:确认启用 + 合理配置。
✅ 确认容器使用的是官方镜像
运行以下命令检查是否为 dunglas/frankenphp:
docker inspect your-frankenphp-container | grep "dunglas/frankenphp"
如果没找到,说明你用的是自建镜像(如 scratch、alpine 或 static-builder),这类镜像不带 install-php-extensions 工具,也无法直接启用 OPcache —— 必须换回官方镜像或在构建阶段静态安装。
? 启用并配置 OPcache
进入容器:
立即学习“PHP免费学习笔记(深入)”;
docker exec -it your-frankenphp-container bash
FrankenPHP 默认加载 /usr/local/etc/php/php.ini(即 php.ini-production),该文件中 opcache.enable=1 是被注释的。你需要:
- 取消
;opcache.enable=1的注释 - 确保
zend_extension=opcache.so行未被注释,且位于[opcache]段落之前 - 推荐追加或修改以下关键参数(写在
[opcache]区块内):
[opcache] opcache.enable=1 opcache.memory_consumption=384 opcache.max_accelerated_files=20000 opcache.interned_strings_buffer=16 opcache.validate_timestamps=0 opcache.revalidate_freq=0 opcache.fast_shutdown=1 opcache.enable_cli=1
⚠️ 注意:
opcache.revalidate_freq=0仅在opcache.validate_timestamps=1下生效;设为0且validate_timestamps=0时,该参数无效 —— 所以这里明确设validate_timestamps=0,表示“不检查文件时间戳”,靠发布后调用opcache_reset()刷新。
? 应用配置并验证
保存 php.ini 后,重启容器(不是 reload):
docker restart your-frankenphp-container
验证是否生效:
-
进入容器执行:
php -r "var_dump(opcache_get_status()['opcache_statistics']['oom_count'] === 0);"
返回
bool(true)且oom_count为0,说明内存充足、缓存正常。 -
或访问
phpinfo()页面,确认:- “Opcode Caching” 显示 Enabled
- “Cache hits” 随请求持续增长
? 多阶段构建中静态启用(仅限 static-builder)
若你用 dunglas/frankenphp:static-builder-musl 构建生产镜像:
FROM dunglas/frankenphp:static-builder-musl COPY . /app/public RUN docker-php-ext-install opcache pdo_mysql mbstring
⚠️ 此场景下不能用 pecl 或 install-php-extensions,docker-php-ext-install 是唯一可靠方式。
FrankenPHP 的 worker 模式依赖 OPcache 常驻加速,不启用或配置过小会导致性能断崖下跌。只要用对镜像、改对配置、重启到位,这件事并不复杂,但容易忽略注释和路径细节。



















