Pull to refresh

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

Reading time2 min
Views2K
В *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»);

Автор этого текста root{Собака}imcms.ru можете отправит ему инвайт.
Tags:
Hubs:
Total votes 16: ↑10 and ↓6+4
Comments4

Articles