2011-09-29 19 views
1

真實世界的問題:我正在建立一個頁面dinamically。這個頁面是一個由用戶檢索的xml(curl,file_get_contents或任何可以通過製作服務器端腳本)。 一旦用戶發出請求,他開始等待,我開始從數據庫中檢索一大組數據,並用它們建立一個xml(使用php dom對象)。一旦我完成了,我會觸發「print $ document-> saveXML()」。大約需要8分鐘來創建這個40兆字節的文檔。然後,隨時準備好我服務的頁面/文檔。現在我有一個60秒連接超時的用戶:他說我需要每60秒發送一個八位字節。我怎樣才能做到這樣的事情?發送空數據包不超時連接

因爲它是無用張貼23987452行代碼的原因沒人會閱讀他們,我會解釋這成爲此頁爲實非常僞僞代碼的腳本:

  • 抓住所有的從DB數據:一個巨大的組行
  • 創建一個DOMDocument元件通過各行
  • 環和節點元素添加到DOM文檔包含一塊數據
  • 呼叫$ dom-> saveXML()將文檔作爲字符串獲取
  • 打印字符串,以便用戶檢索XML文檔

1)我無法發送真實的數據,因爲它是一個XML文檔,它開始與"<?xml..."不弄亂parser.`

2)用戶不能處理防火牆/ SERVERCONFIG

3)I無法處理「購買更強大的服務器」

4)我試圖在頂部使用ob_start()該腳本,然後在每個循環的開始處一個"header("Transfer-Encoding: chunked"); ob_flush(); " 但沒有什麼:在8分鐘之前沒有任何事情發生。

幫幫我吧!

+0

您將不得不隨時隨地生成XML,隨時輸出。或者,或者將其輸出到後臺的文件中,並在準備就緒時提供文件。 – Brad

+0

我已經準備好了。我需要以大塊或類似的方式提供它。但是我不能輸出它,因爲php中的domdocument類是一個對象,一旦你調用saveXML(),它就會用它的結束標籤生成xml! –

回答

1

我會

  • 生成一個隨機值

  • 啓動XML生成腳本作爲後臺進程(例如見here

  • 使生成的腳本編寫XML成當腳本完成時以隨機值作爲名稱的文件

  • 經常輪詢該空文件的存在,例如每10秒使用一次Ajax請求,直到它到達那裏。然後從文件中獲取XML。

+0

稍等片刻:我不是有我超時的問題。我需要向其他人發送一些信息給從他自己的計算機上獲取頁面的用戶。 –

+1

@hysoka是的,我明白。這應該防止這種超時 –

+0

對不起Pekka:謝謝你幫助我,但我仍然無法得到它。這不是一個網頁:你通過一個url訪問它,但顯然沒有瀏覽器可以打開一個40 MB的頁面,沒有人會通過瀏覽器獲取這個文件:他們會使用file_get_contents($ url)或更可能捲曲由終端。所以我該怎麼做? –

0

您發送填充並仍然是有效的XML。微不足道的例子包括很多地方的空白或評論。一旦你發出的XML聲明,你可以開始一個註釋,並不斷髮出填充:

<?xml version="1.0"> 
<!-- this comment to prevent timeouts: 
    30 
    60 
    90 
    ⋮ 

或什麼的,準確的數據並不重要,當然。

這是簡單的解決方案。更好的解決方案是使該代在後臺運行,並且例如使用AJAX每10秒輪詢服務器以檢查其是否完成。或者實施備用通知方法(例如,在文檔準備就緒時通過電子郵件發送URL)。

如果這不是一個瀏覽器訪問,您可能需要一個簡單的API:有一個請求開始生成文檔,另一個請求獲取它。獲取它的人可能會返回「尚未準備好」,例如HTTP狀態碼500,503或504。然後,請求的腳本應該稍後重試。 (例如,使用curl--retry選項將執行此操作)。

+0

無法使用填充:聲明是在帶有saveXML()函數的腳本。在結束之前,沒有什麼可打印的,沒有任何東西需要打印。這不是一個瀏覽器訪問:用戶是一個門戶網站,他們有自動程序來獲取我發送的URL並獲取數據,所以沒有什麼不能改變用戶服務器端。如果我繼續提供HTTP狀態碼500,會發生什麼情況?請求繼續嘗試,或者您需要通過像使用curl那樣的參數直接說出它。 –

+0

@ hysoka44:你當然可以發送填充。 'DOMDocument :: saveXML'返回一個字符串。所以你可以去除它生成的''聲明,而是發送你自己的聲明(更早)。您也可以嘗試'LIBXML_NOXMLDECL'標誌,但這可能不起作用(文檔有點矛盾)。就curl的默認行爲而言,我不相信--retry是默認行爲。 – derobert