【问题标题】:phpinfo() 显示 opcache.blacklist_filename 文件,但内容被忽略
【发布时间】: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 -v7.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/requireinclude_once/require_once
  • 抱歉,目前还不清楚你为什么决定从 opcache 中排除一些文件。

标签: php sonata-admin sonata symfony-sonata opcache


【解决方案1】:

错误

Compile Error: Cannot declare class Twig_Extensions_Extension_Text, because the name is already in use in Text.php line 15

Fatal error: Cannot redeclare twig_truncate_filter() (previously declared in vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php:38)

听起来很多就像你有多个相同方法或类的声明你多次显式或隐式调用include()/require()

您是否使用include()require() 任何地方 可以根据 opcache 是否有效来调用?

当您使用 PHP 自动加载器时,您应该有的唯一显式 include() 调用是一个加载自动加载器的调用,而所有其他调用仅在自动加载器实现中。并确保您的代码库中没有include_once()require_once(),因为它们不能与自动加载器很好地混合。

将 opcache 中的某些内容列入黑名单的唯一原因应该是您需要生成应该重新加载的代码。它不应用于解决代码错误(例如不正确的include() 链)。

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多