Opcache 预加载和缺少 App_KernelProdContainer.preload.php

Posted

技术标签:

【中文标题】Opcache 预加载和缺少 App_KernelProdContainer.preload.php【英文标题】:Opcache preloading and missing App_KernelProdContainer.preload.php 【发布时间】:2021-11-11 10:50:29 【问题描述】:

按照文档操作后,我的新 OPCache 设置是这样的:

opcache.preload_user=www-data
opcache.preload=/var/www/vhosts/.../httpdocs/.../var/cache/prod/App_KernelProdContainer.preload.php
opcache.memory_consumption=1024
opcache.interned_strings_buffer=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0

默认情况下,var/cache/prod 文件夹内有一个名为 srcApp_KernelProdContainer.preload.php 的文件。

删除 /cache 文件夹并重新启动 PHP-FPM 后,App_KernelProdContainer.preload.php 未创建。

我应该将 App_KernelProdContainer.preload.php 重命名为 srcApp_KernelProdContainer.preload.php 还是我遗漏了什么?

【问题讨论】:

【参考方案1】:

不,您不应该将此文件直接添加到您的 PHP 设置中,因为您发现它会使整个事情变得非常脆弱。你也不应该重命名它或任何东西,因为它是自动生成的。

Symfony 在后面的版本中所做的是创建一个“预加载”文件。

Symfony 4 flex 配方包括this one。

<?php

if (file_exists(dirname(__DIR__).'/var/cache/prod/srcApp_KernelProdContainer.preload.php')) 
    require dirname(__DIR__).'/var/cache/prod/srcApp_KernelProdContainer.preload.php';


if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) 
    require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php';

在 Symfony 5.1+ 上,你有一些东西 like this。

请注意,此文件有条件地需要预加载脚本。这样,如果它不存在,它不会只是杀死 PHP 解释器。

如果您目前没有此文件;您可以手动创建它,也可以从配方中复制它。

文件添加到php.ini 上的opcache.preload 设置中,而不是直接在生成的预加载脚本中。

【讨论】:

感谢您的快速回答,Symfony 4 会按照您的说明自动生成 preload 文件。所以,我刚刚删除了opcache.preload=/var/www/vhosts/.../httpdocs/.../var/cache/prod/App_KernelProdContainer.preload.php,因为它是在var\cache\prod 中自动创建的。但我不明白您最后添加的行:将此文件添加到 php.ini 上的 opcache.preload 设置,而不是直接生成的预加载脚本 opcache.preload 选项应指向preload.php 文件。 opcache.preload="/path/to/preload.php.

以上是关于Opcache 预加载和缺少 App_KernelProdContainer.preload.php的主要内容,如果未能解决你的问题,请参考以下文章

PHP开发要点与技巧总结

PHP优化加速之Opcache使用总结(转载)

PHP脚本预解析

最近开始研究php的缓存技术,来个系统自带的OPcache

细说opcache

PHP安装使用Zend Opcache扩展