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

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

本篇演示 swoole进程管理模块

创建子进程

新建 process.php

<?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();
☁  process  php process.php
67540
swoole创建进程

调用外部程序

process.php

<?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

<?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();
☁  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 工具可以查看相关进程的关系

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

<?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;

执行结果:

☁  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秒

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据库

JDBC常见错误及解决方案

最近很多同学在数据库编程这一块遇到了很多的问题,各种问题都有,但却苦于不知道怎么解决这些问题,以至于编程效率非常低。今天我就来总结一下在数据库编程时经常遇到的问...

2268
来自专栏乐享123

Auto Reload Modules in Django Shell

2195
来自专栏Youngxj

多设备网站效果在线预览-四合一略缩图

2025
来自专栏北京马哥教育

不服来战!这20类500个常用命令参数你一定记不到50%

公告:今天加班的都是好人!好人!好人! 本文由马哥教育面授班24期学员推荐,转载自互联网,作者为LVS,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛...

3028
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据

3517
来自专栏码生

pod swift_version file: undefined method `swift_version=`

cocoapod 在低版本中制作swift pod库时需要在 podspec 同目录下创建 .swfit-version 文件指定版本

2151
来自专栏数据结构笔记

python爬虫系列之 requests: 让 HTTP 服务人类

比想象中要简单的多吧,只要把要访问的网址当作参数传递给requests.get方法,就可以获得所请求的网页。

1352
来自专栏gaoqin31

PHP 输出控制

默认情况下,输出一个字符串到浏览器,经过3个阶段PHP buffer->Tcp buffer->浏览器(IE浏览器有的版本也存在buffer)

1884
来自专栏简单聊聊Spark

Spark内核分析之Scheduler资源调度机制

        上一篇我们阐述了Driver,Application,Worker的注册实现原理,本篇我们来接着聊聊Driver,Application在注册之...

1382
来自专栏李鹏的专栏

JAVA 高并发设计

同步和异步通常用来形容一次方法调用,同步方法,调用者必须等到方法调用返回后,才能继续后续的行为,异步方法调用会立即返回,调用者就可以继续后续的操作。

4420

扫码关注云+社区

领取腾讯云代金券