Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP fork process - parent reading variables updated by child

Tags:

php

fork

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

like image 377
workwise Avatar asked Mar 10 '26 18:03

workwise


2 Answers

(sorry for crossposting)

I suggest a look at socket_create_pair().

In the PHP manual is a very short & easy example of interprocess communication (IPC) between a fork()-parent and the child.

And using serialize() und unserialize() You could even transfer complex data types like arrays...

like image 183
user3074234 Avatar answered Mar 13 '26 08:03

user3074234


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

like image 23
OBV Avatar answered Mar 13 '26 09:03

OBV



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!