2013-10-09 23 views
8

cURL làm cho PHP ném một lỗi nghiêm trọng nếu mất hơn 30 giây để nhận phản hồi từ máy chủ. Điều này dường như đang xảy ra rất nhiều trong ứng dụng web của tôi, đặc biệt nếu máy chủ khác bận. Nó thực sự không phải là khá cho người dùng thấy điều đó.thời gian chờ của cURL, bạn có thể xử lý nó một cách thanh lịch không?

Tôi muốn bắt kịp thời gian chờ và hiển thị bản thân một cách dễ dàng, hoặc cách khác, tôi tự hỏi liệu có cách nào tôi có thể tiếp tục với phần còn lại của tập lệnh PHP hay không nếu không có phản hồi từ máy chủ (với các giá trị mặc định).

Tôi không thực sự hiểu tại sao cURL sẽ ném Lỗi nghiêm trọng thay vì Cảnh báo cho thời gian chờ thành thật. Đó là một nỗi đau thực sự.

Trả lời

5

Tăng thời gian chờ cURL sử dụng các params

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 500); 

Kể từ khi bạn đề cập đến 30 giây, tôi nghi ngờ rằng thời gian chờ PHP Script của bạn đang cạn kiệt. Vì vậy, hãy thêm mã này vào mã PHP của bạn.

set_time_limit(0);// 0 is infite limit 
+0

Aha cảm ơn vì điều đó. Là khá mới với PHP tôi đã không nhận thức được rằng nó đã được PHP chính nó cho phép một tối đa 30 giây để thực hiện một kịch bản. Tôi nghĩ rằng lỗi nghiêm trọng đã được ném bởi curl. Cảm ơn vì điều đó, nó giúp nhưng nó không thực sự là giải pháp mà tôi đã hy vọng. – Juicy

+1

Chắc chắn, tăng time_limit đến vô cùng khi phát triển, nhưng đó là một ý tưởng khủng khiếp cho sản xuất. – coderama

+0

Câu trả lời này không cho bạn biết làm thế nào để bắt lỗi (đó là những gì tôi đang tìm kiếm), nó chỉ cho bạn biết làm thế nào để tránh lỗi. Thậm chí có thể giới hạn thời gian cho một curl_exec mà không sử dụng cài đặt đó không? – cesoid

4

Đây là câu trả lời hơi có nghĩa đen hơn cho câu hỏi. Đó là, curl sẽ vẫn dừng lại sau 30 giây, nhưng bạn có thể bắt lỗi và tiếp tục nếu bạn muốn.

ini_set('max_execution_time', 40); // prevents 30 seconds from being fatal 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_TIMEOUT, 30); // curl timeout remains at 30 seconds 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 
curl_exec($ch); 

if ($error_number = curl_errno($ch)) { 
    if (in_array($error_number, array(CURLE_OPERATION_TIMEDOUT, CURLE_OPERATION_TIMEOUTED))) { 
     print "curl timed out"; 
    } 
} 

curl_close($ch); 

Nếu bạn không kiểm soát được max_execution_time, bạn có thể giảm thời gian chờ curl xuống một chút.

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