Laravel 5.3:导致'最长执行时间超过30秒'的原因

时间:2017-06-17 04:25:38

标签: php mysql vagrant laravel-5.3 centos7

问题

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

  

Connection.php第720行中的FatalErrorException:

     

超过30秒的最长执行时间

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

问题

我知道我们可以使用以下任何一种解决方法:

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

    这可能背后有很多原因,而且我更有兴趣知道它的确切时间在哪里。 Laravel没有提供比上述更多的详细信息。如果有人能提供调试方法,我真的很感激。有用的事情:

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

    环境

    • Laravel 5.3
    • Centos 7 vagrant
    • MySQL

1 个答案:

答案 0 :(得分:1)

这不是特定的操作耗尽时间。它是......从开始到结束的所有事情。

  

max_execution_time integer

     

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

     

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

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

max_execution_time参数是一种保护性控件,用于在脚本(例如)陷入无限循环或以其他方式运行不合理的时间时缓解站点的性能下降。脚本执行终止,释放正在消耗的资源,通常是以非生产性的方式。

  

方法的所有请求的时间聚合是什么?

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

  

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

通常情况下,除非系统受内存约束并使用交换文件,否则交换抖动可能会占用大量时间。

  

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

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