Используйте nohup, чтобы поймать сигнал зависания.Перенаправьте stdout, stderr и stdin и используйте & для запуска нового процесса в фоновом режиме.Делая это, новый процесс безопасно отсоединяется, и текущий процесс может полностью завершиться.
$command = 'nohup php myfile.php > stdout.txt 2> stderr.txt < /dev/null &';
system($command);
exit;
Вместо перенаправления в файл и перезаписи файла каждый раз, когда вы также можете добавить файл, используя два знака>.
$command = 'nohup php myfile.php >> stdout.txt 2>> stderr.txt < /dev/null &';
Это захватит весь вывод в stdout.txt en stderr.txt.
В следующем примере кода это продемонстрировано.Файл myfile.php будет запущен снова, и исходный процесс может благополучно умереть.
<?php
$timescalled = isset($argv[1]) ? $argv[1] : 0;
while (1) {
try {
$rand_between_0_and_1 = mt_rand() / mt_getrandmax();
if ($rand_between_0_and_1 < 0.001) throw new Exception();
} catch (Exception $e) {
fwrite(STDERR, "hello stderr\n");
fwrite(STDOUT, "hello stdout\n");
$command = 'nohup php myfile.php ' . ++$timescalled . ' >> stdout.txt 2>> stderr.txt < /dev/null &';
system($command);
exit;
}
}
Вывод может быть прочитан из stdout.txt и stdout.txt.При использовании:
tail -f output.txt &
содержимое, добавляемое в output.txt, автоматически отображается в терминале.Теперь вы почти вернули вывод своей команды ?.