我正在开发一个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)
你会如何解决这个问题?谢谢!
答案 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);
}