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