当前位置: 首页 > Linux

协程shell_exec是如何捕获标准错误流的

时间:2023-04-06 19:19:50 Linux

今天在GitHub主页上看到一个外国朋友的一个很有意思的问题。当他使用Co\System::exec()执行一条不存在的命令时,错误信息会直接打印到屏幕上,而不是返回错误信息。事实上,Swoole提供的System::exec()的行为与PHP的shell_exec完全相同。我们编写一个同步阻塞版本的shell_exec。执行完后发现我们获取不到标准错误流输出的内容,会直接打印到Screen上。array("pipe","r"),1=>array("pipe","w"),2=>array("pipe","w"),);$process=proc_open('unknown',$descriptorspec,$pipes);var_dump($pipes);var_dump(fread($pipes[2],8192));$return_value=proc_close($process);echo"命令返回$return_value\n";});使用proc_open,传入3个描述:fd为0的流是标准输入,可以在主进程向这个流写入数据,子进程可以拿到数据。fd为1的流是标准输出。在这里可以获取命令执行的输出内容。fd为2的管道流是stderr,可以通过读取stderr得到错误信息输出,使用fread得到标准错误流的输出内容。htf@htf-ThinkPad-T470p:~/workspace/swoole/examples/coroutine$phpproc_open.phparray(3){[0]=>类型(流)的资源(4)[1]=>资源(5)的type(stream)[2]=>resource(6)oftype(stream)}string(26)"sh:1:unknown:notfound"命令返回32512htf@htf-ThinkPad-T470p:~/workspace/swoole/examples/coroutine$Swoole正在参加2020OSC中国开源项目评选,请点击下方链接投票,投票链接:https://www.oschina.net/p/swoole-server