php - 我可以在使用预加载时运行多个 Symfony 应用程序吗?

标签 php symfony preload php-7.4

我在不同的子域上安装了 2 个独立的 Symfony。
但是,当我尝试访问第二个域时,它显示:

Fatal error: Cannot redeclare Symfony\Component\String\u() (previously declared in /var/www/public_api/releases/20200904200316/vendor/symfony/string/Resources/functions.php:14) in /var/www/public_test_api/releases/20200909003532/vendor/symfony/string/Resources/functions.php on line 14

注意,冲突是在不同的目录之间,相互之间没有任何关系。

这是缓存问题吗?我该如何解决这个问题?我试图为第二次安装禁用 OPCache,但它没有改变任何东西。 APCu 也已启用。

我也遇到了同样使用 Symfony 的第 3 方软件的问题。

禁用 opcache.preload 设置似乎可以解决这个问题。

有没有办法在同一台服务器上运行所有这些应用程序并从预加载中受益?

最佳答案

您不能对在同一服务器中多次使用的类使用预加载。

预加载通过读取opcache.preload 中指定的文件,将相关定义保存在内存中。如果您预加载一个 Symfony 实例,然后尝试加载另一个 Symfony 实例,您将遇到定义冲突(因为它正在发生在您身上)。

在实践中,为了能够从预加载中获益,您需要拥有隔离的“专用”服务器,即使这些服务器不是物理机器而是虚拟机或容器也是如此。

original RFC for this feature 中所述:

[...] this approach will not be compatible with servers that host multiple applications, or multiple versions of applications - that would have different implementations for certain classes with the same name - if such classes are preloaded from the codebase of one app, it will conflict with loading the different class implementation from the other app(s).


TLDR;您不能在同一台服务器上为同一类的多个实例使用预加载。您必须关闭预加载,或者将每个应用程序移动到它们自己的专用容器中,这样它们就不会共享 PHP-FPM 进程。

关于php - 我可以在使用预加载时运行多个 Symfony 应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63802687/

相关文章:

jQuery、CSS - 页面加载后何时使用 addClass 函数

php - Wordpress:编辑帖子,99% CPU?

php - Bitmex API (PHP),取消一个订单不起作用

Symfony2 : Handling form submissions

php - Symfony 3.1.5 警告:SessionHandler::read(): session 数据文件不是由您的 uid 创建的

javascript - Rails - Turbo - 链接预加载但在窗口加载事件后几秒钟内未使用

javascript - ionic 3 : How to preload tabs?

PHP 以数组形式读取特定的 csv 文件列

php - 回显 SELECT 语句中的变量

php - Sulu CMS GET-请求错误