Хобрук: Ваш путь к мастерству в программировании

Команда запуска Symfony с контроллера на сервере

Я хочу очистить кеш от контроллера. Я определил команду как службу и вызываю ее.

clear_cache_command_service:
    class: Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand
    calls:
       - [setContainer, ["@service_container"] ]

В моем контроллере у меня есть форма для выбора команды, и когда выбрана команда очистки кеша, она запускается:

    $clearCacheCommand = $this->container->get('clear_cache_command_service');
    $clearCacheCommand->run(new ArrayInput(array()), new ConsoleOutput());

Однако это работает какое-то время, так как оно также нагревает кеш (на самом деле я хочу, чтобы он также нагревал его). Это также время ожидания, поэтому мне нужно set_time_limit и его тоже.

Есть ли способ вернуть ответ в браузере и позволить команде выполниться и завершиться на сервере? Я не хочу, чтобы клиент продолжал ждать его завершения.


Ответы:


1

Из-за того, как php работает - синхронно - невозможно сделать "классический" способ, в котором вам нужно дождаться завершения команды, чтобы завершить и отправить ответ. Решение здесь состоит в том, чтобы включить шаблон worker. Вы можете найти полезную информацию здесь. В основном вам нужно добавить задачу «очистить кеш» в очередь и позволить другому процессу обрабатывать эту очередь, поэтому в вашем случае вызовите команду clear cache.

Обычным решением, используемым в symfony в таких случаях, является использование RabbitMQ, об этом много ресурсов:

Использование в symfony

RabbitMQBundle

Позвольте RabbitMQ сделать Работа в вашем приложении Symfony2

23.02.2016

2

Для запуска команды после ответа вы должны использовать прослушиватель для события kernel.terminate. Целью этого события является выполнение задач после того, как ответ уже был доставлен клиенту.

// send the headers and echo the content
$response->send();

// triggers the kernel.terminate event
$kernel->terminate($request, $response);

пример прослушивателя

Документация по событию kernel.terminate

23.02.2016
  • Проблема с kernel.terminate в том, что он будет прослушивать каждый запрос, и это не имеет смысла, когда мне это нужно только в одном месте. 23.02.2016
  • Другая проблема заключается в том, что добавление слишком большого количества событий для запроса, ответа, завершения делает приложение медленным, как мне кажется. Могу ошибаться, но просить об этом при каждом запросе все же не имеет смысла. 09.03.2016

  • 3

    В качестве альтернативы RabbitMQ, о котором уже упоминалось, вы можете взглянуть на JMSJobBundle http://jmsyst.com/bundles/JMSJobQueueBundle/master/installation

    Некоторый пример кода, который я дал в этом своем старом ответе на аналогичный вопрос: Асинхронный вызов команды в Symfony2

    23.02.2016

    4

    Я нашел способ сделать это. Это немедленно вернет ответ и запустит команду в фоновом режиме. Не уверен, насколько это плохая практика.

    /**
     * @Service("background_command_runner")
     */
    class BackgroundCommandRunner
    {
        private $kernelDir;
    
    
        /**
         * @InjectParams({
         *     "kernelDir" = @Inject("%kernel.root_dir%")
         * })
         */
        public function __construct($kernelDir)
        {
            $this->kernelDir = $kernelDir;
        }
    
        public function run($cmd)
        {
            $path = $this->kernelDir . '\console ';
    
            $fullCmd = "php " . $path . $cmd;
    
            if (substr(php_uname(), 0, 7) == "Windows") {
                pclose(popen("start /B " . $fullCmd, "r"));
            } else {
                exec($fullCmd . " >> logs/theme.log &");
            }
        }
    
        public function clearCache($env = "dev", $warm = true)
        {
    
            $toWarm = $warm ? "" : " --no-warmup";
    
            $cmd = "cache:clear " . "--env=" . $env . $toWarm;
    
            $this->run($cmd);
    
        }
    
    
    }
    
    23.02.2016
  • это немного хакерски. Это, вероятно, будет работать (я не уверен в разделителе каталогов \ в linux), но это не чистый код - давайте представим, что имя команды изменится на cache:clear-now или console изменится на ezpublish (на самом деле это называется так в ezpublish cms ) и больше не получится 23.02.2016
  • Затем их можно добавить в качестве параметров выше. Тем не менее, скорее всего, они не изменятся (хотя мы не должны зависеть от этого факта, есть довольно много проектов, где команда жестко прописана где-то в сценариях развертывания) и она должна работать только для Symfony. 23.02.2016
  • Я изменил его, чтобы к нему можно было добавить больше команд. Пока работает прекрасно. 09.03.2016
  • Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..