2012-03-22 72 views
2
foreach ($arr as $k => $v) 
{ 
    $r = my_func($v); 

    $new[$k] = $r; 
} 

你怎麼做,這樣$r將返回false,如果my_func()時間超過10秒來執行,否則(如果它用了不到10秒),它將返回true;PHP:每個功能限制執行時間

附加信息:my_func()實際上讀取一個URL,有時需要很長時間。如果超過10秒,我希望它返回false。

+1

啓動計時器,檢查計時器 – 2012-03-22 06:05:41

+0

聽起來像是你應該編輯my_func,並將() – 2012-03-22 06:13:28

回答

3

你不能在PHP中的功能限制執行時間。但是,不要絕望:如果你提到你的函數讀取URL,你可以使用curl分機時,選擇通過curl_setopt設置選項,如下:

CURLOPT_TIMEOUT的最大秒數,讓捲曲函數來執行。 CURLOPT_CONNECTTIMEOUT嘗試連接時等待的秒數。

使用這些可以限制用curl處理URL處理的實際時間。

你也可以使用http擴展名,它也允許你做http連接並且有timeout options

最後,你可以使用context optionsfile_get_contents

$opts = array('http' => 
    array(
     'timeout' => 1.5 // 1.5 seconds 
    ) 
); 

$context = stream_context_create($opts); 

$result = file_get_contents('http://example.com/getdata.php', false, $context); 
0

做這樣的事情:

foreach ($arr as $k => $v) 
{ 
    $before = time() 

    $r = my_func($v); 

    $after = time(); 

    $timeDelta = $after - $before; 
    if($timeDelta < 10){ 
     $r = true; 
    } 
    $new[$k] = $r; 
} 
+0

請問'$後=時間()'得到執行,即使'my_func,並將()'尚未完成? BTW我在我的問題中添加了其他信息。 – IMB 2012-03-22 06:11:55

+0

我不認爲它應該。測試一下,現在不能自己。爲了測試它,在函數的末尾放置一個time()函數(在它的內部)並比較$ after和那個時間,它們應該是相同的或者非常接近的。 – NoviceCoding 2012-03-22 06:15:39

2

如果my_func讀取URL,你只是不希望它不是一個給定的超時時間需要更長的時間,如果你使用正確的URL的功能,您應該能夠指定超時並且如果通話時間超過該時間,則會導致通話失敗。

如果您使用的是cURL,則可以使用curl_multi_exec以某種方式手動獲取此行爲,或者僅指定超時值,然後該函數可以返回false。

實施例:

function my_func($url) 
{ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout after 10 seconds 

    // .. set other options as needed 
    $result = curl_exec($ch); 

    if ($result === false) { 
     // timeout or other failure 
     return false; 
    } 
} 

現在功能不會因超時運行速度比約10秒鐘。您還可以使用curl_errno()檢查超時:

if (curl_errno($ch) == 28) { 
    // timeout was exceeded 
}