PHP fork进程-在父进程中获取子输出
我希望实现以下目标: 初始化数组。子进程向数组中添加一些元素。父进程向数组中添加一些元素。最后,在退出之前,打印所有元素 以下是我编写的代码:PHP fork进程-在父进程中获取子输出,php,fork,Php,Fork,我希望实现以下目标: 初始化数组。子进程向数组中添加一些元素。父进程向数组中添加一些元素。最后,在退出之前,打印所有元素 以下是我编写的代码: <?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
<?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);
?>
但是,它只打印一个值-由父级输入。有人能解释一下这种行为并建议正确的代码吗
问候,,
JP分叉的孩子在任何地方写东西时都会获得自己的专用内存空间副本,这就是“写时拷贝”。虽然shmop确实提供了对公共内存位置的访问,但脚本中定义的实际PHP变量和其他内容不会在子级之间共享
做$x=7;在一个孩子将不会使$x在其他孩子也成为7。每个孩子都有自己的专用$x,完全独立于其他人的副本
本地域套接字是最简单的。让父级在fork之前为每个子级打开一个fsockopen。这样,每个孩子可以有一个通信通道:和
您还可以共享内存,或者打开两个进程之间的双向通信通道,并构建一个小api来来回发送数据
只要父亲和孩子知道共享内存段的键,就可以在pcnlt_分叉之前打开shmop_。但是请记住,pcnlt_fork在子进程中返回0,在创建子进程失败时返回-1(检查注释/混淆/附近的代码)。父进程将在$pid中包含刚刚创建的子进程的pid
请在此处查看:
孩子的代码缺少print\r()
语句
父进程不会打印子进程添加到值中的内容,因为添加是在关闭子进程fork()
之后完成的,并且通过此操作,它获得了自己的prcoess内存副本
(我强调):
fork()
函数是Unix/Linux/POSIX通过复制调用进程来创建新进程的方法
这种分叉行为与所有线程共享相同地址空间的线程不同。(很抱歉交叉发布)
我建议看一下套接字\u create\u pair()
在PHP手册中,有一个关于fork()父进程和子进程之间的进程间通信(IPC)的非常简单的例子
使用serialize()undunserialize()甚至可以传输复杂的数据类型,如数组…资源,如数据库连接,也可以在子级之间共享