美文网首页
proc_open双管道,多线程执行命令

proc_open双管道,多线程执行命令

作者: phpworker | 来源:发表于2017-12-11 14:19 被阅读0次

    采用cli的方式运行PHP脚本

    STDIN:读取脚本的输入字符

    <?php
    echo "please input a string:";
    $stdin=fread(STDIN,65535);
    echo "you have input:$stdin";
    exit;
    

    从命令行输入字符,能看到打印出对应的字符;注意fread会阻塞进程,必须输入之后,程序才会继续执行

    PHP开启一个子进程

    index.php

    
    $child_file = "proc.php";
    
    $descriptorspec = array(
        0 => array("pipe", "r"),  // 输入,子进程从此管道中读取数据
        1 => array("pipe", "w"),  // 输出,子进程输出
        2 => array("file", "error-output.txt", "a") // 标准错误,写入到一个文件
    );
    $child_process = proc_open("php {$child_file}", $descriptorspec, $pipes);
    echo "please input:";
    
    $stdin=fread(STDIN,65535);
    echo "you hanve input $stdin";
    fwrite($pipes[0], $stdin);
    
    $stdout=fread($pipes[1],65535);
    echo "parent recieve : $stdout";
    
    proc_close($child_process);
    exit;
    

    proc.php

     <?php
    $stdin = fread(STDIN, 65535);
    sleep(3);
    echo "parent process transmit:" . $stdin;
    

    运行index.php,提示请输入,当输入字符之后,index将输入的打印出来,等待3秒之后,proc又将收到的字符返回给index,由index再次打印出来。效果如图:


    image.png

    proc_open($file,$descriptorspec,$pipes)

    开启一个子进程。
    $file:子进程要打开的脚本
    $descriptorspec:输入输出读取的配置文件,数组

    $descriptorspec=array(
        0 =>input,  
    // input= array("pipe", "r")则主进程从 $pipes[0]写入数据,子进程从STDIN中读取$pipes[0]中的数据
    //input=STDIN  则子进程从主进程的STDIN中读取数据
    输入,子进程从此管道中读取数据
        1 =>output,  
    //output= array("pipe", "w")  主进程echo/print_r的内容输出到$pipes[1]中,主进程从$pipes[1]中取数据
    //output=STDOUT 子进程输出的数据,直接输出的到父进程的STDOUT中
        2 => array("file", "error-output.txt", "a") // 标准错误,写入到一个文件
    );
    

    相关文章

      网友评论

          本文标题:proc_open双管道,多线程执行命令

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