<?php $http = new swoole_http_server("0.0.0.0", 9511); $http->set([ 'worker_num' =>3, //工作進程數 'daemonize' => true, //是否后台運行 ]); $http->on('request','Run'); function Run($request, $response) { $url=$request->server['request_uri']; if($url!='/favicon.ico'){ $m = [1,2,3,4,5,6,7,8,9]; p($m); } $response->end('首頁'); } function p($messages) { $worker_num = 5; $process_pool = []; $process= null; $pid = posix_getpid(); $customMsgKey = 1; $mod = 2 | swoole_process::IPC_NOWAIT;//這里設置消息隊列為非阻塞模式 for($i=0;$i<$worker_num; $i++) { $process=new swoole_process('sub_process'); $process->useQueue($customMsgKey, $mod); $process->start(); $pid = $process->pid; $process_pool[$pid] = $process; } //由於所有進程是共享使用一個消息隊列,所以只需向一個子進程發送消息即可 $process = current($process_pool); foreach ($messages as $msg) { $process->push($msg); } } function sub_process(swoole_process $worker) { sleep(1); //防止父進程還未往消息隊列中加入內容直接退出 // echo "worker ".$worker->pid." started".PHP_EOL; while($msg = $worker->pop()){ echo $msg; if ($msg === false) { break; } $sub_pid = $worker->pid; // echo "[$sub_pid] msg : $msg".PHP_EOL; file_put_contents(__DIR__.'/a.txt',"[$sub_pid] msg : $msg".PHP_EOL,FILE_APPEND); sleep(1);//這里的sleep模擬任務耗時,否則可能1個worker就把所有信息全接受了 } // echo "worker ".$worker->pid." exit".PHP_EOL; $worker->exit(0); } $http->start();