2010-09-11 17 views
13
$url = 'http://a.url/i-know-is-down'; 

//ini_set('default_socket_timeout', 5); 

$ctx = stream_context_create(array(
    'http' => array(
     'timeout' => 5, 
     'ignore_errors' => true 
     ) 
    ) 
); 

$start = microtime(true); 
$content = @file_get_contents($url, false, $ctx); 
$end = microtime(true); 
echo $end - $start, "\n"; 

phản hồi tôi nhận được thường là 21,232 segs, không nên là khoảng năm giây ???PHP file_get_contents bỏ qua thời gian chờ?

Bỏ ghi chú dòng ini_set không giúp gì cả.

+0

Bạn có thể thử tắt cả "ignore_errors" cờ cũng như @file_get_contents im lặng() gọi và xem nếu có bất kỳ lỗi rõ ràng bật ra? –

+0

@ Mahdi.M: Tôi không thể tắt 'ingnore_errors' vì tôi cần phân biệt giữa lỗi 404 và lỗi do các sự cố kết nối tạo ra. Hãy để tôi rephrase nó. Nếu ingnore_errors' bị tắt và máy chủ trả lại nội dung 404 $ sẽ là sai và tôi cần biết liệu nội dung $ nếu sai do lỗi 404 hoặc beacuse lỗi kết nối. Lỗi hiển thị khi tôi chặn toán tử @ là một toán tử chung như 'file_get_contents (tên tệp): không mở được luồng ' – Cesar

+2

Theo quy tắc chung, bạn không bao giờ cần sử dụng @. Nếu nó quan trọng đối với ứng dụng của bạn, bạn có thể viết nó theo cách sai. Không phải lúc nào, nhưng khá là thường xuyên! –

Trả lời

13

Bạn đang đặt đọc hết giờ với socket_create_context. Nếu trang bạn đang cố gắng truy cập không tồn tại thì máy chủ sẽ cho phép bạn kết nối và cung cấp cho bạn 404. Tuy nhiên, nếu trang web không tồn tại (sẽ không giải quyết hoặc không có máy chủ web phía sau) , sau đó file_get_contents() sẽ bỏ qua thời gian chờ đọc vì chưa hết thời gian chờ kết nối với nó.

Tôi không nghĩ rằng bạn có thể đặt thời gian chờ kết nối trong file_get_contents. Gần đây tôi đã viết lại một số mã để sử dụng fsockopen() chính xác vì nó cho phép bạn chỉ định connect timeout

$connTimeout = 30 ; 
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout); 

Ofcourse sẽ fsockopen sẽ yêu cầu bạn phải rồi fread() từ nó trong vòng một, compicating mã của bạn một chút. Nó cung cấp cho bạn kiểm soát nhiều hơn, tuy nhiên, trên phát hiện timeouts đọc khi đọc từ nó bằng cách sử stream_get_meta_data()

http://php.net/stream_get_meta_data