4

サイト訪問者の国を検出するためにいくつかのサイトを使用しています。私はこのように意味します

$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応答時間を制限する方法を誰でも教えてもらえますか?

url1がダウンしているか応答がない場合は、次のx seconds場所に移動しますurl2,url3,etc

4

3 に答える 3

5
$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

于 2012-12-25T17:57:39.223 に答える
2

これがストリームを使用して行われる場合、これに使用できますstream_set_timeoutphp manualの適切な例であり、これをアーカイブするより高度な方法についても説明しています。

$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;
    }

}  
于 2012-12-25T17:54:32.437 に答える
1

別の解決策があります。DB をダウンロードして、自分の高速なマシンでそのサービスを自分に提供するだけです。

IP から Geolocation データベースへ

于 2012-12-25T21:45:19.917 に答える