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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!