2016-09-28 33 views
0

我有一個laravel應用程序。我使用每4小時運行一次的cronjob,並導入csv文件並保存到數據庫中。使用中斷導入文件 - laravel

我有有限的時間(最長300秒執行時間,60秒cpu時間)。導入腳本應該導入很多csv文件(400+)。

有沒有辦法在時間用完之前打斷並再次調用導入腳本?或者我怎麼解決這個問題,這樣可以安全地導入文件?

+0

您爲此使用作業計劃程序。因此,您將所有「導入作業」放入隊列(通常是基於數據庫),然後逐個執行單個導入作業。這使得工作量很好。現在你可以實現你的cron作業只有控制角色。每隔x分鐘觸發一次,並檢查是否有任何工作要處理。如果是這樣,那麼它開始一個導入工作,如果沒有,它會退出。重要的部分是分離控制和進口工作。 – arkascha

+0

您可以使用亞馬遜或iron.io等第三方排隊服務獲得更好的效果 – madankundu

+0

感謝您的評論。@arkascha:我會試着繼續你的建議。你能指出我正確的方向嗎?例如,我將擁有一個導入作業類,我將其導入隊列並輸入文件名。如果同一個文件被提交給隊列,我需要注意嗎?我應該什麼時候將作業推送到隊列中?還有一件事:如何在隊列中運行作業?運行守護進程隊列工作者? (對不起,我是laravel的新手,通過了文檔,但仍然有這些問題) – Seer

回答

0

如果要保證過程完成,最好的解決方案可能是使用不重疊的任務計劃。你可以閱讀所有關於它的文件中:

https://laravel.com/docs/5.2/scheduling#preventing-task-overlaps

它實際上還是一個cronjob,但Laravel內部將確保只有一個進程時運行。因此,您仍然可以(例如)安排它每分鐘運行一次,以便它在結束後立即重新啓動,或者在您的情況下安排它每隔4小時運行一次,而沒有前一次尚未完成時重新啓動的風險。