// PHP 所有 IO 都是流 // 两个特殊函数 popen() // 说明: popen() 只向一个程序提供单向的 IO,可以只用 w 活 r 作为打开模式。当为一个程序打开流时,也可以叫做一个 管道,可以使用所有常规的文件函数来从该管道读取或者写入,并且使用 feof() 来检测文件是否还有为读取的数据 <?php $fp = popen('ls -l /', 'r'); while( ! feof( $fp)){ echo fgets( $fp); } pclose( $fp); // 读取根目录文件列表 ?> // popen() 有很大的限制,不能与打开的进程进行任何交互,这点可以用 proc_open() 来代替 // 通过 proc_open(),可以连接所有进程的输入和输出句柄到一个可以读取的管道,或者是可以在脚本中写入管道,或是一个文件。管道被当作文件句柄来处理,只不过不能同时针对读取和写入打开一个文件句柄。 proc_open() resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] ) // 对函数声明的参数作下说明: // $cmd: 要执行的命令(在 php 脚本中启动一个子进程) // $descriptorspec: 索引数组,数组键表示描述符(描述针对输入或输出的一个文件处理器),键值代表 PHP 怎么传递这个文件处理器给子进程,0 代表标准输入,1 标准输出,2 标准错误 // 数组的每个元素可以是: // * 一个描述管道的 数组 , 这个数组的第一个元素的管道的类型,第二个是给定管道的选项,有效的管道类型是: pipe{这时数组的第二个元素是 'r' 或 'w'}, file{这时数组的第二个元素是文件名字} // * 一个代表文件处理器的流{eg, 打开的文件,socket, STDIN} // 以上这几中情况在下面的例子中都包括了 <?php $fin = fopen( 'readfrom', 'rb'); $fout = fopen( 'writeto', 'wb'); $desc = array( 0 => $fin, 1 => $fout); $res = proc_open( 'php', $desc, $pipes); if( $res){ proc_close( $res); } // 脚本为 php 启动一个解释器--一个子进程,子进程从 $fin 中读取数据交给 php 解释器处理,结果输出到 $fou // readfrom 内容 // <?php // echo 'hello world'; // ?> // 程序运行后 writeto 的内容 // hello world ?> <?php $desc = array( 0 => array( 'pipe', 'r'), 1 => array( 'pipe', 'w'), ); $res = proc_open( 'php', $desc, $pipes); if( is_resource( $res)){ fputs( $pipes[0], '<?php echo "hello world" ?>'); fclose( $pipes[0]); while( !feof( $pipes[1] )){ $line = fgets( $pipes[1]); echo $line; } } ?> <?php $desc = array( 0 => array( 'pipe', 'r'), 1 => array( 'file', 'out.dat', 'w'), 2 => array( 'file', 'error.dat', 'w') ); $res = proc_open( 'php', $desc, $pipes); if( is_resource( $res)){ fputs( $pipes[0], '<?php echo "hello world"; ?>'); fclose( $pipes[0]); proc_close( $res); } // PHP 所有 IO 都是流 // 两个特殊函数 popen() // 说明: pope 你的当前访问异常,请进行认证后继续阅读剩余内容。 提交