PHP shell_exec()、exec()和system()只返回部分输出


PHP shell_exec(), exec(), and system() returning only partial output

我正在尝试使用PHP脚本来运行围攻命令并获取输出。

在shell中运行以下操作可获得以下结果:

$ /usr/local/bin/siege -c30 -t30s -f urls.txt
.....
HTTP/1.1 200   0.10 secs:   11246 bytes ==> GET  /*******.html
HTTP/1.1 200   0.11 secs:   11169 bytes ==> GET  /*******.html
HTTP/1.1 200   0.10 secs:   11246 bytes ==> GET  /*******.html
Lifting the server siege..      done.
Transactions:               1479 hits
Availability:             100.00 %
Elapsed time:              29.05 secs
Data transferred:          14.69 MB
Response time:              0.10 secs
Transaction rate:          50.91 trans/sec
Throughput:             0.51 MB/sec
Concurrency:                5.33
Successful transactions:        1479
Failed transactions:               0
Longest transaction:            0.16
Shortest transaction:           0.09

当在PHP中通过exec()、shell_exec()、system()运行相同的命令时,我只收到以下输出。

HTTP/1.1 200   0.10 secs:   11246 bytes ==> GET  /*******.html
HTTP/1.1 200   0.11 secs:   11169 bytes ==> GET  /*******.html
HTTP/1.1 200   0.10 secs:   11246 bytes ==> GET  /*******.html

由于我真的只对围攻提供的结果感兴趣,所以这些数据对我来说毫无用处。出于某种原因,它忽略了围攻的结果。

下面是我用PHP做的一个例子。。。

exec('/usr/local/bin/siege -c30 -t30s -f urls.txt', $output);

围攻程序将其输出写入两个不同的标准流:stdoutstderr。PHP的exec()只捕获stdout。要同时捕获这两个,您需要(使用shell)将stderr重定向到stdout,以便所有内容都在PHP捕获的一个流中。

要执行此操作,请在命令的末尾添加2>&1。在您的示例中,这将是:

exec('/usr/local/bin/siege -c30 -t30s -f urls.txt 2>&1', $output);

(我已经安装了siege,并验证了它同时使用stdout和stderr,以及输出重定向是否有效。)