2017-06-17 205 views
0

問題

我使用Laravel 5.3導入一個巨大的(約>1 million rows>25 columns)製表符分隔的文件是什麼造成了「30秒超過最長執行時間」到使用功能的控制器代碼mysql數據庫(我禁止在此發佈所有代碼)。在處理我與下面的錯誤中遇到的文件:Laravel 5.3:

FatalErrorException in Connection.php line 720:

Maximum execution time of 30 seconds exceeded

請注意,在應用程序失敗之前導入不同的行數不同的實例。

問題

我知道我們可以使用下面的兩種解決:

  1. 改變php.ini建議here
  2. public/index開頭添加ini_set('max_execution_time', 300);的建議here

一這可能有多種原因nd我更多有興趣知道它到底在哪裏用完Laravel沒有提供比上述更多的細節。如果有人能夠提供調試方法,我會非常感激。有幫助的事情:

  • 是一個方法的所有請求的時間聚合?
  • 內存過載是否會造成這種情況?
  • 它可以通過分塊處理數據並通過多重請求處理它嗎?

環境

  • Laravel 5.3
  • Centos 7vagrant
  • MySQL
+0

'是一個方法的所有請求的時間聚合?'這是一個請求,我會建議一些排隊解決方案的長期運行計算,如任何基於AMQP的計算。 –

回答

1

這不是跑出來的時間特定的操作。這是......從開始到結束的所有事情。

max_execution_timeinteger

This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30.

http://php.net/manual/en/info.configuration.php#ini.max-execution-time

的想法,在這裏,是一個Web服務,一般來說,只有在一定量的時間從請求的響應是合理的。很明顯,如果需要30秒(「合理性」的任意數字)來向Web瀏覽器或API返回響應,則可能無法按預期工作。大量請求佔用服務器資源會導致服務器對任何後續請求無響應,導致整個站點停止運行。

max_execution_time參數是一種保護性控件,用於在腳本(例如)陷入無限循環或以不合理的時間運行時緩解站點的降級。腳本執行被終止,釋放被消耗的資源,通常是非生產性的。

Is the time aggregate of all requests by a method?

這是腳本中所有內容的總運行時間 - 而不是一個特定的操作。

Does memory overload cause this?

不典型,但也許當系統限制的內存,並使用一個交換文件,因爲交換顛簸可以消耗大量時間。

Will it help by chunking the data and handling it through multiple request?

在這種情況下,是的,對於使用較小的批處理(通常來說)應該減少運行時間可能有意義。一切都是一種折衷,因爲就工作單元的工作時間而言,大批量可能會或可能不會更有效,這是工作負載特定且很少線性的。