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

2017-12-11  本文已影响0人  phpworker

采用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") // 标准错误,写入到一个文件
);
上一篇下一篇

猜你喜欢

热点阅读