【发布时间】:2021-10-09 15:10:09
【问题描述】:
在我的 Symfony/Sonata 应用程序的 php.ini 文件中,我将 opcache.blacklist_filename 设置为 /usr/src/app/config/opcache-exclude.txt。在我的测试服务器上的phpinfo() 调用中,该文件显示在正确的位置。这是文件的内容:
/usr/src/app/vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php
/usr/src/app/vendor/sonata-project/admin-bundle/src/SonataAdminBundle.php
/usr/src/app/vendor/symfony/security-core/Authorization/TraceableAccessDecisionManager.php
/usr/src/app/vendor/sonata-project/admin-bundle/src/*/*.php
/usr/src/app/vendor/sonata-project/admin-bundle/src/*/*/*.php
/usr/src/app/vendor/sonata-project/core-bundle/src/CoreBundle/SonataCoreBundle.php
/usr/src/app/vendor/sonata-project/core-bundle/src/*/*.php
/usr/src/app/vendor/sonata-project/core-bundle/src/*/*/*.php
/usr/src/app/vendor/symfony/security-core/Authorization/*
但是,当我加载我的 Sonata 应用程序时,我仍然收到此错误,这与未使用黑名单时出现的错误相同:
致命错误:无法重新声明 twig_truncate_filter()(之前在 vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php:38 中声明)
我是否在排除文件中使用了错误的格式?如何解决此问题,以免文件内容被忽略?
====
更新#1:当我将黑名单文件的内容简化为:
/usr/src/app/vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php
/usr/src/app/vendor/sonata-project/admin-bundle/src/SonataAdminBundle.php
/usr/src/app/vendor/symfony/security-core/Authorization/TraceableAccessDecisionManager.php
...我仍然遇到基本相同的错误:
编译错误:无法声明类 Twig_Extensions_Extension_Text, 因为该名称已在 Text.php 第 15 行中使用
(是的,这在技术上是一个不同的错误,但它本质上说的是同一件事:Text.php 的内容已经在 opcache 中声明,不能重新声明。)
====
更新 #2:运行 php -v 将 7.4.19 显示为版本。这是我使用 composer info 时显示的一些版本信息:
树枝/额外捆绑 v3.3.1
树枝/树枝 v2.12.2
运行 composer why twig/twig 显示此输出:
app-insights-php/app-insights-php-bundle 0.2.5 requires twig/twig (^1.2|^2)
friendsofsymfony/user-bundle v2.1.2 requires twig/twig (^1.28 || ^2.0)
sonata-project/admin-bundle 3.55.0 requires twig/twig (^2.10)
sonata-project/block-bundle 3.18.2 requires twig/twig (^1.34 || ^2.0)
sonata-project/core-bundle 3.17.2 requires twig/twig (^1.34 || ^2.0)
sonata-project/formatter-bundle 4.1.3 requires twig/twig (^2.4)
sonata-project/media-bundle 3.21.0 requires twig/twig (^2.10)
sonata-project/page-bundle 3.13.0 requires twig/twig (^2.10)
sonata-project/seo-bundle 2.9.0 requires twig/twig (^1.40 || ^2.9 || ^3.0)
sonata-project/translation-bundle 2.5.0 requires twig/twig (^2.12)
sonata-project/user-bundle 5.x-dev requires twig/twig (^2.9)
symfony-cmf/routing-bundle 2.1.1 requires twig/twig (^1.35 || ^2.4.4)
symfony/twig-bridge v4.4.16 requires twig/twig (^1.41|^2.10|^3.0)
symfony/twig-bundle v4.4.16 requires twig/twig (^1.41|^2.10|^3.0)
symfony/web-profiler-bundle v4.4.16 requires twig/twig (^1.41|^2.10|^3.0)
twig/extensions v1.5.4 requires twig/twig (^1.27|^2.0)
twig/extra-bundle v3.3.1 requires twig/twig (^2.4|^3.0)
====
编辑#3:除了在许多 Symfony 应用程序中发现的普通自动加载器和配置加载器之外,在这个应用程序中没有使用 include_once() 或 require_once()。关闭 opcache 后,此问题就会消失。所以肯定和opcaching有关。
====
编辑 #4:这是我的 composer.json 文件。
{
"type": "project",
"license": "proprietary",
"name": "exozet/oesterreich-werbung-cms",
"description": "the new cms for Österreich Werbung based on symfony with sonata",
"require": {
"php": "^7.1.3",
"ext-ctype": "*",
"ext-curl": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-simplexml": "*",
"ext-zip": "*",
"ext-zend-opcache": "*",
"app-insights-php/app-insights-php-bundle": "^0.2.5",
"app-insights-php/doctrine-dependency-logger": "^0.2.0",
"cocur/slugify": "^3.2",
"dracoblue/craur": "^2.1",
"elao/enum": "^1.7",
"friendsofsymfony/elastica-bundle": "^5.1",
"friendsofsymfony/rest-bundle": "^2.5",
"friendsofsymfony/user-bundle": "^2.0",
"galbar/jsonpath": "^1.0",
"guzzlehttp/guzzle": "6.3.3",
"jms/serializer-bundle": "3.8.0",
"knplabs/knp-gaufrette-bundle": "^0.6.1",
"knplabs/knp-menu-bundle": "^2.0",
"lightsaml/sp-bundle": "^1.2",
"madcoda/php-youtube-api": "^1.2",
"microsoft/azure-storage-blob": "^1.4",
"microsoft/azure-storage-file": "^1.2",
"microsoft/azure-storage-queue": "^1.3",
"microsoft/azure-storage-table": "^1.1",
"nelmio/api-doc-bundle": "^4.3",
"predis/predis": "^1.1",
"sensio/framework-extra-bundle": "^5.1",
"sonata-project/admin-bundle": "^3.20",
"sonata-project/datagrid-bundle": "^2.0",
"sonata-project/doctrine-orm-admin-bundle": "^3.10",
"sonata-project/formatter-bundle": "^4.1",
"sonata-project/media-bundle": "^3.2",
"sonata-project/page-bundle": "^3.12",
"sonata-project/translation-bundle": "^2.5",
"sonata-project/user-bundle": "dev-master",
"stof/doctrine-extensions-bundle": "^1.4",
"symfony/asset": "4.4.*",
"symfony/console": "4.4.*",
"symfony/dotenv": "4.4.*",
"symfony/expression-language": "4.4.*",
"symfony/flex": "^1.3.1",
"symfony/form": "4.4.*",
"symfony/framework-bundle": "4.4.*",
"symfony/http-client": "4.4.*",
"symfony/intl": "4.4.*",
"symfony/lock": "4.4.*",
"symfony/messenger": "4.4.*",
"symfony/monolog-bundle": "^3.1",
"symfony/orm-pack": "*",
"symfony/process": "4.4.*",
"symfony/security-bundle": "4.4.*",
"symfony/serializer-pack": "*",
"symfony/swiftmailer-bundle": "^3.1",
"symfony/translation": "4.4.*",
"symfony/twig-bundle": "4.4.*",
"symfony/validator": "4.4.*",
"symfony/web-link": "4.4.*",
"symfony/yaml": "4.4.*",
"twig/extra-bundle": "^3.3",
"webmozart/assert": "^1.5"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.2",
"hautelook/alice-bundle": "^2.5",
"squizlabs/php_codesniffer": "*",
"symfony/debug-pack": "*",
"symfony/maker-bundle": "^1.0",
"symfony/profiler-pack": "*",
"symfony/test-pack": "*",
"symfony/web-server-bundle": "4.4.*"
},
"config": {
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"paragonie/random_compat": "2.*",
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php71": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-php56": "*",
"egeloen/ckeditor-bundle": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"ckeditor:install --clear=drop": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts",
"/bin/sh -c \"if [ -f contrib/setup.sh ]; then contrib/setup.sh; fi\""
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "4.4.*"
}
}
}
====
编辑#5:
这是composer why twig/extensions的输出:
sonata-project/admin-bundle 3.55.0 需要树枝/扩展 (^1.5) sonata-project/core-bundle 3.17.2 需要树枝/扩展 (^1.5)
这是我的preload.php文件的内容:
<?php
if (file_exists(dirname(__DIR__).'/var/cache/dev/srcApp_KernelDevContainer.preload.php')) {
require dirname(__DIR__).'/var/cache/dev/srcApp_KernelDevContainer.preload.php';
}
if (file_exists(dirname(__DIR__).'/var/cache/dev/App_KernelDevContainer.preload.php')) {
require dirname(__DIR__).'/var/cache/dev/App_KernelDevContainer.preload.php';
}
... 并且引用的 App_KernelDevContainer.preload.php 文件包含您可以在此处看到的此逻辑:
https://gist.github.com/patrickmaynard/0f2cff49628fe068b989a7024cd21e34
【问题讨论】:
-
在您的服务器上使用多个 PHP 版本?
-
感谢您的评论。我们只在我们的服务器上使用一个版本的 PHP。
-
您能分享一下您正在使用的
PHP版本和Twig版本吗?另外,是否有任何其他库正在使用Twig并且与您正在使用的Twig版本存在版本冲突? -
您能否将错误的堆栈跟踪添加到其中,您是否在某处手动调用
include/require和include_once/require_once? -
抱歉,目前还不清楚你为什么决定从 opcache 中排除一些文件。
标签: php sonata-admin sonata symfony-sonata opcache