2010-10-05 22 views
33

Tôi đang cố gắng để có được đầu ra nhất định cho lệnh svn ở định dạng XML. Đầu ra là ok khi tôi nhập các thông số hợp lệ. Tuy nhiên, khi tôi nhập sai mật khẩu, đầu ra không hiển thị thông báo lỗi. Đây là mã PHP:PHP exec() không trả về thông báo lỗi trong đầu ra

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output); 

Dưới đây là kết quả tôi nhận được trong terminal:

<?xml version="1.0"?> 
<log> 
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com) 

Và đây là kết quả tôi nhận được từ các biến đầu ra $ với var_dump:

array(2) { 
[0]=> 
string(21) "<?xml version="1.0"?>" 
[1]=> 
string(5) "<log>" 
} 

Như bạn có thể thấy biến đầu ra $ không trả lại dòng đầu ra thứ ba, nơi thiết bị đầu cuối thực hiện. Xin hãy giúp tôi để có được cùng một đầu ra như tôi nhận được trong thiết bị đầu cuối (tôi thậm chí đã thử với shell_exec() hoặc hệ thống() phương pháp nhưng họ trở lại cùng một đầu ra như exec()) Làm thế nào để có được sản lượng đầy đủ? Cảm ơn bạn trước!

Trả lời

62

Bạn cần phải nắm bắt được stderr quá.

Chuyển hướng stderr đến stdout nên thực hiện thủ thuật. Thêm 2>&1 vào cuối lệnh của bạn.

ví dụ:

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output); 
+0

Điều này giải quyết được sự cố. Cảm ơn nhiều. – Goran

+8

Ngoài ra: không phải là nó kỳ quái là exec của PHP không cung cấp một cách đơn giản để nắm bắt đầu ra 'stderr' một cách riêng biệt? –

-2

Bạn cần phải xác định một biến trong đó để lưu trữ các thông điệp

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51 _activecollab/');

0

Đó có lẽ không phải là giải pháp, chỉ là một gợi ý xấu: có bạn cố gắng thêm một tiếng vang thêm trong lệnh:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output); 

Và cách khác để giải quyết điều đó là đã được đề cập: nếu bạn không có dòng cuối cùng trong $ output, thì giá trị trả về của hàm exec() sẽ được trả về. Bạn sẽ phải sau đó

$totalOutput = push($msg,$output); 

với

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output); 
Các vấn đề liên quan