windows — запустить .bat файл из php в фоновом режиме

Я пытаюсь выполнить файл .bat (Windows Server с xampp) из php в фоновом режиме. После того, как я нажму на кнопку, он также должен перейти на другой сайт.
Но когда я нажимаю на кнопку, браузер ожидает завершения сценария. В основном это заканчивается тайм-аутом.

мой php код:

if (isset($_POST['test']))
{
exec('C:\Daten\test.bat');
header("Location:test_status.php");
}

Как я могу сказать php exec, чтобы не ждать?

Я пробовал также следующее, но не работает:

exec('C:\Daten\test.bat' . '> /dev/null &');

0

Решение

Спасибо за ответ, но у меня это не сработало. В интернете я нашел много идей для решения, но у меня ничего не получалось.

Теперь я наконец нашел решение!
Ключевое слово попен! Это работает хорошо:

$handle = popen ('start /B C:\Data\restart_TS3.bat > C:\Daten\restart_TS3.log 2>&1', 'r');
pclose ($handle);
header("Location:ts3_status.php");

Это сделать следующее:
popen открывает фоновый процесс, который запускает пакетный файл, вывод идет в файл журнала.
Затем вам нужно закрыть его с помощью pclose. (партия все еще работает в фоновом режиме)
После этого он открывает другой веб-сайт, в моем случае это веб-сайт «видеть текущий статус».

Если вам не нужен журнал, вы можете также вывести (как уже говорил МаркБ) с помощью> nul. Это будет выглядеть так:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r');

И будьте осторожны с пустыми местами на пути!
Я не знаю почему, но это не сработает: ‘start / B «C: \ Data Folder \ restart_TS3.bat»> nul 2>&1’
В этом случае вам нужно «в папке, как это:

$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r');

Это прекрасно работает с пустым пространством в именах папок.

2

Другие решения

Вы используете Windows. нет никаких /dev/null в Windows (это просто nul) и нет & запускать задания в фоновом режиме. & в cmd.exe это разделитель команд. Таким образом, ваш exec () будет зависать / ждать окончания .bat.

Пытаться

exec('start c:\daten\test.bat');

вместо этого, который запустит пакетный файл как отдельный процесс.

1

Это сработало для меня.

exec("start cmd /c test.bat", $output);
var_dump($output);
1