Сценарий:
Каков наилучший способ сделать это?
On * nix:
exec('/path/to/executable > /dev/null 2>&1 &');
В Windows:
$WshShell = new COM('WScript.Shell'); $oExec = $WshShell->Run('C:\path\to\executable.exe', 0, false);
Оба они вызовут новый процесс, который будет запускаться синхронно, полностью отключен от родителя. Пока ваш хост позволяет вам это сделать.
Вы можете использовать Google по ключу: продолжить обработку php после закрытия соединения.
Следующие ссылки, относящиеся к вашей проблеме, следующие:
Вы можете использовать команду собственности, чтобы продолжить выполнение без прерывания пользователя
ignore_user_abort(true); set_time_limit(0);
Вы используете fastcgi_finish_request, чтобы предупредить клиента о прекращении вывода ответа. И ваши скрипты будут продолжать выполняться.
Пример:
// redirecting... ignore_user_abort(true); set_time_limit(0); header("Location: ".$redirectUrl, true); header("Connection: close", true); header("Content-Length: 0", true); ob_end_flush(); flush(); fastcgi_finish_request(); // important when using php-fpm! sleep (5); // User won't feel this sleep because he'll already be away // do some work after user has been redirected
В PHP нет потоков. Вы можете обмануть, отправив обратно страницу HTML, которая запускает вызов Ajax для запуска тяжелого процесса в новом запросе. Но если это общий хостинг, я предполагаю, что вы быстро попадете в пределы объема памяти, времени или использования процессора, наложенных вашим хостинг-провайдером.
$WshShell = new COM('WScript.Shell'); $oExec = $WshShell->Run('C:\xampp\php\php.exe C:\xampp\htdocs\test.php -a asdf', 0, true);
Не удается передать argv на test.php.
var_dump($argv);