{"id":970,"date":"2017-06-06T17:08:26","date_gmt":"2017-06-06T09:08:26","guid":{"rendered":"http:\/\/www.siediyer.cn\/?p=970"},"modified":"2017-06-06T17:08:26","modified_gmt":"2017-06-06T09:08:26","slug":"php%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e8%ae%af%e5%ae%9e%e4%be%8b%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"https:\/\/www.siediyer.cn\/?p=970","title":{"rendered":"php\u8fdb\u7a0b\u95f4\u901a\u8baf\u5b9e\u4f8b\u5206\u6790"},"content":{"rendered":"<p>php\u5355\u8fdb\u7a0b\u5355\u7ebf\u7a0b\u5904\u7406\u6279\u91cf\u4efb\u52a1\u592a\u6162\u4e86,\u53d7\u4e0d\u9e1f\u4e86,\u4f46\u662fphp\u4e0d\u80fd\u591a\u7ebf\u7a0b,\u6700\u7ec8\u9009\u62e9\u4e86\u591a\u8fdb\u7a0b\u5904\u7406\u6279\u91cf\u4efb\u52a1.<\/p>\n<p>php\u591a\u8fdb\u7a0b\u4e3b\u8981\u4f7f\u7528for\u8fdb\u884c\u5206\u88c2,\u7136\u540e\u5229\u7528\u7684unix\/linux\u7684\u4fe1\u53f7\u91cf\u8fdb\u884c\u8fdb\u7a0b\u95f4\u901a\u8baf.<\/p>\n<p>\u672c\u4f8b\u4f7f\u7528\u7684\u662f:<strong>\u751f\u4ea7\u8005=&gt;\u6d88\u8d39\u8005=&gt;\u6536\u96c6\u5668,\u7684\u6a21\u5f0f<\/strong>.<\/p>\n<pre class=\"lang:default decode:true  \">&lt;?php\r\n\/\/ ===== \u5168\u5c40\u53d8\u91cf =====\r\n\/\/ ipc\u8fdb\u7a0b\u95f4\u901a\u8baf\r\n$key = ftok(__FILE__, \"a\");\r\n$queue = msg_get_queue($key);\r\n\/\/ \u8fdb\u7a0bID\r\n$producer_pid = 0;\r\n$consumers_pid = array();\r\n$collector_pid = posix_getpid();\r\n\/\/ ===== \u6d88\u8d39\u8005 =====\r\nfor ($i=0; $i &lt; 2; $i++) {\r\n\u00a0\u00a0$consumer_pid = pcntl_fork();\r\n\u00a0\u00a0if ($consumer_pid == -1) {\r\n\u00a0\u00a0\u00a0\u00a0exit(\"could not fork!\\n\");\r\n\u00a0\u00a0} else if ($consumer_pid) {\r\n\u00a0\u00a0\u00a0\u00a0\/\/ pcntl_wait($status);\r\n\u00a0\u00a0\u00a0\u00a0echo \"consumer_pid: $consumer_pid\\n\";\r\n\u00a0\u00a0\u00a0\u00a0$consumers_pid[] = $consumer_pid;\r\n\u00a0\u00a0} else {\r\n\u00a0\u00a0\u00a0\u00a0$pid = posix_getpid();\r\n\u00a0\u00a0\u00a0\u00a0echo \"consumer_pid: $pid start\\n\";\r\n\u00a0\u00a0\u00a0\u00a0while (true) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0msg_receive($queue, $pid, $msgtype, 1024, $message);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ($message == \"exit\") {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u6570\u636e\u5904\u7406\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$n = intval($message);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0msg_send($queue, $collector_pid, $n * $n);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0exit(\"consumer ok!\\n\");\r\n\u00a0\u00a0}\r\n}\r\n\/\/ ===== \u4ea7\u751f\u8005 =====\r\n$producer_pid = pcntl_fork();\r\nif ($producer_pid == -1) {\r\n\u00a0\u00a0exit(\"could not fork!\\n\");\r\n} else if ($producer_pid) {\r\n\u00a0\u00a0\/\/ pcntl_wait($status);\r\n\u00a0\u00a0echo \"producer_pid: $producer_pid\\n\";\r\n} else {\r\n\u00a0\u00a0$pid = posix_getpid();\r\n\u00a0\u00a0echo \"producer_pid: $pid start\\n\";\r\n\u00a0\u00a0$n = 0;\r\n\u00a0\u00a0for ($i=0; $i &lt; 10; $i++) {\r\n\u00a0\u00a0\u00a0\u00a0foreach ($consumers_pid as $consumer_pid) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$n++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0msg_send($queue, $consumer_pid, $n);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0sleep(1);\r\n\u00a0\u00a0}\r\n\u00a0\u00a0foreach ($consumers_pid as $consumer_pid) {\r\n\u00a0\u00a0\u00a0\u00a0msg_send($queue, $consumer_pid, \"exit\");\r\n\u00a0\u00a0}\r\n\u00a0\u00a0sleep(1);\r\n\u00a0\u00a0msg_send($queue, $collector_pid, \"exit\");\r\n\u00a0\u00a0exit(\"producer ok!\\n\");\r\n}\r\n\/\/ ===== \u6536\u96c6\u5668 =====\r\nwhile (true) {\r\n\u00a0\u00a0msg_receive($queue, $collector_pid, $msgtype, 1024, $message);\r\n\u00a0\u00a0if ($message == \"exit\") {\r\n\u00a0\u00a0\u00a0\u00a0break;\r\n\u00a0\u00a0}\r\n\u00a0\u00a0echo sprintf(\"% 5d: %d\\n\", $msgtype, $message);\r\n}\r\nexit(\"collector ok!\\n\");<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>php\u5355\u8fdb\u7a0b\u5355\u7ebf\u7a0b\u5904\u7406\u6279\u91cf\u4efb\u52a1\u592a\u6162\u4e86,\u53d7\u4e0d\u9e1f\u4e86,\u4f46\u662fphp\u4e0d\u80fd\u591a\u7ebf\u7a0b,\u6700\u7ec8\u9009\u62e9\u4e86\u591a\u8fdb\u7a0b\u5904\u7406\u6279\u91cf\u4efb\u52a1. php\u591a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[61],"class_list":["post-970","post","type-post","status-publish","format-standard","hentry","category-php","tag-ipc"],"_links":{"self":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/970","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=970"}],"version-history":[{"count":1,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/970\/revisions"}],"predecessor-version":[{"id":971,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/970\/revisions\/971"}],"wp:attachment":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=970"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=970"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}