Windows — Асинхронный PHP-скрипт останавливается, когда основной скрипт останавливается

Я потратил некоторое время, пытаясь найти способ для Windows, чтобы скрипт PHP запускал другой скрипт асинхронно, и наткнулся на предложенное решение использования POPEN (). Сначала это не сработало, но потом, когда я добавил задержку, стало работать немного лучше. Но при дальнейшем исследовании кажется, что вскоре после того, как основной сценарий заканчивается, вторичный процесс уничтожается.

Вот соответствующий фрагмент кода, который запускает вторичный скрипт …

$cmd = <<<EOT
start "php" /b "C:\\Program Files (x86)\\iis express\\PHP\\v7.1\\php.exe" -f="$script" $args
EOT;
$p = popen($cmd, 'r');
usleep(500000);
pclose($p);

И соответствующая часть вторичного сценария …

$fp = fopen($argv[1] . '.txt', 'w');
for ($i = 0; $i < 100; $i++) {
fwrite($fp, $i ."\n");
sleep(1);
}
fclose($fp);

Это просто доказательство концепции. По сути, второй скрипт открывает файл, а затем записывает числа от 0 до 99 с интервалом в 1 секунду.

Проблема в том, что он, кажется, не заканчивается. Если сон длится 500 мс, он достигает только около 15. Для 200 мс он достигает около 8 и т. Д.

Я предполагаю, что это какая-то проблема владения процессом. Например. когда основной скрипт завершает работу, он убивает дочерние процессы, но я не уверен, и у меня закончились идеи, что еще можно попробовать.

(Запуск IIS в Windows 10)

Какие-либо предложения?

0

Решение

Вы можете запустить его в Windows следующим образом: используя COM и WScript.Shell

$WshShell = new COM('WScript.Shell');
$cmd = 'cmd /C php '.$script;
$oExec = $WshShell->Run($cmd, 0, false);

Это работает только на Windows, на Linux вы можете запустить его.

$cmd = 'php -f '.$script.' > /dev/null &';
exec($cmd, $oExec);

Оба запускают неблокирующий фоновый процесс. Предполагается, что вы добавили путь к php.exe к вашим переменным среды в Windows, если нет, вы можете использовать полный путь к исполняемому файлу.

Не спрашивайте меня, сколько часов я потратил на то, чтобы понять это, их было несколько. Что касается popen ну, у меня никогда не получалось, чтобы это работало, но отправка информации через канал или еще что-то не беспокоило меня.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector