phpinfo() shows opcache.blacklist_filename file, but contents ignored

535 Views Asked by At

In my Symfony/Sonata application's php.ini file, I have opcache.blacklist_filename set to /usr/src/app/config/opcache-exclude.txt. In a phpinfo() call on my test server, that file shows up in the correct place. Here is the content of the file:

/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/*

However, when I load my Sonata application, I still get this error, which is the same error that shows up when no blacklist is used:

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

Am I using the wrong format in my exclusion file? How can I fix this so that the file's contents do not get ignored?

====

Update #1: When I simplify the contents of the blacklist file to this:

/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

... I still get essentially the same error:

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

(Yes, this is technically a different error, but it's essentially saying the same thing: The contents of Text.php are already declared in the opcache and cannot be redeclared.)

====

Update #2: Running php -v shows 7.4.19 as the version. Here is a bit of version info that shows up when I use composer info:

twig/extra-bundle v3.3.1
twig/twig v2.12.2

Running composer why twig/twig shows this output:

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)

====

Edit #3: There is no use of include_once() or require_once() in this app, beyond the normal autoloaders and configuration loaders found in many Symfony applications. This problem goes away when opcache is turned off. So it's definitely related to opcaching.

====

Edit #4: Here is my composer.json file.

{
    "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.*"
        }
    }
}

====

Edit #5:

Here is the output of composer why twig/extensions:

sonata-project/admin-bundle 3.55.0 requires twig/extensions (^1.5) sonata-project/core-bundle 3.17.2 requires twig/extensions (^1.5)

Here is the content of my preload.php file:

<?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';
}

... and the referenced App_KernelDevContainer.preload.php file contains this logic that you can see here:

https://gist.github.com/patrickmaynard/0f2cff49628fe068b989a7024cd21e34

1

There are 1 best solutions below

0
Mikko Rantalainen On

The errors

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)

sound a lot like you're having multiple declarations of same method or class or you're calling include()/require() multiple times explicitly or implicitly.

Do you use include() or require() anywhere that could be called depending on opcache being effective or not?

When you use PHP autoloader, the only explicit include() calls you should have are one call to load the autoloader and all the other calls in the autoloader implementation only. And make sure you don't have include_once() nor require_once() anywhere in your codebase because those do not mix well with autoloader.

The only reason to blacklist something from the opcache should be if you need to generate code that should be reloaded. It shouldn't be used to workaround code errors (e.g. incorrect include() chains).