2008-12-06 26 views
17

Dưới đây là lệnh tôi đã cố gắng thực hiện, nhưng không thành công:Làm cách nào để truy xuất phản hồi lỗi PHP exec()?

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess'); 

Khi bạn thêm một die() ở cuối, nó bắt rằng có một lỗi:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!'); 

Đối với exec ở trên (), một vấn đề quyền hạn gây ra lỗi, nhưng PHP không hiển thị nó. Làm thế nào để bạn hiển thị từ PHP những gì lỗi đang xảy ra?

Trả lời

15

Bạn có thể nhận được kết quả đầu ra của exec function bằng cách thông qua một tham số tùy chọn thứ hai:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output); 
var_dump($output); 
+5

$ đầu ra trong trường hợp này sẽ chỉ giữ được kết quả từ sdtout không từ các sdterr – Amaynut

2

Nếu bạn không tìm thấy lỗi thông qua đó tham số thứ hai, bạn có thể tìm kiếm các bản ghi lỗi của apache, ví dụ trong Ubuntu Server 12.10 thông qua lệnh $ tail /var/log/apache2/error.log Tôi đã chạy một tập lệnh python từ php, có lỗi chỉ được in ở đó, và do đó tôi đã có thể chẩn đoán nó. Trân trọng.

7

Thông số đầu ra $ dường như không hoạt động nếu chương trình gọi điện kích hoạt đầu ra thành STDERR.

Cách tốt hơn để xử lý việc này là chuyển hướng đầu ra từ exec đến một tệp và sau đó hiển thị nội dung của tệp đó nếu có điều kiện lỗi.

Nếu $ cmd giữ lệnh exec thêm một cái gì đó như thế này:

$cmd.=" > $error_log 2>&1" 

Sau đó kiểm tra các nội dung của filespec trong $ error_log để biết chi tiết về lý do tại sao lệnh thất bại. Cũng cần lưu ý rằng nếu bạn ngắt kết nối bằng một số & ở cuối lệnh, kiểm tra ngay nội dung của $ error_log có thể không tiết lộ thông tin nhật ký - tập lệnh có thể kiểm tra/xử lý tệp trước khi hệ điều hành có đã kết thúc.

6

Các mã sau sẽ chụp cả hai đầu ra bình thường (từ stdout) và đầu ra lỗi (từ SdtErr).

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output); 
var_dump($output); 
+0

Làm việc cho tôi :) – vijay

2

này đã làm việc cho tôi trong một vài tình huống:

ob_start(); 
exec($cmd . " 2>&1", $output); 
$result = ob_get_contents(); 
ob_end_clean(); 
var_dump($result); 

Khoảng cách giữa "2 là quan trọng

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