Swoole 进程Process 持续更新

Swoole 进程Process 持续更新

需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大。另外创建的进程过多会导致进程切换开销大幅上升

Swoole\Process特性:

  1. 基于Unix Socket和sysvmsg消息队列的进程间通信,只需调用write/read或者push/pop即可
  2. 支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
  3. 配合Event模块,创建的PHP子进程可以异步的事件驱动模式
  4. 提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信

简单实现

process.php

<?php
/**
 * Created by PhpStorm.
 * User: dom
 * Date: 19-2-22
 * Time: 下午5:34
 */

$redirectStdinStdout = false; // true:进程输出不会显示在终端,会直接进入管道 false:则会进入显示终端
$process = new swoole_process(function (swoole_process $pro){
    // 逻辑代码
    echo '123123';
    $pro->exec('/usr/local/bin/php', ['/var/www/project/yii-best-practice/cli/yii',
        't/index', '-m=123', 'abc', 'xyz']); // exec 系统调用

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

swoole_process::wait(); // 回收结束运行的子进程。

拓展实现

<?php
/**
 * Created by PhpStorm.
 * User: dom
 * Date: 19-2-23
 * Time: 上午10:29
 */

echo '开始子进程' . date("Y-m-d H:i:s") . PHP_EOL;

$data = [
    'https://baidu.com',
    'https://qq.com',
    'https://blog.csdn.net',
];
$workers = [];

foreach ($data as $key => $item) {
    // 子进程
    $process = new swoole_process(function (swoole_process $worker) use ($key, $item) {
        // curl
        $content = curlData($item);
        $worker->write($content. PHP_EOL); // 写入管道
//        echo $content . PHP_EOL;
    }, true);
    $pid = $process->start();
    $workers[$pid] = $process;
}

foreach ($workers as $worker) {
    echo $worker->read(); // 读取每个管道的内容
}

/**
 * 逻辑方法
 * @author: ZhuBN
 * Date: 19-2-23 上午10:53
 *
 * @param $url
 *
 * @return string
 */
function curlData($url)
{
    sleep(2);
    return 'success:' . $url;
}

swoole_process::wait(); // 回收结束运行的子进程。
echo '结束子进程' . date("Y-m-d H:i:s") . PHP_EOL;

如果是php的形式的执行类似功能效果的话 需要用到的是 2*3秒,用上进程的话只需要2秒就出结果
当然其他异步形式也可以实现,但是进程可以考虑搭配脚本来使用,比如脚步爬虫之类的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章