Search code examples
phpfork

PHP fork process - parent reading variables updated by child


I want to achieve the following:

Initialize an array. Child process adds some elements to the array. Parent process adds some elements to the array. Finally before exiting, print all elements.

Following is the code that I wrote:

<?php
$values=array();
$pid = pcntl_fork();
if (!$pid) {
   sleep(2);
   $values[]="Put by child";
   exit(0);
}
$values[]="Put by parent";
pcntl_waitpid($pid, $status);
print_r($values);
?>

However, it only prints one value - Put by parent. Can someone please explain the behavior and suggest the right code?

Regards, JP


Solution

  • Forked children will gain their own dedicated copy of their memory space as soon as they write anywhere to it - this is "copy-on-write". While shmop does provide access to a common memory location, the actual PHP variables and whatnot defined in the script are NOT shared between the children.

    Doing $x = 7; in one child will not make the $x in the other children also become 7. Each child will have its own dedicated $x that is completely independent of everyone else's copy.

    a local domain socket is easiest. have the parent open one with fsockopen for each child immediately before the fork. that way you can have one comm channel per child: http://php.net/manual/en/transports.unix.php and http://php.net/manual/en/transports.unix.php.

    You could also shared memory, or open a bi-directional communications channel between the two processes and build a little api to send data back and forth.

    As long as father and children know the key/keys of the shared memory segment is ok to do a shmop_open before pcnlt_fork. But remember that pcnlt_fork returns 0 in the child's process and -1 on failure to create the child (check your code near the comment /confusion/). The father will have in $pid the PID of the child process just created.

    Check it here:

    http://php.net/manual/es/function.pcntl-fork.php