Выполнение фоновых процессов из PHP в Windows


В *nix, запуска фоновых процессов, выполняется простым добавлением амперсанда (&) к команде. В Windows, это не так просто сделать из PHP.

Если вы используете в PHP функции системных вызовов, как exec, system, passthru или shell_exec, то эти методы приводят к подвисанию программы, которая ждет завершения работы вызванного процесса.

Описанные ниже методы предполагают, что вы используете PHP-CLI (работу с php из командной строки). Запуск PHP на веб-сервере требует правильной настройки конфигурации и прав доступа, такие как safe_mode, safe_mode_exec_dir и т.д.

Для примера, мы хотим вызвать cmd из PHP, но чтобы программа продолжала выполнять действия.
Приведенные ниже примеры не работают.

exec("cmd");
exec("cmd >NUL");
exec("cmd /c cmd");
exec("start /b cmd");
exec("runas cmd");

В каждом случае, PHP ждет пока cmd закроется.

Существуют несколько обходных путей, упомянутых в комментариях к документации по PHP к функции exec()

Краткое изложение этих методов, в порядке предпочтения:

Начало процесса с использованием popen и pclose
Этот код должен работать на Linux и Windows.

$exe = "cmd.exe";
pclose(popen('start "bla" "' . $exe . '" ' . escapeshellarg($args), 'r'));

Начало фонового процесса с использованием объекта WScript.Shell
Этот код работает только в Windows.

$WshShell = new COM("WScript.Shell");
 
// Запуск cmd в свернутом состоянии
$oExec = $WshShell->Run("cmd ", 7, false);
 
// Запуск cmd в фоновом режиме, иконка на панели задач не выводится
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false);

Более подробнее о методе Run() читайте в msdn.

Начало фонового процесса с использованием утилиты PsExec
Этот метод требует установки бесплатной утилиты PsTools от Sysinternals

exec("psexec -d cmd.exe");
  1. #1 by paradiseblog on 6.10.2009

    о у вас 2 одинаковых блога.
    тут и в жж.

    тоже пытаюсь иногда по вечерам изучать пхп.

    а этот блог не ворд пресс?

(никто не узнает)

  1. Пока ни один блог сюда не ссылается. Будешь первым?