2014-02-14 148 views
1

我正在使用PHP蒸汽冷凝器庫,以獲取有關用戶的一些Steam細節。我已經成功實現了這一切,一切都在工作。然而,我開始注意到蒸汽冷凝器每隔一段時間就會拋出一個錯誤。SimpleXMLElement - HTTP狀態碼?

發生了什麼事情是,當我用param調用SteamId類時,庫會使用SimpleXMLElement(as can be seen here)生成一個URL並向其發出請求。現在大多數情況下,URL會返回XML,所以我的應用程序可以正常工作,但每次往往會拋回一個503 Service Unavailable,導致它失敗。

try { 
     return @new SimpleXMLElement($url, 0, true); 
    } catch (Exception $e) { 
     $errorMessage = "XML could not be parsed: " . $e->getMessage(); 
     if ((float) phpversion() < 5.3) { 
      throw new SteamCondenserException($errorMessage, 0); 
     } else { 
      throw new SteamCondenserException($errorMessage, 0, $e); 
     } 
    } 

在我的事業中,PHP的版本是正確的,所以它拋出底部的自定義異常:

SteamCondenserException 
XML could not be parsed: String could not be parsed as XML 
/home/user/public_html/acme/vendor/koraktor/steam-condenser/lib/steam/community/XMLData.php (Line 38) 

儘管這在技術上是正確的例外,它是沒有多大意義,因爲該請求是隻是「不可用」,因此無法收集XML。

如何編輯此代碼以首先檢查請求的狀態代碼是什麼,如果它是302或200(因爲它重定向),則繼續檢查XML,否則如果它是503,則迴應與更真正的錯誤(Steam社區API目前正在下降) - 或者什麼。

我已經Google'd我的屁股關閉,但看不到任何東西。理想情況下,我希望這一切都可以在同一個請求中完成,因爲Steam有時可能會有點慢。

乾杯

回答

2

不要使用SimpleXMLElement做HTTP請求。

使用curl(因爲速度很快)可以讀取XML純文本,並使用SimpleXML來解析它。

這樣就可以將服務可用性與傳輸錯誤(或XML錯誤)分開。

+0

啊好的,所以你說的是用curl做請求,檢查響應是否正確,然後在返回的數據上使用SimpleXMLElement? – Alias

+0

是的,確切地說。如果將這些類型的錯誤分開很重要,並且'SimpleXML'沒有給你一個好的處理方法,那就分解它。 – Halcyon

+0

謝謝,有道理! – Alias