2017-09-20 20 views
0

我有Yii 1.1和一個帶有視圖的窗口小部件,我在這裏調用了file_get_contents php函數的外部地址(https從https)。我打電話給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提供程序似乎不符合該情況。但是,這可能是因爲他們也無效地發送了一個200無效的API密鑰錯誤 - 應該是401 –

+0

好吧,我只是用'stream_context_create'在頭選項中設置了用戶代理字符串,但沒有任何更改。正如我所說,當我從靜態php頁面調用該API時,一切都很好。標題與我在widget的視圖中做的一樣。你需要什麼樣的信息?另外,你可以在這裏創建你自己的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