2011-12-05 34 views
3

在我的php腳本中,我使用PDO將csv數據插入到數據庫中。無需等待即可將數據插入數據庫

$sqlsmttempl = 'INSERT INTO %s (%s) VALUES (%s)';

但花了相當長的時間只是幾千我records.How可以阻止客戶端等待插入?

我試過INSERT DELAYED,它沒有任何錯誤,但它似乎沒有任何反應。

有什麼提示嗎?謝謝。

+0

你是什麼意思「我試過INSERT DELAYED',它沒有任何錯誤,但它似乎沒有任何反應。」?你期望發生什麼不是? –

+0

@FrancisAvila當表未被任何其他線程使用時,數據將被插入嗎?我從這裏閱讀:http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html –

+0

但是你認爲「看起來沒有反應」是什麼意思? 'INSERT DELAYED'將總是報告一個成功的插入,不管它是什麼,因爲它不知道在插入之前是否有錯誤,現在也不能插入。 –

回答

1

沒有客戶端等待服務器完成處理的唯一方法是在您發送響應後在另一個進程中進行處理。

INSERT DELAYED是一個快速和骯髒的方式來做到這一點。要插入的數據庫行將由MySQL排隊並稍後插入。這意味着沒有辦法檢測或處理值錯誤,因爲在​​該行尚未實際插入之後。循環訪問csv併發出查詢必須在客戶端等待時完成。

如果這仍然太長,您將需要構建或使用某種假脫機或任務隊列。在這種設計中,請求被接受,然後傳遞給長時間運行的進程或放置在目錄中,並立即發送Web響應。同時,在服務器上運行的另一個進程獲取請求,處理它們,然後在某處記錄狀態(例如數據庫表)。應該有另一頁用戶可以去監視他們的任務狀態。

+0

感謝您的回答。即使我在處理之前向客戶端發送消息,網站仍會繼續加載並掛起,以便他們無法訪問其他頁面,直到完成處理。因此,我可以爲此問題做些什麼? –

+0

您或者誤解了我的答案,或者您有其他問題。您向客戶發送「我們將處理此消息」消息,然後**關閉響應**。 * webserver *不處理請求,*另一個進程*。 –