入门指引 Server Client Process AsyncIO Memory HttpServer WebSocket 高级 其他

发布于 2015-08-09 09:45:02 | 528 次阅读 | 评论: 0 | 来源: 网络整理

1.7.2 swoole增加了多进程管理模块来替代PHP的pcntl,它相比pcntl的不同点是:

  • swoole_process提供了pcntl没有的进程间通信
  • swoole_process支持重定向标准输入和输出,在子进程内echo或者读键盘输入可以被重定向为从管道中取数据
  • swoole_process允许用于fpm/apache的Web请求中
  • 子进程可以异步化

进程间通信(IPC)

子进程和父进程之间可以通过管道通信,传递数据。IPC在多进程编程中经常用到,PHP的pcntl模块没有提供IPC的功能,所以功能有局限。而swoole_process提供了这些功能,并且封装了接口。只需调用接口即可完成进程间通信。

$worker_num = 8;

for($i = 0; $i < $worker_num; $i++)
{
    $process = new swoole_process('callback_function', $redirect_stdout);
    $pid = $process->start();
    $workers[$pid] = $process;
}

function callback_function(swoole_process $worker)
{
    //echo "Worker: start. PID=".$worker->pid."n";
    //recv data from master
    $recv = $worker->read();
    echo "From Master: $recvn";

    //send data to master
    $worker->write("hello mastern");

    sleep(2);
    $worker->exit(0);
}

read/write 2个方法就是向管道内读写数据。主进程内可以通过write/read 向子进程写入,读取数据。

标准输入/输出重定向

swoole_process支持了标准输入输出的重定向,子进程内echo时,会自动写入管道,而不是打印到屏幕。

子进程异步

swoole_process创建的子进程可以是同步的,也可以是异步的。

function callback_function_async(swoole_process $worker)
{
    //echo "Worker: start. PID=".$worker->pid."n";
    //recv data from master
    $GLOBALS['worker'] = $worker;
    swoole_event_add($worker->pipe, function($pipe) {
        $worker = $GLOBALS['worker'];
        $recv = $worker->read();

        echo "From Master: $recvn";

        //send data to master
        $worker->write("hello mastern");

        sleep(2);

        $worker->exit(0);
    });
}

可以将管道加入到swoole_event中即可实现异步的进程间通信,另外子进程内可以使用swoole_timer/swoole_client/swoole_async这些异步的API。或者使用swoole_event_add直接操作swoole的EventLoop。

用于php-fpm/apache

php-fpm/apache下不允许执行fork,原因很简单fork太原始了,如果使用不当fork后又执行php-fpm/apache的逻辑,那后果不堪设想。

而swoole_process是基于fork的封装,仅执行传入的PHP函数,执行完毕后会直接调用底层的exit,退出子进程,避免了风险。

在php-fpm/apache要谨慎使用多进程,fork消耗很大,如果你的每个请求都创建销毁一次子进程,那会浪费很多CPU。 在php-fpm/apache中务必执行执行 $worker->exit(1); 终止进程。1.7.3后会优化这里

其他

swoole_process 1.7.3 还会加入进程CPU亲和设置、守护进程化、使用消息队列/共享内存Channel等特性。

最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务