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

采用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") // 标准错误,写入到一个文件
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。换句话说就是,在系统调度多个cpu的时候,一...
    林湾村龙猫阅读 13,360评论 1 60
  • 人生有无限种可能, 灵魂不应该被禁锢, 梦想不应该被扼杀, 哪怕只是大脑中一闪而过的念头, 也可能在未来实现。 哪...
    听听侯小乖的心事阅读 1,474评论 0 0
  • 今天北京下雪了,看到有人感慨说冬的挽留。是冬的挽留还是春的无奈。人生虽长却也转瞬即逝,可能就今天刚刚下到地上的雪,...
    画中看风景阅读 348评论 0 0
  • 不知道还有什么可以帮助我们挽留一些岁月的痕迹。文字和影像的记录可能会带来一点点的安慰和方法吧。不知道在这里写好之后...
    Shellcoast阅读 244评论 0 1
  • 我们可以错失一次成功,可以浪费一天时间,可以失去一次机会,但我们不能失去健康。因为,身体是生命的基础,是实现梦想的...
    IT学思想阅读 855评论 0 3