![](/img/trans.png)
[英]How can I get an XML attribute as below using file_get_contents or simplexml_load_file?
[英]Should I use proxies with simplexml_load_file and file_get_contents?
我正在使用simplexml_load_file
一段時間從多個網站獲取RSS。
有時我從其中一些網站中收到錯誤,並且大約5天后,我在2個特定網站中出現了錯誤。
這是來自simplexml_load_file
的錯誤:
PHP Warning: simplexml_load_file(http://example.com/feed): failed to open stream: Connection timed out
PHP Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://example.com/feed"
這是file_get_contents
中的錯誤:
PHP Warning: file_get_contents(http://example.com/page): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
這就是我使用simplexml_load_file
:
simplexml_load_file( $url );
這就是我使用file_get_contents
:
file_get_contents( $url );
那是因為我沒有使用代理或無效的參數嗎?
更新:這兩個網站正在使用諸如防火牆或服務之類的東西來檢查機器人:
Accessing http://example.com/feed securely…
This is an automatic process. Your browser will redirect to your requested content in 5 seconds.
您所依據的假設是http://example.com/feed
總是存在並且始終准確返回您要查找的內容。 如您所知,這是一個錯誤的假設。
您正在嘗試使用file_get_contents()
和simplexml_load_file()
訪問網絡,並發現有時這些調用會失敗。 您必須始終計划使這些調用失敗。 某些網站是否公開允許這種行為或您是否擁有非常可靠的Web主機都沒有關系。 在某些情況下,您無法控制,例如Internet主干網中斷,最終將導致您的應用程序獲得不良響應。 在您的情況下,第三方已阻止您。 這是網絡請求發生的故障之一。
首先要解決的是您必須更好地處理故障 。 您不能使用file_get_contents()
來執行此操作,因為file_get_contents()
旨在獲取文件的內容。 在我看來,允許它進行網絡調用的PHP實現者犯了一個非常嚴重的錯誤,即允許它執行此功能。 我建議使用curl:
function doRequest($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if () {
return $output;
} else {
throw new Exception('Sorry, an error occurred');
}
}
使用此功能,您將能夠為自己的用戶更好地處理錯誤(錯誤將會發生)。
您的第二個問題是此特定主機給您403錯誤。 這可能是他們故意這樣做的。 我認為這是他們告訴您,他們不希望您使用這樣的網站。 但是,您將需要特別吸引他們,並詢問他們可以做什么。 他們可能會要求您使用真實的API,他們可能會完全忽略您,甚至可能告訴您要砸沙子-但我們在這里沒有任何建議可做。 嚴格來說,這是他們軟件的問題(或功能),您必須直接與他們聯系以尋求建議。
您可能會使用多個IP地址連接到網站,並在每次被阻止時輪換IP。 但是,這樣做將被視為對其服務的惡意攻擊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.