zoukankan      html  css  js  c++  java
  • swoole之创建子进程

    一、代码

    <?php
    
    /**
     * 进程就是正在运行的程序的一个实例
     * 比如,在某个终端中执行一个PHP脚本,可以认为就是开启了一个进程,会有对应的进程id(pid)
     *
     * swoole进程与进程之间是通过管道通信
     */
    
     /**
      * 执行process.php 创建子进程$pid 子进程创建http_server
      *
      * php(11440,主进程)───php(11441,子进程)─┬─php(11442,manager进程)─┬─php(11444,worker进程)
      *                                      │                        ├─php(11445)
      *                                      │                        ├─php(11446)
      *                                      │                        └─php(11447)
      *                                      └─{php}(11443)
      */
    
    $process = new swoole_process(function (swoole_process $worker) {
        // 执行 php http.php 开启http服务器
        $worker->exec("/usr/local/php71/bin/php", [__DIR__.'/../server/http.php']);
    }, true);
    
    $pid = $process->start();
    echo $pid.PHP_EOL;
    
    swoole_process::wait();
    
    /**
     * 模拟爬取多个网站的数据场景
     */
    $urls = [
        'http://www.helloweba.net/php/576.html',
        'http://www.helloweba.net/php/580.html',
        'http://www.helloweba.net/php/581.html'
    ];
    
    $workers = [];
    
    echo 'process start: '.date('Y-m-d H:i:s').PHP_EOL;
    
    for ($i=0; $i<count($urls); $i++) {
        $url = $urls[$i];
        $process = new swoole_process(function (swoole_process $worker) use ($url) {
            $content = curlData($url);
            // echo $content.PHP_EOL;
            $worker->write($content);
        }, true);
        $pid = $process->start();
        $workers[$pid] = $process;
    }
    
    foreach ($workers as $process) {
        echo $process->read();
    }
    
    /**
     * 简化模拟请求
     * @param [type] $url
     * @return void
     */
    function curlData($url)
    {
        sleep(1);
        return "get {$url} content success".PHP_EOL;
    }
    
    echo 'process end: '.date('Y-m-d H:i:s').PHP_EOL;
    
    /*
     输出数据,用时1秒(多进程执行)而不是3秒:
     process start: 2019-05-05 18:02:42
     get http://www.helloweba.net/php/576.html content success
     get http://www.helloweba.net/php/580.html content success
     get http://www.helloweba.net/php/581.html content success
     process end: 2019-05-05 18:02:43
     */

  • 相关阅读:
    【问题】SUSE已经安装了libsodium,安装zeromq时出现下面的错误?
    将博客搬至CSDN
    iOS开发之self.abc = nil与[_abc release]的区别
    Swift编程语言入门教程
    如何使用NSData处理数据
    集合之間的轉換
    數組排序
    集合类的用法总结(NSArray、NSDictionary、NSSet)
    NSString的各种用法总结(创建、截取、判断比较、转化数据类型、拼接、替换、添加、追加、读取、写入、删去、改变)
    instancetype和id的区别
  • 原文地址:https://www.cnblogs.com/cshaptx4869/p/10815350.html
Copyright © 2011-2022 走看看