2011-05-14 86 views
5

我正在編寫一個查詢不同數據庫價格的web服務。 Web服務將一個新的<Result>節點寫入XML頁面,該頁面在從數據庫獲得結果後立即調用http://service.com/xml.php?search=carpet時會返回。不幸的是,發送到各種數據庫的查詢需要很長時間(總共達30秒)。顯然,我不希望用戶等待30秒,然後返回XML並使用此數據構建表;我希望它動態加載。使用Javascript和PHP動態添加新表格和行查詢XML源代碼

假設用戶搜索「地毯」,該數據庫將回饋多種產品,如「紅地毯」「黃地毯」「紅地毯」有兩個經銷商被動態加載到「紅地毯」的表格中。 「黃色地毯」只有一個分銷商。

我需要一個如下圖所示的價格比較表,如果返回一篇新文章,它會動態地添加一個新表,並且如果爲某個產品找到新分銷商,則會向表中添加一個新行。

你有什麼建議如何做到這一點?我如何只接收從我的xml.php更改的數據?

價格比較表結構

price comparison table structure

XML數據

<?xml version="1.0" encoding="UTF-8"?> 
<Results> 
<!--Given back within 5 seconds--> 
<Result> 
    <ArticleNumber>Red Carpet</ArticleNumber> 
    <Manufacturer>Big Carpet Inc</Manufacturer> 
    <Distributor>Amazonas</Distributor> 
    <Prices> 
     <Pricebreak> 
      <Quantity>1</Quantity> 
      <Price>$ 1.20</Price> 
     </Pricebreak> 
     <Pricebreak> 
      <Quantity>10</Quantity> 
      <Price>$ 1.00</Price> 
     </Pricebreak> 
     <Pricebreak> 
      <Quantity>100</Quantity> 
      <Price>$ 0.50</Price> 
     </Pricebreak> 
    </Prices> 
</Result> 
<!--Given back within another 10 seconds--> 
<Result> 
    <ArticleNumber>Red Carpet</ArticleNumber> 
    <Manufacturer>Big Carpet Inc</Manufacturer> 
    <Distributor>Veritas</Distributor> 
    <Prices> 
     <Pricebreak> 
      <Quantity>1</Quantity> 
      <Price>$ 0.90</Price> 
     </Pricebreak> 
     <Pricebreak> 
      <Quantity>5</Quantity> 
      <Price>$ 0.70</Price> 
     </Pricebreak> 
    </Prices> 
</Result> 
<!--Given back within another 5 seconds--> 
<Result> 
    <ArticleNumber>Yellow Carpet</ArticleNumber> 
    <Manufacturer>Smallrug Corporation</Manufacturer> 
    <Distributor>Veritas</Distributor> 
    <Prices> 
     <Pricebreak> 
      <Quantity>1</Quantity> 
      <Price>$ 3.90</Price> 
     </Pricebreak> 
     <Pricebreak> 
      <Quantity>10</Quantity> 
      <Price>$ 2.70</Price> 
     </Pricebreak> 
    </Prices> 
</Result> 
</Results> 
+1

可能你的sql沒有優化,查詢效率不高,也許顯示實際查詢可以幫助我們給你更好的解決方案 – Ibu 2011-05-14 21:45:12

+1

顯示你用來檢索內容的代碼 – Ibu 2011-05-14 21:48:26

+0

@Ibu,實際上查詢不是一個sql數據源,但驅動程序從html網站獲取信息,不幸的是這些查詢需要很長時間,我必須運行約30個。我寫了「數據庫」來減少信息並保持簡單。 – 2011-05-14 21:48:54

回答

2

假設你不能修改任何結構,提升數據檢索的性能,我想唯一的解決辦法是緩存結果並嘗試在本地數據庫中創建數據庫的副本。

異步模式我認爲你是一個最好的方式。

您可以開發一個腳本,用於複製本地數據庫中可由前端應用程序最快訪問的慢速查詢,並在Cron作業中應用此腳本,同樣,如果您可以處理更新的記錄,在波峯;)

我認爲這將有助於

5

...居然查詢是不是一個 SQL數據源,但到驅動程序 獲取信息了HTML 網站。 ..

如果是這種情況,那麼我建議您在調用網頁時不要這樣做。而是讓一些其他腳本作爲cron任務或服務運行,根據數據的不穩定性定期輪詢此數據。每5分鐘一次,或每一小時一次?並且讓你的本地數據庫能夠以更快的速度輪詢。這將允許您在用戶選擇它時加載您希望的任何數據而無需等待解析器。

有效地將緩存層添加到您的Web服務中,以便您可以快速運行應用程序,而不必依賴數據的按需分析。

