标题:[实践OK]协程 shell_exec 如何捕获标准错误流 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 03 Nov 2020 14:30:48 +0000 作者:jackxiang 地址:https://jackxiang.com/post/10747/ 内容: 问题:用Co\System::exec()执行了一个不存在的命令时,错误信息会直接打印到屏幕,而不是返回错误信息。 怎么办:实际上Swoole提供的System::exec()行为上与PHP的shell_exec是完全一致的,我们写一个shell_exec的同步阻塞版本,执行后发现同样拿不到标准错误流输出的内容,会被直接打印到屏幕。 答案: 使用proc_open+hook实现。 现象: /dev/null 2>&1 果然,怎么办?加入管道,将此错误指向新的文件描述符。 前置:打开php.ini里面的proc_open禁用函数。 #cat t.php 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 "command returned $return_value\n"; }); #php t.php array(3) { [0]=> resource(4) of type (stream) [1]=> resource(5) of type (stream) [2]=> resource(6) of type (stream) } string(31) "sh: unknown: command not found " command returned 32512 代码来自rango:https://mp.weixin.qq.com/s/z7SPy-tV3hsQqLXZ-tKlZw Generated by Jackxiang's Bo-blog 2.1.1 Release