У меня есть веб-маршрут в моем проекте laravel, и в этом веб-маршруте в настоящее время я вызываю команду Artisan, которую я определил в app/Console/Commands. Я делаю Artisan::call(command).
Итак, насколько я понимаю, прежде всего, когда я называю это таким образом, мой веб-запрос будет ждать завершения, прежде чем перейти к следующему фрагменту кода, верно? Ожидает ли он завершения Artisan::call?
Мне нужно решение, которое не ждет, и у меня есть один потенциальный обходной путь, но прежде чем использовать обходной путь, я хочу убедиться, что Artisan::callSilent() не делает то, что я хочу. Если вместо этого я использую callSilent, будет ли это запускать команду artisan в фоновом режиме, не блокируя остальную часть процесса веб-запроса?
@matiaslauriti Я могу провести несколько тестов и выяснить это самостоятельно. У меня долгое время сложилось впечатление, что Artisan::call является действием по блокировке запросов, но я был бы рад узнать, что я ошибаюсь. Спасибо, протестирую.
Artisan::call синхронно, думаю, вам нужна работа, которую можно отправить в очередь
Думаю, ты прав @krisgjika, я провожу тесты, и они блокируют обработку запроса, как я и думал.
чтобы уточнить, он должен блокировать только текущий запрос до его завершения (например, вызов функции), а не другие запросы в той же конечной точке.
@TKoL извини, я имел в виду, что ты выполнял php artisan command вместо того, чтобы буквально вызывать Artisan::call в своем коде, я не знаю, почему я так подумал. Так что да, это блокировка, потому что результат (вывод) зависит от команды, поэтому она должна работать синхронно.
function call имеет return $this->runCommand($command, $arguments, $this->output);, а function callSilent имеет return $this->runCommand($command, $arguments, new NullOutput);. Похоже, что callSilent просто не отправляет никаких данных.
Спасибо @aynber — не стесняйтесь опубликовать это в качестве ответа. Пожалуйста, укажите тот факт, что callSilent все еще блокируется.






Хорошо, для протокола
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, так что по сути это псевдоним.
Artisan::callне останавливает ваши запросы, я никогда не использовалcallSilentпоэтому понятия не имею, что он делает. С какими проблемами вы столкнулись?