Рубрики
Uncategorized

Использование SWOOL для реализации демона процесса (I)

Автор оригинала: David Wong.

1. Сценарии использования демона процесса.

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

В системе Linux/Unix супервизор является отличным инструментом управления процессами, разработанным python. В этой статье предпринята попытка использовать PHP для реализации аналогичных инструментов управления процессами.

Во-вторых, модуль управления процессами свул .

Все расширение PHP имеет модуль управления процессами. Для получения официальной документации см.: модуль управления процессами swool

Что касается реализации супервизора, защищенный процесс запускается как подпроцесс супервизора. Супервайзер может автоматически перезапустить подпроцесс, отслеживая сигнал подпроцесса. Модуль управления процессами swoole обеспечивает функцию межпроцессной связи и может реализовать функцию автоматического перезапуска подпроцессов.

В-третьих, первый демон процесса.

Для того чтобы реализовать опеку над подпрограммами, нам нужно сделать две вещи:

  1. Программе необходимо прослушать конечный сигнал дочернего процесса, чтобы запустить новый дочерний процесс.
  2. Рабочая среда дочернего процесса должна быть независимой от родительского процесса.

Модуль управления процессами swool предоставляет метод bool process – > exec (файл string $exec, массив $args) для преобразования дочернего процесса в другой системный вызывающий объект, гарантируя при этом, что родительский процесс и текущий процесс по-прежнему являются отношениями между родительским и дочерним процессами.

Затем мы ждем сигнала выхода подпроцесса через метод массива process:: wait (bool).

Ниже приведен пример кода, который использует swool для запуска и утилизации ресурсов дочерних процессов:

php
use Swoole\Process;

$php = "/usr/bin/env php";
$script = dirname(__DIR__) . "/task.php";
$command = "{$php} {$script}";

$process = new Process(function (Process $worker) use ($command) {
    $worker->exec('/bin/sh', ['-c', $command]);
});
$pid = $process->start();

Printf ("promoter process {$pid} n");

while ($ret = Process::wait()) {
    $pid = intval($ret["pid"] ?? 0);
    Printf ("child process {$pid} ends \n");
}

Синтаксический анализ кода: Переменная $command представляет необходимость запуска сценария подпроцесса в качестве подпроцесса методом exec (), а затем дождитесь завершения сценария подпроцесса $command с помощью вызова process:: wait () и рециркуляции ресурсов процесса.

Таким образом, до тех пор, пока получен сигнал об окончании подпроцесса и снова запускается тот же сценарий подпроцесса, может быть реализована защита подпроцесса. Таким образом, программный код реализации первого подпроцесса демона:

exec('/bin/sh', ['-c', $command]);
    });
    $pid = $process->start();

    Printf ("promoter process {$pid} n");
} while (Process::wait());

Анализ кода: Этот код только добавляет логику начального процесса в мертвый цикл, чтобы сценарий дочернего процесса можно было непрерывно перезапускать.

IV. Упаковка в классы

Чтобы облегчить повторное использование этого кода, его можно инкапсулировать в простой класс:

command = $command;
    }

    public function run()
    {
        do {
            $process = new Process(function (Process $worker) {
                $worker->exec('/bin/sh', ['-c', $this->command]);
            });
            $pid = $process->start();
        } while (Process::wait());
    }

}

Затем класс демона используется следующим образом:

run();

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

В следующей статье swool используется для реализации демона процессов (2), который попытается расширить этот класс демонов.