php proc_open 读取子进程的数据

<?php

/*
 * 读取子进程的数据与超时设置
*/

//主进程文件
$child_file = "echo.php";

$descriptorspec = array(
    0 => array("pipe", "r"),        // 标准输入,子进程从此管道中读取数据
    1 => array("pipe", "w"),        //STDOUT     标准输出,重定向子进程输入到主进程STDOUT
    2 => array("file", "error-output.txt", "a")         // 标准错误,写入到一个文件
);

//生成子进程。
$child_process = proc_open("php {$child_file}", $descriptorspec, $pipes);
/*
//write
while(1){
    $time = date("Y-m-d h:i:s");
    fwrite($pipes[0], "main say {$time}\n");
    sleep(1);
}
*/

//$cotent = stream_get_contents($pipes[1], 5);  //可用于阻塞读取
//var_dump($cotent);

stream_set_blocking($pipes[1], 0);   //非阻塞

$read = array($pipes[1]);
$write = null;
$except = null;
$timeleft = 0;
$stdout_str = '';
//$endtime = time() + $timeout;

do {
    //$timeleft = $endtime - time();

    //等待调度
    $ret = stream_select(
        $read,
        $write,
        $except,
        $timeleft
    );

    if ($ret === false) {
        $err = true;
        break;
    } else if ($ret === 0) {
        $timeleft = 0;
        break;
    } else {
        //把输出一次的数据一次读取完,按照fread读取的数量分次数。
        foreach ($read as $sock) {
            if ($sock === $pipes[1]) {
                //$stdout_str .= fread($sock, 4096);
                $stdout_str = fread($sock, 4096);
                var_dump($stdout_str);
            }
        }
    }
}while((feof($pipes[1]) === false));
//}while(feof($pipes[1]) === false  && $timeleft > 0);

proc_close($child_process);

  

echo.php

<?php
ob_implicit_flush(true);

$i = 0;
while(1){
    //while($stdin = fread(STDIN, 65535)){

        if ($i > 2) exit();

        echo str_repeat('*', 100)."\t$i\techo\n";
        sleep(1);
    //}
    $i++;
}

  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值