Справочная информация:
Я использую Symfony Console Component, чтобы написать консольное приложение, которое завернуто в объект Shell
. Я написал команду с именем console:reload
, которая опустошает массив команд из объекта Application
и повторно добавляет классы команд, перечисленные в определенном каталоге.php - Является ли php кешированием классов перед созданием?
Эта команда запускается при запуске оболочки, поэтому Application
загружается доступными командами. Классы загружаемой расположены в специальном каталоге и должны следовать простому правилу имя: <CommandName>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 ClassLoader
используется (композитор):
// Main entry point...
loader = require_once __DIR__ . '/../vendor/autoload.php';
$loader->set('pampero', __DIR__ . '/../..');
Я прочитал код от ClassLoader
класс, и то, что он делает, - это сохранить путь к имени файла, поэтому нет кэширования объекта.
Вот проблема:
я запустить приложение: php packages.php
. Оболочка появляется после выполнения команды 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_cli
. Ни одна из этих вещей не создает объект, представленный модифицированным файлом.
Так что мои подсказки и подсказки о проблемах превращаются в кеширование классов при обнаружении файла/класса. Но как этого избежать? Я не хочу перезапускать оболочку, если через классы добавлена дополнительная функциональность.
Любые идеи?
Я думаю, что проблема заключается, что, когда файл включен, изменения в файл не будет отражаться. – Sebastian