Задать вопрос
GrantM
@GrantM

Как выполнить shell_exec, чтобы PHP не дожидался окончания системной команды?

Есть PHP-скрипт на домашнем медиасервере с Apache:

<?php
$output = shell_exec(' Watch.bat '  . htmlspecialchars($_GET["name"]));
?>


Его задача получить параметр name в запросе и передать его батнику Watch.bat, который запускает видео с названием name в VLC.

Проблема: при текущей реализации запускается проигрывание видео и скрипт (соответственно и страница запроса) ждёт пока VLC не закроется, а видео по 10, 20, 30 минут идут, поэтому ждать бесполезно.

Что требуется от скрипта: не ждать закрытия проигрывателя VLC, а просто запустить его и всё.
Разные базовые хитрости вроде запуска через start в батнике и прочем уже испробованы - не помогает.

На stackoverflow есть решение, добавить в запрос:
> /dev/null 2>/dev/null &

UPD: в комментариях подсказали, что данное решение под Linux.

Вопрос: так как в php я полный ноль и нет возможности освоить его за короткое время для решения разовой задачи, прошу помочь корректно сформулировать запрос, чтобы не дожидаться его выполнения в Windows.
  • Вопрос задан
  • 977 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
GrantM
@GrantM Автор вопроса
Нашёл ответ:

$cmd = ' Watch.bat '  . htmlspecialchars($_GET["name"]);

$output = pclose(popen("start /B ". $cmd, "r"));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
zavoloklom
@zavoloklom
Software Engineering Manager
Для решения подобной задачи (правда с запуском php кода) я использовал пакет symphony/process.
Он позволяет потом управлять запущенным процессом.

Код запуска выглядел так:
$cmd = 'php bin/async_script.php';
$process = new Process($cmd . " > /dev/null &");
$process->start()
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
А попробуйте так:
<?php
$output = shell_exec('C:\Windows\system32\cmd.exe /c start Watch.bat '  . htmlspecialchars($_GET["name"]));
?>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы