【问题标题】:Laravel 5.3: What is causing 'maximum execution time of 30 seconds exceeded'Laravel 5.3:是什么导致“超过 30 秒的最大执行时间”
【发布时间】:2017-11-19 21:50:12
【问题描述】:

问题

我正在使用Laravel 5.3 使用控制器代码中的函数将一个巨大的(大约>1 million rows>25 columns)制表符分隔文件导入mysql 数据库(我禁止在此处发布所有代码)。在处理文件时遇到以下错误:

Connection.php 第 720 行中的 FatalErrorException:

最长执行时间超过 30 秒

请注意,在失败之前,应用程序正在为不同的实例导入不同数量的行。

问题

我知道我们可以使用以下任一方法解决此问题:

  1. 更改php.ini 建议here
  2. 按照建议在public/index 的开头添加ini_set('max_execution_time', 300); here

这背后可能有多种原因,我更有兴趣知道它到底在哪里没时间了Laravel 没有提供比上述更多的细节。如果有人可以提供调试方法,我将不胜感激。有帮助的事情:

  • 一个方法的所有请求的时间聚合吗?
  • 内存过载会导致这种情况吗?
  • 将数据分块并通过多个请求进行处理会有所帮助吗?

环境

  • Laravel 5.3
  • Centos 7vagrant
  • MySQL

【问题讨论】:

  • Is the time aggregate of all requests by a method?这是一个请求,我建议使用一些排队解决方案来处理长时间运行的计算,例如任何基于 AMQP 的计算。

标签: php mysql vagrant laravel-5.3 centos7


【解决方案1】:

这不是一个超时的特定操作。它是……从头到尾的一切。

max_execution_time integer

这设置脚本在被解析器终止之前允许运行的最长时间(以秒为单位)。这有助于防止编写不佳的脚本占用服务器。默认设置为 30。

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

这里的想法是,对于 Web 服务,一般来说,从请求到响应只有一定的时间是合理的。显然,如果需要 30 秒(“合理性”的任意数字)向 Web 浏览器或 API 返回响应,则可能无法按预期工作。大量占用服务器资源的请求会导致服务器对任何后续请求无响应,从而导致整个站点瘫痪。

max_execution_time 参数是一种保护性控制措施,可在脚本(例如)陷入无限循环或以其他方式运行不合理的时间时减轻网站的降级。脚本执行被终止,释放正在消耗的资源,通常以非生产方式。

一个方法所有请求的时间聚合吗?

这是脚本中所有内容的总运行时间——不是一个特定的操作。

内存过载会导致这种情况吗?

通常不会,除非系统内存受限并使用交换文件,因为交换抖动会消耗大量时间。

分块数据并通过多个请求处理它会有所帮助吗?

在这种情况下,是的,使用较小的批次可能是有意义的,这(一般来说)应该会减少运行时间。一切都是一种权衡,因为更大的批次可能会或可能不会更有效,就每个工作单元的处理时间而言,这是特定于工作负载的,很少是线性的。

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 2013-04-01
    • 2013-11-16
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多