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

PHP shell_exec()、exec()和system()仅返回部分输出,php,shell,Php,Shell,我正在尝试使用PHP脚本来运行seake命令并捕获输出 在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

我正在尝试使用PHP脚本来运行seake命令并捕获输出

在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);

攻城程序将其输出写入两个不同的文件:
stdout
stderr
。PHP的
exec()
只捕获
stdout
。要捕获这两个,您需要
stderr
stdout
,以便所有内容都在PHP捕获的一个流中

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

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

(我已经安装了Seave,并验证了它同时使用stdout和stderr,并且输出重定向工作正常。)

+1:做得好。显而易见的东西,但只有当您已经意识到应用程序可以输出到任何一个流时。手动操作终端本身并不清楚。工作非常完美。谢谢!我能够使用下面的代码只获取stderr输出
/usr/local/bin/seake-c30-t30s-f url.txt 2>&1>/dev/null
有更好的方法吗?