Giả sử hệ thống trở $ result == -1 là Unix-like dựa (Tôi không biết làm thế nào sẽ hành xử Windows với cùng mã)
Các PHP (5.2.9) exec() chức năng không không gọi C exec() nguyên thủy (trả về -1 nếu nó không thể thay thế/thực hiện quá trình, mà không phải là trường hợp ở đây). Thay vào đó, nó gọi popen() tạo ra một đường ống, thực hiện một fork() và thực thi một shell với lệnh của bạn. return_value, -1, không phải là kết quả trực tiếp từ nguyên thủy C, mà đúng hơn là được xây dựng bởi PHP nội bộ, tùy thuộc vào cách lệnh của bạn được xử lý. Nói cách khác, lệnh "ls" có thể đã được thực hiện tốt, trong khi ví dụ PHP không thể đóng đúng đường ống.
Nhìn vào mã C, trong ext/standard/exec.c, có thể có hai lý do tại sao mã trả về là -1, được kích hoạt bởi lỗi; trường hợp thứ hai xảy ra sau popen() gọi
fp = VCWD_POPEN(cmd_p, "r");
if (!fp) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to fork [%s]", cmd);
goto err;
}
// ...
err:
pclose_return = -1;
goto done;
Tuy nhiên trong trường hợp này, bạn sẽ không thấy kết quả và nhật ký sẽ hiển thị lỗi.
Sau đó, return_value được thiết lập thông qua dòng
pclose_return = php_stream_close(stream);
Nhìn vào _php_stream_free() (php_stream_close() là một macro thay thế bằng _php_stream_free()), các ứng cử viên có khả năng nhất mà có thể trở lại -1 là
ret = stream->ops->close(stream, preserve_handle ? 0 : 1 TSRMLS_CC);
Lần lượt gọi gián tiếp C nguyên bản(). Theo hướng dẫn sử dụng
Hàm pclose() trả về -1 nếu wait4 (2) trả về lỗi hoặc phát hiện một số lỗi khác.
Dường như có lỗi được phát hiện trong khi đóng ống, điều đó không ngăn dữ liệu kết quả được đặt.Để tìm ra lý do một cách nghiêm ngặt, bạn cần phải kiểm tra thiết lập và nhật ký hệ điều hành, cấu hình PHP và các tham số biên dịch.
Tôi muốn giới thiệu
- để áp dụng các bản vá lỗi cho hệ điều hành của bạn, và có thể nâng cấp lên phiên bản mới hơn (nếu có),
- để cập nhật PHP để 5.3.3 (mới nhất tính đến nay) kể từ mã PHP exec() đã thay đổi đáng kể.
Lưu ý rằng có những thay đổi liên quan đến mô-đun suhosin PHP trong phiên bản 5.3 nâng cao theo mặc định bảo mật khi chạy tệp PHP.
Điều gì nếu biến '$ command' của bạn là một chuỗi rỗng sao cho' exec() 'không đưa ra đối số nào cho' ls'? Mã thoát có còn '-1' không? Nếu vậy, bạn đã kiểm tra việc triển khai 'ls' cho hệ thống hiện tại của bạn bằng' man ls' để xem liệu mã thoát '-1' có được xác định không? Điều này có đúng với các lệnh khác (có lẽ là 'du -h index.html')? – sleepynate
Có vẻ như tôi không thể gọi 'exec (" ")'. Nó in một cảnh báo. Bất kỳ lệnh nào khác cũng hoạt động giống nhau. 'sleep 5' trả về với -1,' lsmod' trả về -1 vv ... – Quamis
Điều duy nhất tôi có thể thấy là [bài đăng trên trang hướng dẫn sử dụng php exec] (http://www.php.net/manual /en/function.exec.php#76687) nhưng kể từ khi nó làm việc trên các máy chủ khác nó không rõ ràng lý do tại sao nó sẽ được điều này. – Troubadour