Немного смущен тем, что делает Artisan::callSilent

У меня есть веб-маршрут в моем проекте laravel, и в этом веб-маршруте в настоящее время я вызываю команду Artisan, которую я определил в app/Console/Commands. Я делаю Artisan::call(command).

Итак, насколько я понимаю, прежде всего, когда я называю это таким образом, мой веб-запрос будет ждать завершения, прежде чем перейти к следующему фрагменту кода, верно? Ожидает ли он завершения Artisan::call?

Мне нужно решение, которое не ждет, и у меня есть один потенциальный обходной путь, но прежде чем использовать обходной путь, я хочу убедиться, что Artisan::callSilent() не делает то, что я хочу. Если вместо этого я использую callSilent, будет ли это запускать команду artisan в фоновом режиме, не блокируя остальную часть процесса веб-запроса?

Artisan::call не останавливает ваши запросы, я никогда не использовал callSilent поэтому понятия не имею, что он делает. С какими проблемами вы столкнулись?
matiaslauriti 27.03.2024 15:41

@matiaslauriti Я могу провести несколько тестов и выяснить это самостоятельно. У меня долгое время сложилось впечатление, что Artisan::call является действием по блокировке запросов, но я был бы рад узнать, что я ошибаюсь. Спасибо, протестирую.

TKoL 27.03.2024 15:45
Artisan::call синхронно, думаю, вам нужна работа, которую можно отправить в очередь
kris gjika 27.03.2024 15:54

Думаю, ты прав @krisgjika, я провожу тесты, и они блокируют обработку запроса, как я и думал.

TKoL 27.03.2024 15:57

чтобы уточнить, он должен блокировать только текущий запрос до его завершения (например, вызов функции), а не другие запросы в той же конечной точке.

kris gjika 27.03.2024 16:00

@TKoL извини, я имел в виду, что ты выполнял php artisan command вместо того, чтобы буквально вызывать Artisan::call в своем коде, я не знаю, почему я так подумал. Так что да, это блокировка, потому что результат (вывод) зависит от команды, поэтому она должна работать синхронно.

matiaslauriti 27.03.2024 16:02
function call имеет return $this->runCommand($command, $arguments, $this->output);, а function callSilent имеет return $this->runCommand($command, $arguments, new NullOutput);. Похоже, что callSilent просто не отправляет никаких данных.
aynber 27.03.2024 16:08

Спасибо @aynber — не стесняйтесь опубликовать это в качестве ответа. Пожалуйста, укажите тот факт, что callSilent все еще блокируется.

TKoL 27.03.2024 16:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
8
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, для протокола

Artisan::call() блокирует, а Artisan::callSilent() ... ну, его даже не существует в моей установленной версии laravel, на сервере, над которым я работаю, так что я понятия не имею.

Я использую такой обходной путь:

    $command = "php artisan " . $command ." > /dev/null 2>/dev/null &";
    shell_exec($command);
Ответ принят как подходящий

CallsCommand.php показывает следующие функции:

   /**
     * Call another console command.
     *
     * @param  \Symfony\Component\Console\Command\Command|string  $command
     * @param  array  $arguments
     * @return int
     */
    public function call($command, array $arguments = [])
    {
        return $this->runCommand($command, $arguments, $this->output);
    }

    /**
     * Call another console command without output.
     *
     * @param  \Symfony\Component\Console\Command\Command|string  $command
     * @param  array  $arguments
     * @return int
     */
    public function callSilent($command, array $arguments = [])
    {
        return $this->runCommand($command, $arguments, new NullOutput);
    }

Итак, как говорится в комментариях, callSilent делает то же самое, что и команда вызова, но не отправляет никаких результатов. Еще есть callSilently(), который просто вызывает callSilent, так что по сути это псевдоним.

Другие вопросы по теме