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);
}
}
}
我认为问题在于,当包含一个文件时,不会反映对该文件的更改。