2013-08-18 30 views
6

Tôi đang cố gắng sử dụng một tập lệnh PHP để chạy lệnh bao vây và nắm bắt đầu ra.PHP shell_exec(), exec() và hệ thống() chỉ trả về một phần đầu ra

Chạy sau trong vỏ cung cấp các kết quả này:

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

Khi chạy lệnh tương tự trong PHP qua exec(), shell_exec(), hệ thống(), tôi chỉ nhận được đầu ra sau đây.

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 

Vì tôi thực sự chỉ quan tâm đến kết quả được cung cấp bởi cuộc vây hãm, dữ liệu này vô dụng đối với tôi. Đối với một số lý do nó bỏ qua các kết quả của cuộc vây hãm.

Dưới đây là một ví dụ về những gì tôi đang làm trong PHP ...

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

Trả lời

4

Chương trình bao vây viết sản lượng của nó để hai khác nhau standard streams: stdoutstderr. PHP exec() chỉ chụp stdout. Để chụp cả hai, bạn cần phải redirect (using your shell)stderr đến stdout để mọi thứ nằm trong một luồng mà PHP nắm bắt.

Để thực hiện việc này, hãy thêm 2>&1 vào cuối lệnh của bạn. Trong ví dụ của bạn, đó sẽ là:

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

(Tôi đã cài đặt bao vây và xác minh rằng nó sử dụng cả stdout và stderr và chuyển hướng đầu ra hoạt động.)

+0

1: Làm tốt lắm. Những thứ rõ ràng, nhưng chỉ một khi bạn đã biết rằng các ứng dụng có thể xuất ra một trong hai luồng. Nó không rõ ràng từ làm việc với một thiết bị đầu cuối bằng tay. –

+0

Hoạt động hoàn hảo. Cảm ơn rất nhiều! Tôi đã có thể sử dụng những điều sau đây để có được đầu ra stderr '/ usr/local/bin/siege -30 -30s -f urls.txt 2> & 1>/dev/null' Có cách nào tốt hơn để làm cái này? – theseanstewart

Các vấn đề liên quan