swoole-进程管理模块(一)
正在运行的程序示例
一、进程的解释
#!/bin/env php
<?php
$workNum = 3;//进程数
for($i = 0; $i < $workNum; $i++) {
$process = new swoole_process('callback_function_we_write');
$pid = $process->start();
echo PHP_EOL . $pid;
}
function callback_function_we_write(swoole_process $worker) {
echo PHP_EOL;
var_dump($worker);
echo PHP_EOL;
}
new swoole_process()创建进程,参数是回调函数,回调函数执行$process->start()后返回的pid之后子进程开始启动,调用回调函数。
pipe是管道id
pid是当前子进程的pid
callback是回调函数
二、进程和普通程序的时间比较
echo PHP_EOL.time();
$workNum = 3;//进程数
for($i = 0; $i < $workNum; $i++) {
$process = new swoole_process('callback_function_we_write');
$pid = $process->start();
echo PHP_EOL . $pid;
}
function callback_function_we_write(swoole_process $worker) {
for($i=0;$i<100000000;$i++){}
echo PHP_EOL.time();
}
执行时间为3秒的样子
echo PHP_EOL . time() ;
for($i=0;$i<100000000;$i++){}
for($i=0;$i<100000000;$i++){}
for($i=0;$i<100000000;$i++){}
echo PHP_EOL . time() ;
这样跑了一遍大概8秒,这里就体现出来进程的处理能力
三、进程的执行过程
$funcMap=array('methodOne' , 'methodTwo' ,'methodThree' );
$worker_num =3;//创建的进程数
for($i=0;$i<$worker_num ; $i++){
$process = new swoole_process($funcMap[$i]);
$pid = $process->start();
sleep(2);
}
while(1){
$ret = swoole_process::wait();
if ($ret){// $ret 是个数组 code是进程退出状态码,
$pid = $ret['pid'];
echo PHP_EOL."Worker Exit, PID=" . $pid . PHP_EOL;
}else{
break;
}
}
function methodOne(swoole_process $worker){// 第一个处理
echo '1';
}
function methodTwo(swoole_process $worker){// 第二个处理
echo '2';
}
function methodThree(swoole_process $worker){// 第三个处理
echo '3';
}
swoole_process::wait()回收结束运行的子进程。
通过运行结果,可以看到执行完子进程之后,再执行主进程
看到的效果是执行方法1,2,3 等待某个子进程完成后执行while函数
swoole_process::wait();对子进程回收
四、swoole_process通讯
管道
swoole_process->write(string $data);
swoole_process->read(int $buffer_size=8192);
消息队列
swoole_process->useQueue();
swoole_process->push(string $data);
swoole_process->pop(int $maxsize = 8192);
$redirectStdout = false;
$workNum = 2;
$workers = [];
for($i = 0; $i < $workNum; $i++) {
$process = new swoole_process('workerFunc', $redirectStdout);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $pid => $process) {//主进程
$process->write("hello worker[$pid]\n");//子进程句柄向自己管道里写内容
echo "from worker:".$process->read();//子进程句柄从自己的管道里面读取信息
echo PHP_EOL.PHP_EOL;
}
function workerFunc(swoole_process $worker) {//子进程
$recv = $worker->read();
echo PHP_EOL. "From Master: $recv\n";
$worker->write("hello master , this pipe is ". $worker->pipe ."; this pid is ".$worker->pid."\n");
sleep(2);
$worker->exit(0);
}
$redirectStdout = true;
把new swoole_process(‘workerFunc’, $redirectStdout);第二个参数改成true
$redirect_stdin_stdout,重定向子进程的标准输入和输出。 启用此选项后,在进程内echo将不是打印屏幕,而是写入到管道。读取键盘输入将变为从管道中读取数据。 默认为阻塞读取。
$process = new swoole_process(function (swoole_process $process){
//todo
//php redis.php
$process->exec("/usr/bin/php", [__DIR__.'/../server/http_server.php']);
}, false);
$pid = $process->start();
echo $pid;
//回收子进程
swoole_process::wait();
查看php文件的进程
ps aux |grep process.php
pstree -p 3304
进程是存放到管道,也需要从管道读出来
$start = time();
$curls = [
"http://www.baidu.com",
"http://www.qq.com",
"http://www.taobao.com",
];
for ($i = 0; $i < 3; $i++) {
$process = new swoole_process(function (swoole_process $worker) use($i, $curls){
$res = curlData($curls[$i]);
echo $res.PHP_EOL;
}, true);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $process) {
echo $process->read();
}
function curlData($url) {
//curl file_get_content
sleep(1);
return $url . "success" . PHP_EOL;
}
echo time() - $start;
本作品采用《CC 协议》,转载必须注明作者和本文链接