4

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

我发现了以下内容,但我不确定如何在我的脚本上实现它,因为我使用“file_get_contents”来检索外部文件调用的内容。

限制函数或命令 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

4 回答 4

2

我建议使用 PHP 函数的cURL系列。然后,您可以使用以下方法设置超时curl_setopt()

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

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

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

于 2010-01-13T13:35:30.240 回答
0

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

<?php 
$ctx = stream_context_create(array( 
    'http' => array( 
        'timeout' => 1 
        ) 
    ) 
); 
file_get_contents("http://example.com/", 0, $ctx); 
?>
于 2010-01-13T13:31:50.403 回答
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
}
?>
于 2010-01-13T13:42:00.350 回答
0
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 4);
if ($fp) {
    stream_set_timeout($fp, 2);
}
于 2010-01-13T16:17:24.890 回答