参考文章深入理解Linux进程间通信(IPC)进程间通信(IPC)介绍PHP高级应用的进程控制和进程间通信workman作者发表PHP相关进程间通信通信扩展--SystemVIPC:sysvmsg消息队列sysvsem信号量sysvshm共享内存--BSDIPCsocket(stream)--POSIXIPCposix信号量posix共享内存posix消息队列sysvmsg(消息队列)phpftok函数分析phpftok参数2个坑!目的:解决进程间通信问题用法:sender(send.php)$key=1;$msg='发件人发送的消息';$q=msg_get_queue($key);$send=msg_send($q,1,$msg,true,true);if($send){echo'消息发送成功'.PHP_EOL;}else{echo'消息发送失败'.PHP_EOL;}Receiver(receive.php)$key=1;$q=msg_get_queue($key);/***第二个参数说明:<0,小于绝对值的最小类型队列的第一条记录value如果类型为234567则返回消息队列上第一条记录类型为20则获取队列中的第一条消息(不考虑消息类型,标识符)1获取集合下的第一条消息类型第三个参数必须是变量!(废话!)*/msg_receive($q,1,$msg_type,1024,$msg,true,MSG_NOERROR,$error_code);错误处理未授权访问您可能会遇到未经授权访问队列的情况。那是因为你的代码看起来像这样。我也忘了怎么修了,以后会自动搞定的。无法接收消息指定key创建消息队列后,任何一方破坏队列都会导致其他发送方或接收方接收失败。信号量(sysvsem)+共享内存(sysvshm)用途:说明:解决进程间同步问题。使用场景:进程A、B、C,B中代码段y需要使用A中代码段x的结果,C中代码段m使用B中代码段y的结果。$key=ftok(__FILE__,1);$shm=shm_attach($key);create(3,[//处理函数($index)use($key,$shm){$sem_id=sem_get($key);//获取信号量!(其他获取信号量的进程等待信号量释放)sem_acquire($sem_id);//x处理语句shm_put_var($shm,1,10);$wait=3;$count=1;while($count>=$wait){echo'ProcessAiswaitingforprocessing'.$count++.'s'.PHP_EOL;sleep(1);}//3s后释放信号量sem_release($shm);},//进程Bfunction($index)use($key,$shm){$sem_id=sem_get($key);//获取信号量!(其他也获取信号量的进程等到信号量被释放)sem_acquire($sem_id);//x处理语句返回结果$x=shm_get_var($shm,1);$y=$x+11;shm_put_var($shm,2,$y);$wait=5;$count=1;while($count>=$wait){echo'进程B正在等待处理'.$count++.'s'.PHP_EOL;睡觉(1);}//5s后释放信号量sem_release($shm);},//处理C函数($index)use($key,$shm){$sem_id=sem_get($key);//获取信号量!(其他获取信号量的进程等到信号量被释放)sem_acquire($sem_id);//x处理语句返回结果$y=shm_get_var($shm,2);$c=$x+12;echo'获得的结果:'.$c;//删除共享内存段sem_remove($shm);},];解释:A先获取到信号量,等待3s后释放,期间B和C都在调用sem_acquire,然后阻塞,直到获取到信号量。A释放信号量后,B现在获取,然后阻塞5s释放,最后C获取并执行。进程间同步问题搞定!另外,进程间通信的方式是共享内存。
