2010-03-24 30 views
5

hey all, Tôi có những đoạn mã sau đây phpLàm thế nào để có được fopen để timeout đúng

if($fp = fopen($url, 'r')) { 
    stream_set_timeout($fp, 1); 
    stream_set_blocking($fp, 0); 

} 
$info = stream_get_meta_data($fp); 

Tôi muốn đề nghị để thời gian chờ sau 1 giây ... nếu tôi đặt một giấc ngủ (20) trong url $ của tôi mà tôi đang đọc nó chỉ chờ 20 giây và không bao giờ hết thời gian. Có cách nào tốt hơn để làm timeouts với fopen?

Nếu tôi sử dụng ini_set ('default_socket_timeout', 2); ở trên mã đó nó lần ra đúng cách, nhưng thông tin $ sau đó trở thành null vì vậy lý tưởng tôi muốn sử dụng các chức năng dòng.

nhờ

+0

Bạn mong đợi thông tin $ khi nào có thời gian chờ kết nối? – VolkerK

Trả lời

10

Bạn có thể sử dụng stream_context_create()http context option timeout
Nhưng fopen() vẫn sẽ trả về false nếu một thời gian chờ xảy ra và stream_get_meta_data() sẽ không hoạt động.

$url = 'http://...'; 
$context = stream_context_create(array(
    'http'=>array(
    'timeout' => 2.0 
) 
)); 
$fp = fopen($url, 'r', false, $context); 
if (!$fp) { 
    echo '!fopen'; 
} 
else { 
    $info = stream_get_meta_data($fp); 
    var_dump($info); 
} 
+0

vấn đề duy nhất với điều đó là ngữ cảnh không được thêm vào cho đến khi php5 và mã tôi viết không may cần phải tương thích với php4 :( – James

+1

Hướng dẫn sử dụng PHP 4.3.0 vì vậy bạn nên làm tốt, http: //www.php.net/manual/en/function.stream-context-create.php –

+1

Tôi vừa thử "timeout", nhưng khi tôi chọn timeout = 2, thực sự mất 4 giây để hết thời gian chờ, nếu timeout = 15 , thực sự mất 30 giây để hết thời gian chờ. Tại sao? – TomSawyer

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