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

Can I run multiple Symfony applications while using preloading?

我在不同的子域上安装了 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 进程。