В *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 by paradiseblog on 6.10.2009
о у вас 2 одинаковых блога.
тут и в жж.
тоже пытаюсь иногда по вечерам изучать пхп.
а этот блог не ворд пресс?
#2 by admin on 7.10.2009
в жж идет трансляция с этого блога.
я уже php изучаю ~6 лет ))
да этот блог на wordpress’е.