Изящная обработка ошибок команды DOS - PullRequest
0 голосов
/ 06 апреля 2010

PHP 5.2.13 в Windows 2003

Я использую команду DOS Start / B для запуска фонового приложения с помощью PHP-функции popen ():

popen("start /B {$_SERVER['HOMEPATH']}/{$app}.exe > {$_SERVER['HOMEPATH']}/bg_output.log 2>&1 & echo $!", 'r');

Функция popen () запускает процесс cmd.exe, который выполняет указанную команду; однако, если команда не выполняется (например, {$ app} .exe не существует или заблокирована в приведенном выше примере), процесс cmd.exe никогда не возвращается, и в результате PHP зависает на неопределенное время.

Вызов сбойной команды DOS напрямую с помощью командной строки приводит к появлению сообщения об ошибке, которое требует нажатия кнопки ОК.

Я предполагаю, что это требование подтверждения ошибки - это то, что мешает процессу cmd.exe вернуться в PHP как из командной строки (с использованием CGI и CLI), так и из Интернета (с использованием обработчика Apache 2.0 с Apache 2.2).

Есть ли способ написать команду DOS или настроить сервер или приложение cmd.exe для возврата ошибки DOS исходящему вызову вместо ожидания подтверждения?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2010

Вы пробовали cmd.exe /c ... вместо start /b?

0 голосов
/ 06 апреля 2010

Из руководства: http://php.net/manual/en/function.popen.php

Если выполняемая команда может не найден, действительный ресурс вернулся. Это может показаться странным, но делает смысл; это позволяет вам получить доступ к любому сообщение об ошибке, возвращаемое оболочкой:

error_reporting(E_ALL);

/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
...