Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony php-php是否在创建之前缓存类? 背景资料:_Symfony_Caching_Console Application - Fatal编程技术网

Symfony php-php是否在创建之前缓存类? 背景资料:

Symfony php-php是否在创建之前缓存类? 背景资料:,symfony,caching,console-application,Symfony,Caching,Console Application,我正在使用编写一个包装到对象中的控制台应用程序。我编写了一个名为console:reload的命令,从应用程序对象中清空命令数组,并重新添加特定目录下列出的命令类 此命令在shell启动时运行,因此,应用程序加载了可用的命令。正在加载的类位于一个特殊目录中,应该遵循一个简单的名称规则:Command.php: // Inside ReloadCommand->execute() method... $pamperoApp = $this->getApplication(); $pam

我正在使用编写一个包装到对象中的控制台应用程序。我编写了一个名为
console:reload
的命令,从
应用程序
对象中清空命令数组,并重新添加特定目录下列出的命令类

此命令在shell启动时运行,因此,
应用程序
加载了可用的命令。正在加载的类位于一个特殊目录中,应该遵循一个简单的名称规则:
Command.php

// Inside ReloadCommand->execute() method...
$pamperoApp = $this->getApplication();
$pamperoApp->clearCommands();
$namespace = "pampero\\cli\\modules";
foreach(glob(MODULES_DIR . "/*/*Command.php") as $command) {
    $class = str_replace(".php", "", $namespace . "\\" . basename(dirname($command)) . "\\" . basename($command));
    $this->getApplication()->add(new $class);
 }
使用Symfony(Composer?
ClassLoader
提供的自动加载:

// Main entry point...
loader = require_once __DIR__ . '/../vendor/autoload.php';
$loader->set('pampero', __DIR__ . '/../..');
我从
ClassLoader
类中读取代码,它所做的是存储文件名路径,因此没有对象缓存

问题是: 我启动应用程序:
php packages.php
。shell在执行
ReloadCommand
命令后出现。可用和已加载命令的列表已准备就绪,可以使用

如果我创建了一个新文件,比如说:
ExampleCommand.php
,然后我键入:
console:reload
,新命令确实会被添加。现在,如果我修改
ExampleCommand.php
中的代码并再次运行
console:reload
,对类所做的更改将不会生效

但这还不是全部。如果删除示例文件,请调用
console:reload
,再次创建该文件并运行:
console:reload
,将添加该命令

阅读: 我阅读过APC相关的内容,在创建新类之前,我做过如下工作:

// Prior adding commands in ReloadCommand
apc_clear_cache();
apc_clear_cache('user');
apc_clear_cache('opcode');
没有运气。我还运行了
apc.php
和启用/禁用
apc.enable\u cli
选项。所有这些都不会创建由修改后的文件表示的对象

因此,当找到文件/类时,我关于问题的提示和线索变成了类缓存。但如何避免这种特殊情况?如果通过类添加了一些额外的函数性,我不想重新启动shell


有什么想法吗?

找到解决方案后,我会回答自己的问题

好的,线索很好。问题是,包含文件的PHP绑定了符号,以便以后在解析文件时使用

所以,我需要一些透视。在通宵阅读/搜索/搜索之后,我终于找到了

可以在这里找到。我知道这不是你能用你的代码设计做的最好的事情。但对于我的项目需求,事实是这是需要的

下面是使用
Runkit
修改的代码:

protected function execute(InputInterface $input, OutputInterface $output)
{
    // Gets a reference to the console application and removes all commands
    $pamperoApp = $this->getApplication();
    $pamperoApp->clearCommands();
    // Adds default commands and add this command
    $pamperoApp->addCommands($pamperoApp->getDefaultCommands());
    $pamperoApp->add($this);

    $namespace = "pampero\\cli\\modules";

    foreach(glob(MODULES_DIR . "/*/*Command.php") as $filename) {
            $className = str_replace(".php", "", $namespace . "\\" . basename(dirname($filename)) . "\\" . basename($filename));
            // Do not add this command again. This command shouldn't be modified on-the-fly
            if (get_class($this) !== $className) {
                    $class = new $className();
                    // Redefines the class definition
                    runkit_import($filename, RUNKIT_IMPORT_CLASSES | RUNKIT_OVERRIDE_OBJECTS | RUNKIT_IMPORT_OVERRIDE);
                    $pamperoApp->add($class);
            }
    }
}

我认为问题在于,当包含一个文件时,不会反映对该文件的更改。