swoole之创建子进程

一、代码

<?php

/**
 * 进程就是正在运行的程序的一个实例
 * 比如,在某个终端中执行一个PHP脚本,可以认为就是开启了一个进程,会有对应的进程id(pid)
 *
 * swoole进程与进程之间是通过管道通信
 */

 /**
  * 执行process.php 创建子进程$pid 子进程创建http_server
  *
  * php(11440,主进程)───php(11441,子进程)─┬─php(11442,manager进程)─┬─php(11444,worker进程)
  *                                      │                        ├─php(11445)
  *                                      │                        ├─php(11446)
  *                                      │                        └─php(11447)
  *                                      └─{php}(11443)
  */

$process = new swoole_process(function (swoole_process $worker) {
    // 执行 php http.php 开启http服务器
    $worker->exec("/usr/local/php71/bin/php", [__DIR__.'/../server/http.php']);
}, true);

$pid = $process->start();
echo $pid.PHP_EOL;

swoole_process::wait();

/**
 * 模拟爬取多个网站的数据场景
 */
$urls = [
    'http://www.helloweba.net/php/576.html',
    'http://www.helloweba.net/php/580.html',
    'http://www.helloweba.net/php/581.html'
];

$workers = [];

echo 'process start: '.date('Y-m-d H:i:s').PHP_EOL;

for ($i=0; $i<count($urls); $i++) {
    $url = $urls[$i];
    $process = new swoole_process(function (swoole_process $worker) use ($url) {
        $content = curlData($url);
        // echo $content.PHP_EOL;
        $worker->write($content);
    }, true);
    $pid = $process->start();
    $workers[$pid] = $process;
}

foreach ($workers as $process) {
    echo $process->read();
}

/**
 * 简化模拟请求
 * @param [type] $url
 * @return void
 */
function curlData($url)
{
    sleep(1);
    return "get {$url} content success".PHP_EOL;
}

echo 'process end: '.date('Y-m-d H:i:s').PHP_EOL;

/*
 输出数据,用时1秒(多进程执行)而不是3秒:
 process start: 2019-05-05 18:02:42
 get http://www.helloweba.net/php/576.html content success
 get http://www.helloweba.net/php/580.html content success
 get http://www.helloweba.net/php/581.html content success
 process end: 2019-05-05 18:02:43
 */

 

转载于:https://www.cnblogs.com/cshaptx4869/p/10815350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值