此外,如果自動過程不可用,您可以手動進行'更新',當您知道數據已更新時。

+0

是的。該頁面可能會更新結果30秒(!!!),但用戶不會看到它們,即使他沒有關閉頁面並完全移動。這是一個不可用的網絡應用程序。該頁面需要在1秒內加載(可能還有一些圖片),用戶需要關心的數據。 – 2011-06-19 08:52:47

0
  1. 性能/緩存提高你的「查詢」 是獲取數據的速度實現 積極的緩存策略。我是 ,假設您正在編寫一個帶有技術堆棧的網絡應用程序 ,其中 支持緩存。 memcached 是一個很好的通用緩存 庫與許多web 應用程序堆棧一起使用。如果您不得不依靠從競爭對手網站上獲取數據,那麼定期處理此問題的cron作業或任務隊列將對您有所幫助。

  2. 自動更新:有效你在談論的是連續輪詢AJAX,在那裏你將不得不從服務器開放客戶端的持續連接,並通過注入HTML到您的網頁,以新的數據作出反應。看看socket.io,它提供了一個抽象,允許通過多種傳輸方法(長輪詢xhr,flash,網絡套接字等)連續輪詢,並支持所有最新的瀏覽器(包括IE 5.5及更高版本)。

  3. 渲染:看看在template功能,是underscore.js一部分,它是建立一個可重複使用的標記模板一個體面的方式(即:你的錶行結構),並通過它的一些JSON被渲染成標記字符串。然後你可以使用像jQuery或Prototype這樣的庫來注入標記。

0

如果你真的專注於只接受已更改的數據,你會做4件事

  1. 版本的XML
  2. 讓你的JS定期查詢的版本號
  3. 如果不同的JS然後調用「updateFromCurrentVersion(currentVersion)」
  4. updateFromCurrentVersion返回更改
0

我可以想出至少2種方法來獲得你需要做的事情。

方法#1 服務器端將您的Web服務輸出分解爲兩個查詢和返回集。讓初始查詢獲得結果的id列表,然後使用第二個查詢,您可以通過id名稱調用單個結果集。

service.com/results.xml.php?回報: 等等

service.com/result.xml.php?id=回報: 等..

這將導致大量的查詢,這將增加開銷,但會阻止你一遍又一遍下載多個重複的結果。

你可以做的則是垃圾郵件第一查詢並比較其ID的當前顯示,然後查詢#2你需要又推出的細節。

方法2:

有1個查詢返回所有的結果就像你,但現在使用你的腳本部分本地存儲的ID字段跟蹤哪些內容已經顯示,僅添加通過AJAX將新數據導入現有頁面。在這種情況下,您必須讓JavaScript在循環環境中解析XML。


真正的困難在於,您的應用程序如何確定它具有所有結果並停止循環?

要做到這一點,也許會是剝離下來您的查詢,試圖發送一個返回你所需要的所有細節查詢之前得到最終結果集rowcounts的最好方法。

例如:從sourceTable會

選擇其中COMPAREITEM COMPAREITEM =

這隻會告訴你有多少項目匹配的信息最少的查詢得到泵回給你。然後你計算該結果集並將其存儲在下雨天。

SELECT * FROM sourceTable會在那裏COMPAREITEM =

現在你抓住所有細節,我想這需要更長的時間。現在,您可以有效地循環顯示代碼,以瞭解何時停止檢查結果。爲方法#1

AJAX僞代碼: - 設置當前顯示的結果爲0 - 設置所顯示的ID爲null 的陣列 - 運行基本查詢,以確定你有多少行預計總(計數每個提供獨立的,如果您有多個來源,然後將它們全部添加) - 輸入循環 - 抓住xml的細節 - 處理xml id的id以查看它是否顯示(如果數組爲空,第一次迭代顯示它們全部) - 任何id需要顯示的信息將ID添加爲顯示的ID數組的成員 - 將詳細信息抽取到文檔中 - 將每個結果ID的當前顯示結果遞增1顯示的詳細信息 - 檢查是否顯示了所有預期的結果。 (displayedids> = expectedresults)。如果真的退出循環。如果不能繼續。

優化這一點,你將最有可能需要添加某種時間管理,或者你可以簡單的垃圾郵件在一個愚蠢的高速率的XML,但服務器可以測試出來。

0

我寧願緩存遠程的價格和在緩存變量進行計算,如果他們要過期,您可以從Web服務抓住他們。您可以使用APC,memcached的,XCache將等

做到這一點你也可以用cron作業(也許像間隔5分鐘以上)週期計算並把它們寫在你的本地數據庫。

有了這兩個選項,訪問者每次訪問您的服務時都不會等待這個孔計算操作。