【发布时间】:2015-12-04 06:42:06
【问题描述】:
我正在制作一个模块,您可以将记录从 excel 文件上传到数据库中。这些只是电话号码。所以这是我的代码:
$file = Input::file('file');
Excel::load($file, function($reader) {
// Getting all results
$results = $reader->get()->toArray();
//var_dump($results);exit;
foreach ($results as $key => $value) {
$phone = new Phone();
$phone->msisdn = $value['msisdn'];
$phone->save();
}
});
我正在使用https://github.com/Maatwebsite/Laravel-Excel 来读取 excel 文件。它工作正常,我猜 20 分钟内上传了 20,000 条记录,有没有办法让它更快地上传?我知道这也取决于服务器,但还有其他因素吗?我正在使用 MySQL
谢谢
【问题讨论】:
-
20000 是 20 分钟似乎很慢。你能记录下每个操作需要多长时间才能看到瓶颈在哪里?
-
能否不将 Excel 文件的(相关位)保存为 CSV,然后使用
LOAD DATA或 mysqlimport? -
这里的主要问题是您正在循环插入。不要使用 Eloquent,而是使用 Query Builder。 Here 是一个帮助你前进的例子。
-
问题几乎肯定出在 Excel 方面。该软件包使用 PHPExcel,这是一个令人难以置信的软件包,但 非常 资源密集。 This question 询问用于在 PHP 中读取 Excel 文件的不同包。我没有研究过这些,所以我不能代表任何一个。如果您可以将 Excel 文件另存为 CSV,那将为您提供最佳性能
-
我认为查看批量插入或
LOAD DATA FROM INFILE是您最好的选择。我还认为,如果采用批量插入路线,您可以通过不将全部内容读入内存来节省时间。只需读取文件的每一行并继续构建批量插入查询,当查询达到一次要插入的记录数时触发实际插入。我绝对不会采取额外的步骤来实例化每个插入的电话对象,除非您需要在插入之前执行诸如验证/转换数据之类的操作。
标签: php mysql excel upload laravel-5