前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018年swoole实战7-进程详解创建子进程调用外部程序查看进程树多进程的实战案例

2018年swoole实战7-进程详解创建子进程调用外部程序查看进程树多进程的实战案例

作者头像
章鱼喵
发布2018-08-02 15:22:02
5410
发布2018-08-02 15:22:02
举报
文章被收录于专栏:codingcoding

继上篇 2018年swoole实战6-异步redis

本篇演示 swoole进程管理模块

创建子进程

新建 process.php

代码语言:javascript
复制
<?php
$process = new swoole_process(function(swoole_process $pro) {
    echo 'swoole创建进程' . PHP_EOL;
}, false); // 如果设置为true,终端就不会显示标准输出内容

$pid = $process->start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id

swoole_process::wait();
代码语言:javascript
复制
☁  process  php process.php
67540
swoole创建进程

调用外部程序

process.php

代码语言:javascript
复制
<?php
$process = new swoole_process(function(swoole_process $pro) {
    $pro->exec("/usr/local/opt/php@7.1/bin/php", [__DIR__.'/http_server.php']);
}, false); // 如果设置为true,终端就不会显示标准输出内容

$pid = $process->start(); // 创建了一个子进程
echo $pid . PHP_EOL; // 子进程id

swoole_process::wait();

http_server.php

代码语言:javascript
复制
<?php
$http = new swoole_http_server('0.0.0.0', 9502);

$http->on('request', function ($request, $response) {
    $response->header("Content-Type", "text/html; charset=utf-8");
    $time = date('Y-m-d H:i:s', time());
    $response->end("<h1>{$time}--这是swoole提供的http服务,修改代码后要重启服务才能生效</h1>");
});

$http->start();
代码语言:javascript
复制
☁  process  php process.php
68526
[2018-07-27 16:38:53 @68526.0]  TRACE   Create swoole_server host=0.0.0.0, port=9502, mode=3, type=1

浏览器访问 http://127.0.0.1:9502/

查看进程树

通过 pstree 工具可以查看相关进程的关系

代码语言:javascript
复制
brew install pstree # mac 安装 pstree
ps aux | grep process.php  # 获取进程id
pstree -p 69932 # 显示进程树

多进程的实战案例

如果用php去抓取网页内容,传统的方式是用一个for循环,将url逐个遍历,假设每个url耗时1秒,6个url就需要耗时6s,这种方式效率太低了。通过swoole的进程管理模块,我们可以实现多进程抓取内容,每个进程对应负责一个url,从而实现1秒完成抓取任务

新建 process_curl.php

代码语言:javascript
复制
<?php
$startTime = time();
echo "程序开始执行时间:" . date("H:i:s") . PHP_EOL;
$workers = [];
$urls = [
    'http://www.zhihu.com',
    'http://www.baidu.com',
    'http://www.jianshu.com',
    'http://www.huxiu.com',
    'http://www.qq.com',
];

for ($i = 0; $i < count($urls); $i++) {
    // 每次开启一个子进程
    $process = new swoole_process(function (swoole_process $worker) use($i, $urls) {
        $content = getContent($urls[$i]);
        $worker->write($content . PHP_EOL);
    }, true);
    $pid = $process->start();
    $workers[$pid] = $process;
}

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

// 模拟获取数据, 耗时1秒
function getContent($url) {
    sleep(1);
    return $url . " 执行完成..." . PHP_EOL;
}
$runTime = time() - $startTime;
echo "程序执行时间为{$runTime}秒" . PHP_EOL;

执行结果:

代码语言:javascript
复制
☁  process  php process_curl.php
程序开始执行时间:17:13:54
http://www.zhihu.com 执行完成...

http://www.baidu.com 执行完成...

http://www.jianshu.com 执行完成...

http://www.huxiu.com 执行完成...

http://www.qq.com 执行完成...

程序执行时间为1秒
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建子进程
  • 调用外部程序
  • 查看进程树
  • 多进程的实战案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档