1

這更多的是一個架構問題。如何在Laravel中實現對長時間運行的導入的跟蹤

我正要編寫一堆Import實現。他們都希望有一些參數(即CSV文件),然後在一段時間內安靜地繼續。在我之前的項目中,我曾使用「shell_exec()」命令在後臺發送這些導入,並在瀏覽器中監視日誌文件以報告狀態。我現在最大的希望是,拉拉維爾接手這裏精簡所有這些體力勞動。

現在,我的問題是關於背後的建議類架構。


我的一堆進口需求是:

  • 每個導入需要作爲後臺進程運行在瀏覽器中(和日誌文件)
  • 開始進口
  • 監測進展情況控制檯和通過HTTP

現在我打算使用「Job」在L5.1中實現基本導入。我正在努力的是在瀏覽器中實現某種「進度條」和監視(最近的)「日誌消息」。我不需要通過套接字進行真正的「實時」視圖,但應該可以定期更新正在運行的導入的進度視圖。

  • 有沒有人提示,如何實現這個進度的東西?

我迄今爲止的做法: 閱讀CSV文件,把每行一個隊列元素和監控隊列。日誌消息可能會觸發填充最近日誌消息堆棧的事件。 (我可能會遇到競爭條件,因爲有些行可能依賴於其他行的上一個處理)

回答

0

我會做一個ActiveBackgroundTask模式是這樣的:

  • handler_class_name
  • 狀態
  • 進步
  • latest_log_messages
  • 結果

,並創建您的系統的cron任務定期檢查此表並啓動任務,在國家created出現在該表中。每個任務在表中傳遞其id以定期更新resultlatest_log_messages字段。

可以擴大這個想法,例如通過,那麼不僅是最新的消息可以提取每一個任務規範日誌文件的位置,但也充滿了任務日誌可以下載。

在這種情況下,每個任務的狀態可以很容易地從系統中的每個腳本檢查。

將會有一個檢測死的任務的問題,由於PHP錯誤或異常而中止任務。如果你需要這個,你可以保持php進程PIDs,並且cron腳本可以檢查具有running狀態的任務是否仍然真正運行。

這是否適合您的需求?

+0

是的,應該這樣做。有了我的問題,我也很喜歡Laravel帶來的那些東西,或者在這裏推薦什麼樣的設計模式。 – patriziotomato

+0

@ redless81我不確定你應該這樣看待事情;)總是選擇最簡單的解決方案。模式是爲了使複雜的事情更簡單。我不喜歡5.1中的Laravel Jobs。它們對我來說似乎是假的。 –

+0

我同意並且不同意;)我需要導入大約50 MB的CSV數據以將其分佈到多個表格中。導入過程可能需要幾個小時。我認爲我需要考慮諸如可伸縮性等方面。另外,我也希望充分利用框架提供的架構,因爲它爲其他開發人員帶來了某種標準,使其更易於測試。不過,我同意你應該防止使用模式,如果你不需要它們。 – patriziotomato