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