php.ini中必须显式覆盖的4个参数是:memory_limit设为256M、error_reporting设为E_ALL & ~E_DEPRECATED & ~E_STRICT、log_errors=On且error_log指向具体文件路径、date.timezone设为Asia/Shanghai,否则将导致OOM、日志丢失、时区漂移等静默故障。

独立PHP环境搭好不等于能稳定跑业务——很多看似“能用”的环境,上线后很快出现内存溢出、日志无声、时区错乱或扩展缺失导致支付验签失败等问题。关键不是装完,而是把几个核心配置项补全、对齐、压稳。
php.ini 中必须显式覆盖的 4 个参数
默认 php.ini 往往沿用开发机配置,生产级独立环境需强制校准:
-
memory_limit至少设为256M(CLI 模式下定时任务常因数组膨胀触发 OOM) -
error_reporting设为E_ALL & ~E_DEPRECATED & ~E_STRICT,避免低版本兼容警告干扰日志 -
log_errors必须为On,且error_log显式指向文件路径(如/var/log/php-cli-error.log),不能依赖stderr—— 容器里 stdout/stderr 会被截断或轮转丢失 -
date.timezone必须设为具体值(如Asia/Shanghai),否则date()、strtotime()、Cron 执行时间都会漂移
Docker 环境下 PHP CLI 的时区与 locale 同步
仅改 php.ini 不够:Alpine 镜像默认无时区数据,date 命令和 strftime() 仍可能返回 UTC。需在 Dockerfile 中补两步:
- 安装 tzdata:
RUN apk add --no-cache tzdata - 复制时区文件并设置环境变量:
ENV TZ=Asia/Shanghai && ln -sf /usr/share/zoneinfo/$TZ /etc/localtime - 若脚本涉及中文文件名或
iconv(),还需加RUN apk add --no-cache icu-data-full并启用intl扩展
CLI 模式下 opcache 和 realpath_cache 的取舍
Web 环境开 opcache 是常识,但 CLI 下要谨慎:
立即学习“PHP免费学习笔记(深入)”;
-
opcache.enable_cli=1可开启,但必须配opcache.validate_timestamps=1(否则脚本更新后不生效) -
realpath_cache_size建议调大到4096K,尤其当项目含大量require或 Composer 自动加载时,否则频繁 stat 路径会拖慢启动 - 注意:Alpine 镜像中
opcache.file_cache默认关闭,若需持久化缓存,得手动挂载目录并赋权
PHP-FPM 容器外独立 CLI 环境的扩展一致性检查
很多团队 Web 用 FPM、定时任务用 CLI,结果发现 CLI 缺 pdo_mysql 或 curl —— 因为 Dockerfile 里只给 FPM 层装了扩展。验证方法很简单:
- 进容器执行:
php -m | grep -E 'pdo|curl|mbstring|json' - 对比 Web 端
phpinfo()输出的扩展列表,确保 CLI 和 FPM 加载的 .so 文件路径一致(如都在/usr/local/lib/php/extensions/no-debug-non-zts-20220829/) - 特别注意
openssl:支付回调验签失败,90% 是 CLI 下没启用该扩展,而非证书路径问题
最易被跳过的其实是错误日志落盘路径和时区双校验——它们不出错时不显眼,一出就是静默失败,查三天才发现 date('Y-m-d') 返回的是伦敦时间,或者 error_log 写进了被 volume 挂载覆盖掉的临时层。



















