簡體   English   中英

如何在php中限制http響應時間

[英]How to limit http response time in php

我正在使用一些網站來檢測我的網站訪問者的國家/地區。 我的意思是這樣的

$ip = $_SERVER['REMOTE_ADDR'];  
$url1 = 'http://api.hostip.info/get_json.php?ip='.$ip;
$url2 = 'http://ip2country.sourceforge.net/ip2c.php?format=JSON&ip='.$ip;

有時像sourgeforge這樣的網站需要花費太多時間來加載。

所以任何人都可以告訴如何限制http響應時間。

如果url1x seconds關閉或未響應,則移至url2,url3,etc

$context  = stream_context_create(array(
    'http' => array(
        'method'  => 'GET',
      , 'timeout' => 3 
    )
));

然后將流上下文提供給fopen()或file_get_contents()等...

http://php.net/manual/en/stream.contexts.php
http://php.net/manual/en/context.http.php

手冊稱為“讀取超時”。 我擔心它可能不包括像dns解析+套接字連接之類的東西。 我認為php嘗試從流中讀取之前的超時可能受default_socket_timeout設置的控制。

您可能想要考慮curl,它似乎更具體一些,但我不確定CURLOPT_TIMEOUT是否包含CURLOPT_CONNECTTIMEOUT

$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);

http://php.net/manual/en/function.curl-setopt.php

如果使用流完成此操作,則可以使用stream_set_timeout 這是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;
    }

}  

還有另一個解決方案,只需下載數據庫並在您自己的更快的機器上為自己提供該服務:

IP到Geolocation db

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM