2008-10-29 152 views
2

我有一個通過HTTP請求XML文件的PHP客戶端(即通過URL加載XML文件)。截至目前,XML文件的大小隻有幾KB。我可以預見的一個問題是,XML的大小會變成幾個MB或者千兆位。我知道這是一個巨大的問題,可能有無數的解決方案,但您有什麼想法將這些數據傳輸到客戶端?通過HTTP發送大文件

謝謝!

回答

4

根據你的用例,我肯定會建議先壓縮數據。另外,你可能需要md5散列文件並在開始下載之前比較它(如果文件沒有變化,則不需要更新),這將有助於點#2。

也有可能只發送一段XML而不是整個文件?

+0

發送細分將是一個好主意,它絕對可行。 – CoolGravatar 2008-10-29 20:01:17

+0

太好了,我建議散列整個文件兩端,並在啓動傳輸之前比較散列。如果有更新,只需發送段(如上所述,gzip),然後將其拼接到「客戶端」。如果你不綁定到XML,也許更輕的解決方案(json?)可能更好 – Owen 2008-10-29 21:15:04

0

Gallery2允許您通過http上傳照片,使您可以設置幾個php參數post_max_sizeupload_max_filesize以允許更大的上傳。你可能想看看。

在我看來,發佈大文件存在瀏覽器超時問題等問題,但與正在嘗試不同的文件上傳協議相比,它更適用於代理服務器和防火牆。

+0

瀏覽器不應該有問題,我使用HTTP在過去將3GB文件上傳到我的一個應用程序。它花了大部分時間,但到最後。 – Ady 2008-10-29 18:49:07

0

感謝您的答覆。我沒有提及傳輸文件應該相對較快(最多幾分鐘,這甚至可能嗎?)。所請求的XML將每晚解析並插入到數據庫中。 XML可能與前一天的相同,也可能不同。提出的一個解決方案是壓縮xml文件,然後將其傳輸。所以基本上有兩個要求:1.它必須相對快2.它應該儘量減少寫入數據庫的次數。

提出的一種解決方案是壓縮xml文件然後傳輸它。但只滿足(1)

其他想法?

+0

首先你說XML可以增長到GB,現在你說「最多幾分鐘」。你不能這樣做。 – 2008-10-29 21:06:47

2

考慮到XML是用PHP動態創建的,我能想到的最簡單的事情就是確保該文件由web服務器自動進行gzip壓縮,如描述here,它提供了一種通用的PHP方法和Apache httpd-具體解決方案除此之外,擁有一個瀏覽器(還有什麼可以是PHP客戶端?)每天晚上都會做這樣的工作,因爲某些數據會同步化聲音,就像在其他地方必須有一個更簡單的解決方案。

,當然,在某些時候,轉移「很多」的數據是要採取時間「很多」 ......

+0

「還有什麼可以成爲PHP客戶端?」另一臺服務器 - 如本地運行的soapclient = P – 2008-10-29 21:22:25

+0

,php將能夠通過CLI下載文件,這可以作爲cron作業添加。 – nickf 2008-10-30 00:53:01

0

有沒有我可以適用於壓縮XML的算法?在幾秒鐘內如何下載MP3等大文件?

+0

這完全是另一回事,這取決於你的服務器的上傳速度和用戶(或你的其他機器)的下載速度,當然還有所有的隨機管子:) – Owen 2008-10-29 21:13:19

0

PHP接收GB的數據將花費很長時間並且是開銷。 更明顯的缺陷。

我會 - 將任務分配給一個不受執行時間和失敗困擾的shell腳本(帶有簡單錯誤捕獲的wget),甚至可以根據其自身的優點重試。

雖然沒有這方面的經驗,但可以使用exec()或類似的,這些可悲的運行模態。

調用腳本**./test.sh &**使它在後臺運行並解決了這個問題/我猜。該腳本可以很容易地讓你的PHP通過wget'http://yoursite.com/continue-xml-stuff.php?id=1049381023&status=0'來選擇它。如果您不需要回溯丟失的請求,則該ID可能是文件名。狀態將指示腳本如何處理請求。

0

你有沒有想過使用某種版本控制系統來處理這個問題?您可以利用它的能力來計算和發送文件中的差異,另外還可以獲得維護文件版本歷史記錄的額外好處。

0

由於我不知道你的情況的細節,我會拋出問題。只是爲了爭論,它必須是HTTP嗎? FTP更適合大數據傳輸,並且可以通過PHP或Perl輕鬆實現自動化。

1

問題是他正在同步兩個數據集。問題完全錯誤。

您需要a)將數據集A的更改的差異日誌保留爲您可以將該日誌發送到數據集B的時間,或者b)保留數據集的兩個副本(昨晚和當前數據集),然後將它們進行比較,以便將差分日誌從A發送到B.

歡迎來到複製世界。 (a)的問題在於它可能侵入你的所有代碼,但是如果你使用的是RDBMS,你可以通過數據庫觸發器來記錄一些事情,以跟蹤​​插入/更新/刪除,並寫入將信息輸入到表格中,然後將相關行導出爲差異日誌。但是,這也可能是討厭的。

(b)的問題是整個「比較數據庫」一次。罰款100行。 10^9行不好。討厭的討厭。

事實上,它可能都是討厭的。複製是討厭的。

一個更好的計劃是查看爲您正在運行的特定數據庫(假設您正在運行數據庫)設計的「真實」複製系統。可能會發送數據庫日誌記錄以進行同步,而不是嘗試自己推出。

大多數現代DBMS系統都有複製系統。

0

如果你使用Apache,你也可以考慮使用Apache mod_gzip。這應該允許您自動壓縮文件,並且解壓縮也應該自動進行,只要雙方都接受gzip壓縮。