Swoole多进程的实现
/** * 使用swoole多进程上传文件到网宿服务器 * Created by PhpStorm. * User: leeo * Date: 2016/9/29 * Time: 15:26 */
// 引入文件上传类
include_once "FileHandleClass.php"; $obj_fetch = new FileHandleClass(); $workers = []; $worker_num = 2; // 清空上次的日志文件 if(file_exists("logs/push.log")){ file_put_contents("logs/push.log",""); } if(file_exists("logs/pop.log")){ file_put_contents("logs/pop.log",""); } $filename = "data/2015-06-test.txt";// 需要上传的文件信息集合 $stream = file_get_contents($filename); $data = json_decode($stream,true); $total = count($data); $every = intval($total / $worker_num) + 1; // 每个进程需要循环的次数 for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process("callback_function", false, false); $process->useQueue(); $pid = $process->start(); $workers[$pid] = $process; } function callback_function(swoole_process $worker){ global $obj_fetch; while($recv = $worker->pop()){ file_put_contents("logs/pop.log",$recv." ",FILE_APPEND); $recv = json_decode($recv,true); $obj_fetch->fetch($recv["full_path"],$recv["file_name"]); } echo $worker->callback ."--".$worker->pipe.PHP_EOL; $worker->exit(0); } // 将资源存入队列中 $n = 0; foreach($workers as $pid => $process){ if($n == $worker_num - 1){ $ret = array_slice($data,$n*$every); }else{ $ret = array_slice($data,$n*$every,$every); } foreach($ret as $k=>$v){ $kv = json_encode($v); $process->push($kv); file_put_contents("logs/push.log",$kv." ",FILE_APPEND); } $n++; } for($i = 0; $i < $worker_num; $i++) { $ret = swoole_process::wait(); $pid = $ret["pid"]; unset($workers[$pid]); echo "Worker Exit, PID=".$pid.PHP_EOL; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Java对象的深复制和浅复制
- 下一篇: 【Swoole】多进程process