Rabih
Rabih

Reputation: 318

What is the benifit of PCNTL-PHP for daemon process

I was researching and trying to do a daemon process using php, I found my self compelled to recompile PHP to enable PCNTL. Then I started to do some tests. I forked the single orphan example :

#!/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);
    }
}

then I ran the script :

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

every thing was going well, the file /dev/null.txt cleared and was being updated in the infinite loop each 1 second.

Then I wondered about the benefit of PCNTL, so I changed the code :

#!/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);
}

Both of the previous examples gave me the same results. Have I missed something ? Can you guide me

Upvotes: 1

Views: 628

Answers (1)

istepaniuk
istepaniuk

Reputation: 4267

Both your examples do the basically the same, except the first one forks before continuing. Forking is the way that processes become daemons in UNIX or derivatives.

Since forking leaves the parent and child processes sharing the same STDIN STDOUT and STDERR descriptors, it's common to just close them like you did.

In your trivial example, forking serves no purpose. Because you fopen() three times and no other descriptors are open at that time, these become the new descriptors 0, 1 and 2, matching input, output and error, hence your echo "."; ends up in that file.

Moreover, /dev/null.txt is just a regular file named like that and not the special /dev/null null device.

Upvotes: 0

Related Questions