gordalina/cachetool

Fatal error on PHP8

akalongman opened this issue · 11 comments

On PHP 8 command ./cachetool.phar opcache:reset results to the fatal error:

PHP Fatal error:  Declaration of Symfony\Component\DependencyInjection\ServiceLocator::has(string $id) must be compatible with Psr\Container\ContainerInterface::has($id) in phar:///home/longman/project/cachetool.phar/vendor/symfony/dependency-injection/ServiceLocator.php on line 46
PHP Stack trace:
PHP   1. {main}() /home/longman/project/cachetool.phar:0
PHP   2. require() /home/longman/project/cachetool.phar:14
PHP   3. CacheTool\Console\Application->run($input = *uninitialized*, $output = *uninitialized*) phar:///home/longman/project/cachetool.phar/bin/cachetool:26
PHP   4. CacheTool\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { private $tokens = [0 => 'opcache:reset']; private $parsed = []; protected $definition = class Symfony\Component\Console\Input\InputDefinition { private $arguments = [...]; private $requiredCount = 1; private $hasAnArrayArgument = FALSE; private $hasOptional = FALSE; private $options = [...]; private $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'opcache:reset']; protected $interactive = TRUE }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private $stderr = class Symfony\Component\Console\Output\StreamOutput { private $stream = resource(134) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... } }; private $consoleSectionOutputs = []; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(119) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private $decorated = TRUE; private $styles = [...]; private $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } } }) phar:///home/longman/project/cachetool.phar/vendor/symfony/console/Application.php:166
PHP   5. CacheTool\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { private $tokens = [0 => 'opcache:reset']; private $parsed = []; protected $definition = class Symfony\Component\Console\Input\InputDefinition { private $arguments = [...]; private $requiredCount = 1; private $hasAnArrayArgument = FALSE; private $hasOptional = FALSE; private $options = [...]; private $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'opcache:reset']; protected $interactive = TRUE }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private $stderr = class Symfony\Component\Console\Output\StreamOutput { private $stream = resource(134) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... } }; private $consoleSectionOutputs = []; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(119) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private $decorated = TRUE; private $styles = [...]; private $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } } }) phar:///home/longman/project/cachetool.phar/src/Console/Application.php:129
PHP   6. CacheTool\Console\Application->doRunCommand($command = class CacheTool\Command\OpcacheResetCommand { protected $container = NULL; private ${Symfony\Component\Console\Command\Command}application = class CacheTool\Console\Application { protected $config = class CacheTool\Console\Config { ... }; protected $logger = class Monolog\Logger { ... }; private ${Symfony\Component\Console\Application}commands = [...]; private ${Symfony\Component\Console\Application}wantHelps = FALSE; private ${Symfony\Component\Console\Application}runningCommand = ...; private ${Symfony\Component\Console\Application}name = 'CacheTool'; private ${Symfony\Component\Console\Application}version = '6.3.1'; private ${Symfony\Component\Console\Application}commandLoader = NULL; private ${Symfony\Component\Console\Application}catchExceptions = TRUE; private ${Symfony\Component\Console\Application}autoExit = TRUE; private ${Symfony\Component\Console\Application}definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private ${Symfony\Component\Console\Application}helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private ${Symfony\Component\Console\Application}dispatcher = NULL; private ${Symfony\Component\Console\Application}terminal = class Symfony\Component\Console\Terminal { ... }; private ${Symfony\Component\Console\Application}defaultCommand = 'list'; private ${Symfony\Component\Console\Application}singleCommand = FALSE; private ${Symfony\Component\Console\Application}initialized = TRUE; private ${Symfony\Component\Console\Application}signalRegistry = class Symfony\Component\Console\SignalRegistry\SignalRegistry { ... }; private ${Symfony\Component\Console\Application}signalsToDispatchEvent = [...] }; private ${Symfony\Component\Console\Command\Command}name = 'opcache:reset'; private ${Symfony\Component\Console\Command\Command}processTitle = NULL; private ${Symfony\Component\Console\Command\Command}aliases = []; private ${Symfony\Component\Console\Command\Command}definition = class Symfony\Component\Console\Input\InputDefinition { private $arguments = [...]; private $requiredCount = 0; private $hasAnArrayArgument = FALSE; private $hasOptional = FALSE; private $options = [...]; private $shortcuts = [...] }; private ${Symfony\Component\Console\Command\Command}hidden = FALSE; private ${Symfony\Component\Console\Command\Command}help = ''; private ${Symfony\Component\Console\Command\Command}description = 'Resets the contents of the opcode cache'; private ${Symfony\Component\Console\Command\Command}fullDefinition = NULL; private ${Symfony\Component\Console\Command\Command}ignoreValidationErrors = FALSE; private ${Symfony\Component\Console\Command\Command}code = NULL; private ${Symfony\Component\Console\Command\Command}synopsis = []; private ${Symfony\Component\Console\Command\Command}usages = []; private ${Symfony\Component\Console\Command\Command}helperSet = class Symfony\Component\Console\Helper\HelperSet { private $helpers = [...]; private $command = NULL } }, $input = class Symfony\Component\Console\Input\ArgvInput { private $tokens = [0 => 'opcache:reset']; private $parsed = []; protected $definition = class Symfony\Component\Console\Input\InputDefinition { private $arguments = [...]; private $requiredCount = 1; private $hasAnArrayArgument = FALSE; private $hasOptional = FALSE; private $options = [...]; private $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'opcache:reset']; protected $interactive = TRUE }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private $stderr = class Symfony\Component\Console\Output\StreamOutput { private $stream = resource(134) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... } }; private $consoleSectionOutputs = []; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(119) of type (stream); private ${Symfony\Component\Console\Output\Output}verbosity = 32; private ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private $decorated = TRUE; private $styles = [...]; private $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } } }) phar:///home/longman/project/cachetool.phar/vendor/symfony/console/Application.php:290
PHP   7. CacheTool\Console\Application->buildContainer($input = class Symfony\Component\Console\Input\ArgvInput { private $tokens = [0 => 'opcache:reset']; private $parsed = []; protected $definition = class Symfony\Component\Console\Input\InputDefinition { private $arguments = [...]; private $requiredCount = 1; private $hasAnArrayArgument = FALSE; private $hasOptional = FALSE; private $options = [...]; private $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'opcache:reset']; protected $interactive = TRUE }) phar:///home/longman/project/cachetool.phar/src/Console/Application.php:142
PHP   8. Composer\Autoload\ClassLoader->loadClass($class = 'Symfony\\Component\\DependencyInjection\\Container') phar:///home/longman/project/cachetool.phar/src/Console/Application.php:166
PHP   9. Composer\Autoload\includeFile($file = 'phar:///home/longman/project/cachetool.phar/vendor/composer/../symfony/dependency-injection/Container.php') phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:322
PHP  10. include() phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:444
PHP  11. class_exists($class = 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator') phar:///home/longman/project/cachetool.phar/vendor/symfony/dependency-injection/Container.php:29
PHP  12. Composer\Autoload\ClassLoader->loadClass($class = 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator') phar:///home/longman/project/cachetool.phar/vendor/symfony/dependency-injection/Container.php:29
PHP  13. Composer\Autoload\includeFile($file = 'phar:///home/longman/project/cachetool.phar/vendor/composer/../symfony/dependency-injection/Argument/ServiceLocator.php') phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:322
PHP  14. include() phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:444
PHP  15. Composer\Autoload\ClassLoader->loadClass($class = 'Symfony\\Component\\DependencyInjection\\ServiceLocator') phar:///home/longman/project/cachetool.phar/vendor/symfony/dependency-injection/Argument/ServiceLocator.php:21
PHP  16. Composer\Autoload\includeFile($file = 'phar:///home/longman/project/cachetool.phar/vendor/composer/../symfony/dependency-injection/ServiceLocator.php') phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:322
PHP  17. include() phar:///home/longman/project/cachetool.phar/.box/vendor/composer/ClassLoader.php:444

Version of cachetool is 6.3.1

I can't replicate this. Which exact php version are you using?

@gordalina

PHP 8.0.5 (cli) (built: May  3 2021 11:30:57) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.5, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.5, Copyright (c), by Zend Technologies
    with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans

I'd recommend adding a new major version that will support only PHP >=8.0 and drop support for PHP 7 and old Symfony components

@gordalina same error :(

It's very strange. Inside the phar file the declaration of Symfony\Component\DependencyInjection\ServiceLocator::has is the same as Psr\Container\ContainerInterface::has. Why I am getting that error? And not only on my laptop. The same error is on multiple servers. Weird.

Thank you for testing it out, I narrowed it down and created an alpha build within the v6 version.
Can you try this version? https://github.com/gordalina/cachetool/releases/tag/6.4.0-alpha.0

@gordalina I can confirm, no error anymore

@gordalina version 6.4.0-alpha.1 throws the same error

@akalongman can you past the error logs from 6.4.0-alpha.1? I can't seem to replicate it.
Thank you

Released 6.4.0