Swoole 进程管理

用法:

$process = new swoole_process(function(){
    //这里写业务代码
},true)
//开启进程,返回进程pid
$pid = $process->start();

实例化时传入第二个参数为 true 时,则表示输出内容到管道

//模拟用进程管理同时请求多个url
$workers = [];
$urls = [
    'http://www.baidi.com',
    'http://www.google.com',
    'http://www.sina.com.cn',
    'http://www.qq.com',
    'http://www.cnblog.com'
];

foreach ($urls as $i => $url) {
    $process = new swoole_process(function($worker) use($urls,$i){
        $content = curlData($urls[$i]);
        //向管道中写入数据
        $worker->write($content);
        //echo $content;   //使用echo可以达到一样的效果
    },true);
    $pid = $process->start();
    //将创建好的进程保存在数组中
    $workers[$pid] = $process;
}

// ---------- 等待所有进程结束后再执行后面代码 ---------

foreach ($workers as $process) {
    //从管道中读取数据
    echo $process->read();
    //回收子进程
    $process::wait();
}

//模拟请求数据过程
function curlData($url){
    sleep(1);
    return $url ."SUCCESS" . PHP_EOL;
}

上面代码执行总耗时 1s ,由此可见多进程大大提高了效率

此外,在创建的子进程中还可以调用外部程序

$process = new swoole_process('callback_function', true); 
$pid = $process->start(); 
function callback_function(swoole_process $worker) 
{ 
    $worker->exec('/usr/local/bin/php',array(__DIR__.'/swoole_server.php')); 
} 
  

注意:

exec()方法第一个参数为执行文件的路径,必须为绝对路径
第二个参数为数组,为执行文件的数组
原文地址:https://www.cnblogs.com/xiaoliwang/p/9276954.html