美文网首页
swoole中进程

swoole中进程

作者: dongshixiao | 来源:发表于2018-05-07 10:04 被阅读0次

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展。
    优点:
    swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用write/read或者push/pop即可
    swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
    配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式
    swoole_process提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信

    <?php
    /**
     * Created by PhpStorm.
     * User: season
     * Date: 18-5-7
     * Time: 上午9:19
     */
    
    $process = new Swoole\Process(function (swoole_process $pro) {
        //todo
        $pro->exec("/usr/local/php/bin/php",[__DIR__.'/../server/http.php']);
    
    }, false);
    
    $pid = $process->start();
    
    echo $pid . PHP_EOL;
    
    //回收
    swoole_process::wait();
    

    此时 process.php开启了一个子进程ID为4397


    开启的子进程ID

    测试是否执行子进程成功,发现已经开启此服务。见上图


    测试http server image.png

    4598进程为 ps aux |grep process.php 执行命令的进程
    此时有一个进程为4396的进程,这个进程 就是process.php开启的子进程4397子进程的父进程。也就是4396进程是process.php的进程。

    查看process.php进程之间的关系

    此时 4398进程为swoole中的manage进程。用来管理work进程和task进程。
    4403、4404、4405、4406.进程为http.php的work进程。

    下面是一个进程的实例:

    <?php
    /**
     * Created by PhpStorm.
     * User: season
     * Date: 18-5-8
     * Time: 下午2:26
     */
    echo "start_time".date('Ymd H:i:s').PHP_EOL;
    $workers = [];
    $urls = [
        'http://baidu.com?search=1',
        'http://baidu.com?search=2',
        'http://baidu.com?search=3',
        'http://baidu.com?search=4',
        'http://baidu.com?search=5',
        'http://baidu.com?search=6',
        'http://baidu.com?search=7',
        'http://baidu.com?search=8',
        'http://baidu.com?search=9',
        'http://baidu.com?search=10',
    ];
    
    for ($i = 0; $i < 10; $i++) {
        //子进程
        $process = new swoole_process(function (swoole_process $worker) use ($i, $urls) {
            //todo
            $content = curlContent($urls[$i]);
            //将数据写进管道
            //echo $content.PHP_EOL;
            //也可以用如下方式 写入管道
            $worker->write($content.PHP_EOL);
        }, true);
        $pid = $process->start();
        $workers[$pid] = $process;
    }
    
    foreach ($workers as $pid=>$worker) {
        echo 'PID:'.$pid.'    data:'.$worker->read();
    }
    
    /**
     * 模拟请求url内容 睡眠两秒
     * @param $url
     * @return string
     */
    function curlContent($url)
    {
        sleep(2);
        return $url . "success" . PHP_EOL;
    }
    
    echo "end_time".date('Ymd H:i:s').PHP_EOL;
    

    运行上面程序,结果如下所示:


    测试结果图片

    可以看出这种方式执行确实比原生的顺序执行的php效率要高很多。

    相关文章

      网友评论

          本文标题:swoole中进程

          本文链接:https://www.haomeiwen.com/subject/ydlmrftx.html