2017-09-20 9 views
0

私はYii 1.1とビューを持つウィジェットを持っています。私はfile_get_contentsという外部アドレス(httpsからのhttps)のPHP関数を呼び出しています。私はhttps://api.ipinfodb.com/v3/ip-city/...と呼んでいます - 彼らはIPアドレスで座標を提供します。それは503エラーで失敗します:file_get_contentsはYiiウィジェットのビューでは機能しません。

failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable

しかし、それは完全に静的ビューのページで動作します。 これは私の開発者マシンのどこでも動作します。 サーバ上のphp.iniにallow_url_fopen = Onがあります。

何が間違っている可能性がありますか?

+0

ない、それを解決するために、ここで十分な情報を。私の勘違いは、あなたが 'file_get_contents'のためにデフォルトで空になっているユーザエージェント文字列を設定する必要があることです。私はその理由で多くのAPIの拒否リクエストを見てきました。しかし、503は送信する間違った応答コードなので、APIプロバイダはそのシナリオに準拠していないようです。しかし、これは無効なAPIキーエラーのために200を無効に送信したことを考慮している可能性があります - 401 –

+0

OK、私はちょうど 'stream_context_create'でヘッダオプションにユーザエージェント文字列を設定しました。私が言ったように、静的なPHPページからそのAPIを呼び出すと、すべてがうまくいきます。ヘッダーは私がウィジェットの視点から行うのと同じです。どのような情報が必要ですか?また、ここに独自のapiキーを作成することもできます:http://ipinfodb.com/register.php –

答えて

1

これで解決できますか(URLに特殊文字が使用されているかどうかわかりません...)?

file_get_contents(urlencode('https://api.ipinfodb.com/v3/ip-city/...')); 

それとも、あなたはこのようなものを使用でき、カール有効にした場合:

function getData($url){ 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);  
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
    } 
+0

'urlencode'には必要ありません。カールは非常に遅いです... –

+0

もう一度cURLをチェックしてください。要求にタイムアウトを設定しても問題ありません。ありがとうございます。とにかく、これは質問の正解ではありませんでした。 –

+0

こんにちは、よろしくお願いします。それでも問題は解決しましたが、別の解決方法について考えてみてください。) – Aurora

関連する問題