【问题标题】:Timeout when importing an excel file into database将excel文件导入数据库时​​超时
【发布时间】:2017-06-05 21:46:56
【问题描述】:

我正在尝试使用基于 PHPExcel 的 Maatwebsite/laravel-excel 库将 excel 文件导入我在 Laravel 5.4 上的 MySQL 数据库。

我需要导入的文件非常大:至少 50k 行 100 列,我需要为每一行创建一个数据库条目。

我认为我可能在导入过程中遇到了一些问题,所以我开始使用块,但是即使是 1 个块,我也会收到以下错误消息:

最长执行时间超过 180 秒。

我尝试增加 max_execution_time 变量和内存限制,但我似乎仍然无法完成导入。

这是我正在使用的代码:

Excel::filter('chunk')->load($request->file('source_file')->getRealPath())->chunk(1,function ($results) {
    foreach($results as $row) {
        TaskMeta::create([
         'task_id' => $row['task_id'],
         'col2' => $row['column2'],
         ... etc, rest of the 100 columns ommited for clarity
        ]);
    }
});

顺便说一句,我正在我的 Homestead 环境中进行本地测试。我需要一个同样适用于生产服务器的解决方案。

【问题讨论】:

  • 如何运行此命令:从控制台还是通过 Web 服务器?你什么时候为cli或apache更改max_execution_time?谢谢。
  • 我在我的 apache 服务器的 php.ini 文件中更改了 max_execution_time。不过我不想进一步增加它 - 我需要模拟生产环境以确保它能够正常工作。
  • 而且您不想更改 php.ini 中生产环境的任何设置。我说的对吗?
  • 是的,用更长的最大执行时间来维持良好的安全性将是一个巨大的痛苦。
  • 你有没有看过 Maatwebsite/laravel-excel 的“分块”选项,它允许你将文件拆分为多个加载,每个加载不同的部分(“块”)

标签: php excel laravel laravel-5 laravel-excel


【解决方案1】:

如果您只想为此脚本禁用超时,请使用:

set_time_limit(0)

...并监控您的流程以确保它没有挂起。甚至可以将其放入命令中并使用 $this->info() 为每次迭代输出行号,以便您知道它在文件中的位置。

这样你可以覆盖任何可能阻碍你的 .ini 配置:)

http://php.net/manual/en/function.set-time-limit.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2017-10-30
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多