Самый простой способ запустить новый процесс/поток в PHP

Сценарий:

  • Общий хостинг, поэтому нет возможности устанавливать новые расширения + нет CRON
  • Представленный запрос должен выполнять некоторые тяжелые процессы.
  • Я хочу, чтобы клиент ответил как можно быстрее, и тяжелый подъем продолжил немедленно, но не остановил клиента.
  • может быть на новом потоке (если это возможно) также не проблема с запуском нового процесса.

Каков наилучший способ сделать это?

Ответ 1

Вкл. * 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);

Оба из них вызовут новый процесс, который будет работать синхронно, полностью отключен от родителя. Пока ваш хост позволяет это сделать.

Ответ 2

Вы можете использовать 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

Ответ 3

В PHP нет потоков. Вы можете обмануть, отправив обратно страницу HTML, которая запускает вызов Ajax для запуска тяжелого процесса в новом запросе. Но если он разделяет хостинг, я предполагаю, что вы быстро попадете в пределы памяти, времени или использования процессора, наложенных вашим хостинг-провайдером.

Ответ 4

$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);