6

PHP スクリプトを使用して siege コマンドを実行し、出力を取得しようとしています。

シェルで次を実行すると、次の結果が得られます。

$ /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

exec()、shell_exec()、system() を介して PHP で同じコマンドを実行すると、次の出力しか表示されません。

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

1 に答える 1

4

siege プログラムは、出力を 2 つの異なる標準ストリームstdoutとに書き込みますstderr。PHP のexec()唯一のキャプチャstdout. 両方をキャプチャするには、PHP がキャプチャする 1 つのストリームにすべてが含まれるように(シェルを使用して)にリダイレクト する必要があります。stderrstdout

これを行うに2>&1は、コマンドの最後に追加します。あなたの例では、それは次のようになります。

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

(私は siege をインストールし、それが stdout と stderr の両方を使用し、出力のリダイレクトが機能することを確認しました。)

于 2013-08-18T01:03:18.617 に答える