【发布时间】: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_abort、php.net/manual/en/features.connection-handling.php(但这仍然会受到最大执行时间。) -
我需要一种方法,以便无需用户干预即可执行 artisan 命令。用户唯一需要做的就是上传文件。其余的应该是自动化的,我不能超时。