在PHP中防止超时

时间:2010-01-13 13:18:20

标签: php api limit execution

我正在开发一个PHP脚本,它对外部站点进行API调用。但是,如果此站点不可用或请求超时,我希望我的函数返回false。

我找到了以下内容,但我不确定如何在我的脚本上实现它,因为我使用“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

你会如何解决这个问题?谢谢!

4 个答案:

答案 0 :(得分:1)

我建议使用cURL系列PHP函数。然后,您可以使用curl_setopt()

设置超时
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2); // two second timeout

这将导致curl_exec()函数在超时后返回FALSE。

通常,使用cURL比任何文件读取功能都要好;它更可靠,有更多选择,不被视为安全威胁。许多系统管理员禁用远程文件读取,因此使用cURL将使您的代码更加便携和安全。

答案 1 :(得分:0)

来自File_Get_Contents的PHP手册(评论):

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

答案 2 :(得分: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
}
?>

答案 3 :(得分:0)

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