2010-01-13 83 views
4

我正在致力於一個PHP腳本,使API調用到外部網站。但是,如果此網站不可用或請求超時,我希望我的函數返回false。防止在PHP中超時

我發現下面的,但我不知道如何實現它在我的劇本,因爲我用「的file_get_contents」檢索外部文件調用的內容。

Limit execution time of an function or command PHP

$fp = fsockopen("www.example.com", 80); 
if (!$fp) { 
    echo "Unable to open\n"; 
} else { 

    fwrite($fp, "GET/HTTP/1.0\r\n\r\n"); 
    stream_set_timeout($fp, 2); 
    $res = fread($fp, 2000); 

    $info = stream_get_meta_data($fp); 
    fclose($fp); 

    if ($info['timed_out']) { 
     echo 'Connection timed out!'; 
    } else { 
     echo $res; 
    } 

} 

(來源:http://php.net/manual/en/function.stream-set-timeout.php

你會如何ADRESS這樣的問題?謝謝!

回答

0
<?php 
$fp = fsockopen("www.example.com", 80); 

if (!$fp) { 
    echo "Unable to open\n"; 
} else { 
    stream_set_timeout($fp, 2); // STREAM RESOURCE, NUMBER OF SECONDS TILL TIMEOUT 
    // GET YOUR FILE CONTENTS 
} 
?> 
+0

不知道爲什麼它不會識別換行符 – DBunting 2010-01-13 13:43:16

+0

嗨!超時在這裏不起作用。如果網站不可用,我只能在60秒後達到由PHP.ini設置的總max_execution時間... – Industrial 2010-01-13 14:27:47

0

File_Get_Contents(評論)的PHP手冊:

<?php 
$ctx = stream_context_create(array( 
    'http' => array( 
     'timeout' => 1 
     ) 
    ) 
); 
file_get_contents("http://example.com/", 0, $ctx); 
?> 
+0

這並不需要在考慮到超時,沒有爲什麼,雖然想法。 – Industrial 2010-01-13 14:26:37

+0

它似乎也不適合我,對不起。 – electblake 2012-02-13 05:11:03

1

我建議使用cURL家庭的PHP函數。然後,您可以設置使用curl_setopt()超時:

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2); // two second timeout 

這將導致curl_exec()功能超時後返回FALSE。

通常,使用cURL比任何文件讀取功能都好;它更可靠,有更多的選擇,不被視爲安全威脅。許多系統管理員禁用遠程文件讀取,因此使用cURL將使您的代碼更加便攜和安全。

+0

Pheew,服務器不允許cURL。我將嘗試看看我是否可以讓它運行。 – Industrial 2010-01-13 14:28:47

+1

PHP可能只是沒有編譯它。抱歉!如果您打算使用它,我確信您可以說服您的系統管理員安裝它並且不允許基於安全原因的遠程文件訪問。老實說,我很驚訝他還沒有(道歉,如果你是系統管理員;-) – 2010-01-13 14:42:09

+0

嗨盧卡斯。謝謝你的幫助。不,我試圖抓住系統管理員,看看我是否可以在cURL可用時將其整理出來! – Industrial 2010-01-13 18:41:46

0
<?php 
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 4); 
if ($fp) { 
    stream_set_timeout($fp, 2); 
}