Снова закройте и запустите файл PHP (PHP-CLI) - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть один PHP-файл на основе сокет-соединения, который я запускаю через командную строку, например

php myfile.php

Он продолжает работать 24 X 7. Иногда, если возникает какая-то проблема, он выходит с ошибкой, поэтому я хочу выйтии снова автоматически откройте этот файл.Функция My While, в которой вышеупомянутая ошибка появляется, выглядит следующим образом:

while (1) {
    try {
        $w->pollMessage();
        if (time() - $starttime > 180) {
            echo "refresh";
            newNumbers();
            $starttime = time();
        }
    }
    catch(Exception $e) {
        // error coming here and I want reload (run same file again) here.
    }
    if (!$w->isConnected()) {
        echo "disconnected";
        connectwa();
    }
}
$w->disconnect();
?>

Я не знаю, какой метод мне следует использовать для перезагрузки или автоматического запуска того же файла через командную строку.Дайте мне знать, если кто-то может помочь мне сделать это.Спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Используйте 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, автоматически отображается в терминале.Теперь вы почти вернули вывод своей команды ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...