PHP Exec() 后的 StdErr
在 PHP 中,我使用 exec() 执行命令,如果成功则返回一个 URL;
$url = exec('report');
但是,我想检查 stderr,是否出现问题。我将如何读取流? 我想使用 php://stderr,但我不知道如何使用它。
In PHP I am executing a command with exec(), and it returns if successful an URL;
$url = exec('report');
However, I want to check stderr, if something went wrong. How would I read the stream?
I want to use php://stderr, but I am not sure how to use it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您想执行命令,并同时获取
stderr
和stdout
,而不是“合并”,解决方案可能会使用proc_open
,它提供了对正在执行的命令的高级控制 - 包括一种管道stdin
/stdout
/stderr
的方法。这是一个例子:让我们考虑一下
test.sh
中有这个 shell 脚本,它写入stderr
和stdout
:现在,让我们在
temp.php
中编写一些 PHP 代码——首先,我们初始化 i/o 描述符:然后,使用这些描述符执行
test.sh
命令,在当前目录中,并说 i/o 应该是 from/to$pipes
:我们现在可以从两个输出管道读取:
并且,如果我们输出这两个变量的内容:
我们执行
temp.php
脚本时得到以下输出:If you want to execute a command, and get both
stderr
andstdout
, not "merged", a solution would probably to useproc_open
, which provides a great level of control over the command that's being executed -- including a way to pipestdin
/stdout
/stderr
.And here is an example : let's consider we have this shell-script, in
test.sh
, which writes to bothstderr
andstdout
:Now, let's code some PHP, in
temp.php
-- first, we initialize the i/o descriptors :And, then, execute the
test.sh
command, using those descriptors, in the current directory, and saying the i/o should be from/to$pipes
:We can now read from the two output pipes :
And, if we output the content of those two variables :
We get the following output when executing the
temp.php
script :一个可能有用的小功能:
返回退出代码,如果需要的话,STDOUT 和 STDERR 是参考参数。
A little function that might be helpful:
The exit code is returned and STDOUT and STDERR are reference params if you need them.
使用
exec
执行此类操作的简短方法是返回退出代码(命令的状态)请注意,我正在尝试列出一个不存在的目录
/non-dir/< /代码>
输出
通常在基于 UNIX 的系统中,大多数成功的状态代码是 ( 0 ),因此您可以检查
$retval
以了解命令的状态。要消除列出无效路径的错误
ls:无法访问'/non-dir/':没有这样的文件或目录
,您可以将stderr重定向到null,这将输出:
另外,如果您需要错误字符串在任何情况下使用它,您可以将 stderr 重定向到 stdout。
这将输出以下内容:
The short way to do such a things with
exec
is to return the exit code ( status of the command )Note that I am trying to list a non-exists directory
/non-dir/
Output
Normally in unix-based system most of successful statuses codes is ( 0 ) so you can check your
$retval
to know the status of the command.to dismiss the error from listing an invalid path
ls: cannot access '/non-dir/': No such file or directory
you can redirect your stderr to nullthis will output :
also if you need the error string to use it in any scenario you may redirect your stderr to the stdout.
this will output the following:
取消合并 stdout/stderr 的另一种方法。
如果您想忽略 stdout 并仅获取 stderr,您可以尝试以下操作:
Another way to get unmerged stdout/stderr.
If you want to ignore stdout and get only stderr, you can try this:
2>&1 将 stderr 重定向到 stdout,以获得一致的成功/失败行为。
$exitCode 确定 $command 完成状态。
$output 包含与 $exitCode 关联的所有输出。
2>&1 redirects stderr to stdout for consistent success / fail behaviour.
$exitCode determines $command completion status.
$output contains all output associated with $exitCode.
有点丑但是足够好了。将 stderr 放入临时文件中并将其读回。
Slightly ugly but good enough. Put the stderr into a temp file and read it back.