我正在使用foreach
函数将30mb的CSV文件导入MySQL。这个脚本需要运行大约2-5分钟,我已经在使用ob_flush
。
现在我的问题是:
是否还有其他选项可以向用户提供加载进度的指示?此时,您永远不知道脚本何时完全加载。
答案 0 :(得分:3)
我正在使用foreach函数将30mb的CSV文件导入MySQL。这个脚本需要运行大约2-5分钟,我已经在使用ob_flush。
最好的建议是不要使用foreach
循环将CSV导入MySQL .... MySQL提供了一个内置功能,用于导入多更快的CSV文件
查找MySQL LOAD DATA INFILE
功能的手册页。
说真的,当我说“快得多”时,我的意思是 - 将代码切换为使用LOAD DATA INFILE
,您将不需要进度条。
答案 1 :(得分:1)
执行此操作的一种更简单的方法是在将所有页面HTML发送到浏览器之后调用在页面末尾执行工作的函数。
假设jQuery,请记下要显示进度指示器的元素,例如id='progressBar'
。
然后,当您遍历循环时,每100次迭代左右,回显一个javascript行以使用新的百分比更新该元素:
echo "
<script type='text/javascript'>
$('#progressBar').html('".(int)$percentage."');
</script>";
根据迭代次数,您需要确保不会使用javascript代码块压倒浏览器。也许在回显块之前检查百分比是否可被5整除。
此外,如果您循环遍历CSV并逐行INSERT
,那么插入一个块(例如每INSERT
500行)会更好(更快)。使用相同的方法也可以轻松显示。
答案 2 :(得分:1)
我同意@SuperJer,你必须使用AJAX。
我每天导入50MB数据,因为我们有电子商务网站。我们在左侧使用了AJAX并放置了一个显示“Files uploaded ....”的加载器。
如果您的数据较少,Foreach很好,但对于大量数据,我认为它并不好。始终使用内置方法或功能。
要上传csv文件,您可以使用以下语法
LOAD DATA INFILE 'c:/your_csv_file.csv' INTO TABLE tablename.