Swoole入门 - 进程

什么是进程

进程就是正在运行的程序的一个实例。
比如终端下运行一个PHP脚本,就是开启了一个进程,就会有一个对应的进程ID,即PID。

查看官方文档


Process

创建一个SWOOLE进程

在工作目录创建 process.php

<?php
$process = new swoole_process(function(swoole_process $process){
    echo 111;
}, true);

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

// 当结束的时候,回收结束运行的子进程
swoole_process::wait(); 

注意:进程和进程之间是通过管道进行通信的。在实例化swoole_process的时候,传了第二个参数true,这里觉得输出的内容不会打印到终端;如果设置为false,这里可以打印到终端,这里不做演示。

进程 process.php 启动后,返回了进程ID,这里我们输出pid可以查看

[zhengzongqiang@localhost process]$ pwd
/opt/work/htdocs/swoole_mooc/demo/process
[zhengzongqiang@localhost process]$ php process.php 
39388

创建一个HTTP子进程

process进程开启一个http子进程,修改 process.php 文件

$process = new swoole_process(function(swoole_process $process){
    // 这里必须写php的绝对安装路径. / 
    $process->exec("/opt/soft/php/bin/php", [__DIR__.'/../server/http.php']);
}, true);

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

// 当结束的时候,回收结束运行的子进程
swoole_process::wait();

运行程序,会打印该swoole_process进程的进程ID,即39658

[zhengzongqiang@localhost process]$ php process.php 
39658

接下来我们在新的会话中通过查看端口验证http子进程是否开启

[root@localhost zhengzongqiang]# netstat -anp | grep 8811
tcp        0      0 0.0.0.0:8811            0.0.0.0:*               LISTEN      39658/php  

可以看到,我们之前配置的http服务端口已经被监听,父进程ID为39658,即swoole_process进程开启了http进程。

进程关系

进程开启之后,可以通过命令跟进进程之间的关系。

// ps aux | grep process.php

[zhengzongqiang@localhost ~]$ ps aux | grep process.php
zhengzo+  39657  0.0  0.8 161496  8412 pts/1    S+   00:54   0:00 /opt/soft/php/bin/php process.php
zhengzo+  39973  0.0  0.0 112720   980 pts/2    R+   01:03   0:00 grep --color=auto process.php

可以查看到两条进程,下边一个代表运行本命令的进程,39657即运行process.php的程序的进程ID,即39658的父进程,即39657进程开启了进程ID为39658的swool_process进程,即39657就是php process.php这条命令的进程ID。

查看进程树

通过以下命令可查看进程之间的关系

// pstree -p 39657

[zhengzongqiang@localhost ~]$ pstree -p 39657
php(39657)───php(39658)─┬─php(39659)───php(39661)
                        └─{php}(39660)

还可以通过以下命令查看进程的对应程序

// ps aft | grep http

[zhengzongqiang@localhost ~]$ ps aft | grep http
 40193 pts/2    S+     0:00  \_ grep --color=auto http
 39658 pts/1    Sl+    0:00      \_ /opt/soft/php/bin/php /opt/work/htdocs/swoole_mooc/demo/process/../server/http.php
 39659 pts/1    S+     0:00          \_ /opt/soft/php/bin/php /opt/work/htdocs/swoole_mooc/demo/process/../server/http.php
 39661 pts/1    S+     0:00              \_ /opt/soft/php/bin/php /opt/work/htdocs/swoole_mooc/demo/process/../server/http.php

我们可以看到,http进程ID为39659,其父进程ID为39658进程,即swoole_process进程,再父进程就是启动swoole_process进程的进程,即执行此文件的的命令的进程,即39657进程。
39659进程也有子进程,即worker进程。
可以理解为39658进程为master进程,39659进程为manager进程。

SWOOLE 进程使用场景

有执行多个URL,需要获取这鞋URL地址中的内容,然后把它记录到相应的库里。

传统PHP的做法是同步顺序的执行这些URL,这个时候就会面另一个问题:
访问每隔URL地址都会有耗时,积少成多,这样会导致最后的响应时间太长,非常不友好。

这个问题可以通过引入swoole process来解决,按需开启N个子进程,每个子进程去执行相应的URL,这样可以大大地缩短响应时间。

之前是一个主进程执行这些URl,引入swoole process后,这个主进程可以开多个子进程,这样每一个子进程去执行一个URl,时间就会大大缩短。

SWOOLE - DEMO

创建curl.php

// 传统实现方式
$urls = [
    'http://baidu.com',
    'http://sina.com.cn',
    'http://qq.com',
    'http://baidu.com',
    'http://sina.com.cn',
    'http://qq.com'
];

foreach($urls as $url){
    $content[] = file_get_contents($url);
}

这样,如果每请求一个地址花费1s时间;那么总共要花费6s。
通过swoole_process实现

<?php
echo "process-start-time:".date('Y-m-d H:i:s').PHP_EOL;
$workers = [];
$urls = [
    'http://baidu.com',
    'http://sina.com.cn',
    'http://qq.com',
    'http://baidu.com',
    'http://sina.com.cn',
    'http://qq.com'
];

for($i = 0; $i < 6; $i++)
{
    // 子进程
    $process = new swoole_process(function(swoole_process $worker) use ($i, $urls){
    $content = curlData($urls[$i]);
    echo $content.PHP_EOL;
    },true);
    $pid = $process->start();
    $workers[$pid] = $process;
}
foreach($workers as $worker){
    echo $worker->read();
}


function curlData($url)
{
    sleep(1);
    return $url . 'success' . PHP_EOL ;

}

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

执行程序发现只用了1s

[zhengzongqiang@localhost process]$ php curl.php 
process-start-time:2019-06-04 17:46:28
http://baidu.comsuccess

http://sina.com.cnsuccess

http://qq.comsuccess

http://baidu.comsuccess

http://sina.com.cnsuccess

http://qq.comsuccess

process-end-time:2019-06-04 17:46:29

注意:swoole构造函数将内容输出到管道,还有另一种方式

$worker->write($content.PHP_EOL);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • 前文再续,就书接上一回,随着与Server、TCP、Protocol的邂逅,Swoole终于迎来了自己的故事,今天...
    蜗牛淋雨阅读 1,669评论 1 14
  • 进程 什么是进程 进程Process是计算机中的程序关于某数据集合上的一次运行活动,是系统分配资源和调度的基本单位...
    JunChow520阅读 1,988评论 2 9
  • swoole 安装用的是centOSphp安装目录:/usr/local/php php.ini配置文件路径:/u...
    a十二_4765阅读 11,758评论 3 9
  • 参考资料 官方网站 https://www.swoole.com/page/download PHP没有像Pyth...
    JunChow520阅读 2,890评论 0 6
  • date: 2017-12-14 21:34:51title: swoole 在 swoft 中的应用 swoft...
    daydaygo阅读 4,192评论 9 12