【问题标题】:uploading CSV file failing上传 CSV 文件失败
【发布时间】:2018-06-26 04:44:17
【问题描述】:

对于客户,我需要上传一个 cvs 文件。该文件有近 35000 行。我使用了maatwebsite/excel 包。

Excel::filter('chunk')->load($file->getRealPath())->chunk(100, 
    function($results) {
        foreach ($results as $row) {
            // Doing the  import in the DB
        }
    }
});

我无法更改 max_execution_time,因为我们的服务器不允许执行超过 300 秒。

我也试过没有任何包的另一种方法,但也失败了。

$csv = utf8_encode(file_get_contents($file));
$array = explode("\n", $csv);

foreach ($array as $key => $row) {
    if($key == 0) {
        $head = explode(',', $row);

        foreach ($head as $k => $item) {
            $h[$key][] = str_replace(' ', '_', $item);
        }
    }
    if($key != 0) {
        $product = explode(',', $row);

        foreach ($product as $k => $item) {
            if($k < 21)
                $temp[$key][$h[0][$k]] = $item;
        }
    }
}

foreach ($temp as $key => $value) {
    // Doing the  import in the DB
}

有人有想法吗?

编辑

所以我做了一个工匠命令。当我在终端中执行它时,它会被执行并导入所有 35000 行。感谢常识。

我只是不知道如何使命令异步运行,以便用户可以关闭他的浏览器。谁能解释一下如何完成?

【问题讨论】:

  • 你为什么不尝试在最后进行批量上传?想象一下,与其将其保存到 foreach 上的 DB 中,不如构建一个大数组并最终一次全部插入。 stackoverflow.com/questions/12702812/…
  • 另一种方法是将import to database process块扔到队列进程中。
  • “如何使命令异步运行,以便用户可以关闭浏览器” - 你可以尝试ignore_user_abortphp.net/manual/en/features.connection-handling.php(但这仍然会受到最大执行时间。)
  • 我需要一种方法,以便无需用户干预即可执行 artisan 命令。用户唯一需要做的就是上传文件。其余的应该是自动化的,我不能超时。

标签: php laravel csv upload


【解决方案1】:

请记住,通过用户的 Web 浏览器将任何文件(尤其是较大的文件)上传到服务器都需要一些时间,因此您绝对不希望无意中鼓励您的用户在文件已完全上传。

也许您可以更新您的代码,以便在文件上传后但在处理之前向用户显示确认消息。

但是,我不知道此时关闭浏览器是否真的会立即终止脚本(或者它是否会继续完成),或者您是否需要在服务器上调用一个单独的程序(可能是一个 cron每隔几分钟运行一次)来解析任何新上传的文件,作为一个单独的任务?

(顺便提一下,由于 StackExchange Q&A 格式的工作方式,强烈建议您在此问题中做出进一步的“回答”作为编辑 您的原始帖子,而不是“答案”(它不是)。

StackExchange 不像一个较旧的“线性”论坛:对原始问题的修改或更新应针对原始问题本身进行,并且答案帖子应仅用于问题的实际建议答案。 (除了我自己,这最后一个真的应该是一个“评论”,但不幸的是我还没有足够的声望点来这样做。)

【讨论】:

  • 我知道上传文件需要一些时间,但这不是问题。该文件已上传并按原样保存。 File::move($file->getRealPath(), 'storage/upload.csv');工匠::call('csv:import');工匠命令已执行,但这需要很长时间,所以我得到了超时。我需要异步执行该命令,这样我就不会超时。当我在终端中运行 te 命令时,它会被执行并且我没有超时。
猜你喜欢
  • 2013-06-09
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 2013-07-09
相关资源
最近更新 更多