Я пытаюсь выполнить файл .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 &');
Спасибо за ответ, но у меня это не сработало. В интернете я нашел много идей для решения, но у меня ничего не получалось.
Теперь я наконец нашел решение!
Ключевое слово попен! Это работает хорошо:
$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');
Это прекрасно работает с пустым пространством в именах папок.
Вы используете Windows. нет никаких /dev/null
в Windows (это просто nul
) и нет &
запускать задания в фоновом режиме. &
в cmd.exe это разделитель команд. Таким образом, ваш exec () будет зависать / ждать окончания .bat.
Пытаться
exec('start c:\daten\test.bat');
вместо этого, который запустит пакетный файл как отдельный процесс.
Это сработало для меня.
exec("start cmd /c test.bat", $output);
var_dump($output);