我正在嘗試在 Platform.sh 的 PHP8 上運行的 Symfony 5.4 上設定 Opcache 預加載,并遇到致命錯誤。
配置
必要的部分包括:
// platform.app.yaml
...
variables
php
'opcache.preload': 'var/cache/prod/App_KernelProdContainer.php'
...
hooks:
build: |
...
composer dump-autoload --no-dev --classmap-authoritative
deploy: |
...
sv restart app
...
我可以驗證App_KernelProdContainer.php檔案是在上面配置中定義的正確位置創建的:
<?php
// This file has been auto-generated by the Symfony Dependency Injection Component for internal use.
if (\class_exists(\ContainerF9HiXre\App_KernelProdContainer::class, false)) {
// no-op
} elseif (!include __DIR__.'/ContainerF9HiXre/App_KernelProdContainer.php') {
touch(__DIR__.'/ContainerF9HiXre.legacy');
return;
}
if (!\class_exists(App_KernelProdContainer::class, false)) {
\class_alias(\ContainerF9HiXre\App_KernelProdContainer::class, App_KernelProdContainer::class, false);
}
return new \ContainerF9HiXre\App_KernelProdContainer([
'container.build_hash' => 'F9HiXre',
'container.build_id' => '98091d49',
'container.build_time' => 1644501054,
], __DIR__.\DIRECTORY_SEPARATOR.'ContainerF9HiXre');
包含的檔案ContainerF9HiXre/App_KernelProdContainer.php會在使用陳述句上引發錯誤,如下所示:
Fatal error: Uncaught Error: Class "Symfony\Component\DependencyInjection\Container" not found in /app/var/cache/prod/ContainerF9HiXre/App_KernelProdContainer.php:17
Stack trace:
#0 /app/var/cache/prod/App_KernelProdContainer.php(7): include()
#1 {main}
thrown in /app/var/cache/prod/ContainerF9HiXre/App_KernelProdContainer.php on line 17
包含檔案中的使用陳述句如下所示:
namespace ContainerF9HiXre;
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
uj5u.com熱心網友回復:
您似乎使用了錯誤的檔案進行預加載。
生成的檔案名為srcApp_KernelProdContainer.preload.php. 但無論如何,您可能不應該將此檔案直接添加到 .Symfonyopcache.preload生成的config/preload.php.
由于在 platform.sh 上,路徑是相對于專案 root 決議的,因此您可以使用這樣的相對路徑:
opcache.preload=config/preload.php
如果您沒有此檔案(例如,不完整的食譜),您可以簡單地通過運行重新生成它composer recipes:update symfony/framework-bundle,如此處所述。
或者,如果你沒有使用 Symfony Flex 并且想要手動完成,你可以簡單地從適當的配方中復制檔案,就像這個。
無論如何,這是一個非常簡單的腳本:
<?php
if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) {
require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425505.html
上一篇:要使用Doctrine物體屬性,您需要PHP8、doctrine/orm2.9、doctrine/doctrine-bundle2.4和symfony/framework-bundle5.2
下一篇:prod環境中未捕獲500個錯誤
