zoukankan      html  css  js  c++  java
  • PHP中利用pcntl实现多进程(模拟多线程)实例(转)

    windows不支持pcntl的多线程(非Unix类系统不支持此模块),pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它。

    这不,遇到socket问题了,看socket,遇到pcntl了,再看看吧。这里是某个人的测试代码:

    <?php  
    /** 
     * 创建子进程入口 
     * @author selfimpr 
     * @blog http://blog.csdn.net/lgg201 
     * @mail lgg860911@yahoo.com.cn 
     * @param $func_name 代表子进程处理过程的函数名 
     * @param other 接受不定参数, 提供给子进程的过程函数. 
     */  
    function new_child($func_name)  
    {  
        $args = func_get_args();  
        unset($args[0]);  
        $pid = pcntl_fork();  
        if ($pid == 0) {  
            function_exists($func_name) and exit(call_user_func_array($func_name, $args)) or exit(-1);  
        }  
        else if ($pid == -1) {  
            echo "Couldn’t create child process .";  
        }  
    }  
    //测试处理函数, 输出$prefix连接的数组    
    function test($prefix, $num)  
    {  
        while ($i++ < $num) {  
            echo $prefix . $i ."
    ";  
        }  
    }  
    //创建一个子进程    
    new_child("test", "child process ", 100);  
    //父进程也开启一个与子进程同样多的循环.    
    test("parent process", 100);  
    //运行结果, 我这里运行父进程输出50个左右, 子进程开始运行.    
    ?>    
    因为上面有作者有注释,所以我就不再多贴这篇文章的地址了。原网页的代码是错误的。我改了一下。原作者说的是:父进程输出50个左右时,子进程就开始运行了。我这边不是。我把数据改成1000后,发现父进程在950多的时候,子进程开始运行了。
    原作者的博客上还有一个详细介绍:PHP扩展pcntl(进程控制以及信号处理)中文文档 
    当然,看手册也可以,对了,风雪之隅也写过类似的文章,http://www.laruence.com/2009/06/11/930.html,他提到的优点就是:
    XML/HTML代码
    优点:  
        1. 使用多进程, 子进程结束以后, 内核会负责回收资源  
        2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.  
        3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.  
    然后他的代码就与上面有点区别,不过说白了还是大同小异:
    #!/bin/env php  
    <?php  
    /** A example denoted muti-process application in php 
    * @filename fork.php 
    * @touch date Wed 10 Jun 2009 10:25:51 PM CST 
    * @author Laruence<laruence@baidu.com> 
    * @license http://www.zend.com/license/3_0.txt PHP License 3.0 
    * @version 1.0.0 
    */  
       
    /** 确保这个函数只能运行在SHELL中 */  
    if (substr(php_sapi_name(), 0, 3) !== 'cli') {  
        die("This Programe can only be run in CLI mode");  
    }  
       
    /** 关闭最大执行时间限制, 在CLI模式下, 这个语句其实不必要 */  
    set_time_limit(0);  
       
    $pid = posix_getpid(); //取得主进程ID  
    $user = posix_getlogin(); //取得用户名  
       
    echo <<<EOD  
    USAGE: [command | expression]  
    input php code to execute by fork a new process  
    input quit to exit  
       
            Shell Executor version 1.0.0 by laruence  
    EOD;  
       
    while (true) {  
       
            $prompt = "
    {$user}$ ";  
            $input = readline($prompt);  
       
            readline_add_history($input);  
            if ($input == 'quit') {  
                   break;  
              }  
            process_execute($input . ';');  
    }  
       
    exit(0);  
       
    function process_execute($input) {  
            $pid = pcntl_fork(); //创建子进程  
            if ($pid == 0) {//子进程  
                    $pid = posix_getpid();  
                    echo "* Process {$pid} was created, and Executed:
    
    ";  
                    eval($input); //解析命令  
                    exit;  
            } else {//主进程  
                    $pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态  
                    if (pcntl_wifexited($status)) {  
                            echo "
    
    * Sub process: {$pid} exited with {$status}";  
                    }  
            }  
    }  

    做个笔记先。

  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/phpper/p/9131274.html
Copyright © 2011-2022 走看看