簡體   English   中英

加快在PHP中讀取多個XML文件

[英]Speed up reading multiple XML files in PHP

我目前有一個必須讀取數百個XML文件的php文件,我沒有選擇如何構造這些XML文件,它們是由第三方創建的。

第一個xml文件是其余xml文件的大量標題,因此我搜索第一個xml文件以獲取其余xml文件的文件名。

然后,我讀取每個xml文件,搜索其特定短語的值。

這個過程非常慢。 我正在談論5 1/2分鍾的運行時間......對於一個網站而言,這是不可接受的,客戶不會長時間保持這種狀態。

有沒有人知道一種方法可以加快我的代碼,最大運行時間約30秒。

這是我的代碼的粘貼框: http//pastebin.com/HXSSj0Jt

謝謝,抱歉難以理解的英語......

首先,如果您必須為服務的每個請求處理大型xml文件,那么下載xml一次,預處理並在本地緩存它們是明智的。

如果您無法預處理和緩存xml,並且必須為每個請求下載它們(我不相信是這種情況),您可以嘗試使用XMLReader或某些基於SAX事件的xml解析器進行優化。 SimpleXML的問題在於它正在使用DOM。 DOM(正如字母所代表的)在php進程內存中創建文檔對象模型,這需要花費大量時間並占用大量內存。 我冒險說DOM對於解析大型XML文件毫無用處。

而XMLReader將允許您逐個遍歷大型XML節點,而不會占用任何內存,無法進行權衡,您無法發出xpath查詢或任何其他非重復節點訪問模式。

如何使用xmlreader,您可以參考php手冊獲取XMLReader擴展

您的主要問題是您正在嘗試進行數百次http下載以執行搜索。 除非你擺脫這種限制,否則它只會走得那么快。

如果由於某種原因,這些文件是不是在所有 (不太可能)被緩存,甚至有些時候不是,你可以通過並行下載拿起一些速度。 請參閱curl_multi _ *()函數。 或者,使用命令行中的wgetxargs並行下載。

如果你有任何類型的流量,上面的聲音聽起來很瘋狂。

最有可能的是,文件可以緩存至少很短的時間。 查看http標頭,看看他們的服務器發送了哪種新鮮度信息。 它可能會說文件到期之前有多長時間,在這種情況下,您可以在此之前將其保存在本地。 或者,它可能會給出最后修改或etag,在這種情況下,您可以執行條件獲取請求,這應該可以加快速度。

我可能會設置一個本地squid緩存並讓php通過squid發出這些請求。 如果它是新的,或者有條件地為您檢索新的版本邏輯,它將負責所有使用本地副本。

如果您仍需要更高的性能,可以將緩存的文件轉換為更合適的格式(例如,將相關數據粘貼到數據庫中)。 或者如果你必須堅持使用xml格式,你可以先對文件進行字符串搜索,以測試是否應該將該文件解析為xml。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM