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