В чем преимущество PCNTL-PHP для процесса демона

Я исследовал и пытался выполнить процесс демона с использованием php, я обнаружил, что вынужден перекомпилировать PHP, чтобы включить PCNTL. Тогда я начал делать некоторые тесты. Я разветвил единственный пример-сироту:

#!/usr/bin/env php
<?php
$pid = pcntl_fork();

if ($pid === -1) {
    echo("Could not fork! \n");die;
} elseif ($pid) {
    echo("shell root tree \n");
} else {
    echo "Child process \n";

    chdir("/");

        fclose(STDIN);
        fclose(STDOUT);
    fclose(STDERR);
    $STDIN = fopen('/dev/null.txt', 'r');
    $STDOUT = fopen('/dev/null.txt', 'wb');
    $STDERR = fopen('/dev/null.txt', 'wb');

    posix_setsid();
    while(1) {
        echo ".";
        sleep(1);
    }
}

затем я запустил скрипт:

$cd /var/www
$./test.php

все шло хорошо, файл /dev/null.txt очищался и обновлялся в бесконечном цикле каждую 1 секунду.

Затем я задумался о пользе PCNTL, поэтому изменил код:

#!/usr/bin/env php
<?php

fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

$STDIN = fopen('/dev/null.txt', 'r');
$STDOUT = fopen('/dev/null.txt', 'wb');
$STDERR = fopen('/dev/null.txt', 'wb');

while(1) {
    echo ".";
    sleep(1);
}

Оба предыдущих примера дали мне одинаковые результаты. Я что-то пропустил? Можешь ли ты направить меня?


person Rabih    schedule 05.02.2014    source источник


Ответы (1)


Оба ваших примера делают в основном то же самое, за исключением того, что первый разветвляется перед продолжением. Разветвление — это способ, которым процессы становятся демонами в UNIX или производных.

Поскольку при разветвлении родительский и дочерний процессы используют одни и те же дескрипторы STDIN, STDOUT и STDERR, обычно их просто закрывают, как вы это делали.

В вашем тривиальном примере разветвление не имеет смысла. Поскольку вы fopen() трижды и никакие другие дескрипторы в это время не открыты, они становятся новыми дескрипторами 0, 1 и 2, совпадающими с вводом, выводом и ошибкой, поэтому ваш echo "."; оказывается в этом файле.

Более того, /dev/null.txt — это просто обычный файл с таким именем, а не специальное /dev/null нулевое устройство.

person istepaniuk    schedule 14.01.2021