2

我正在使用一个foreach函数将一个 30mb 的 CSV 文件导入 MySQL。这个脚本需要运行大约 2-5 分钟,我已经在使用ob_flush.

现在我的问题是:

是否有任何其他选项可以向用户指示加载进度?此时,您永远不知道脚本何时会完全加载。

4

3 回答 3

3

我正在使用 foreach 函数将 30mb CSV 文件导入 MySQL。这个脚本需要运行大约 2-5 分钟,我已经在使用 ob_flush。

最好的建议是根本不要使用foreach循环将 CSV 导入 MySQL。... MySQL 提供了一个用于导入 CSV 文件的内置功能,这快得多。

查找 MySQLLOAD DATA INFILE功能的手册页。

说真的,当我说“更快”时,我的意思是——将你的代码切换为 use LOAD DATA INFILE,你就不需要进度条了。

于 2013-11-08T15:58:20.787 回答
2

我同意@SuperJer,你必须使用 AJAX。

每天我导入 50MB 数据,因为我们有电子商务网站。我们在左侧使用了 AJAX,并放置了一个显示“文件正在上传……”的加载程序。

如果您的数据较少,Foreach 很好,但对于大量数据,我认为它不好。始终使用内置方法或函数。

要上传 csv 文件,您可以使用以下语法

LOAD DATA INFILE 'c:/your_csv_file.csv' INTO TABLE tablename.
于 2013-11-08T16:43:02.317 回答
1

一种更简单的方法是在所有页面 HTML 都发送到浏览器之后,调用在页面末尾完成工作的函数。

假设使用 jQuery,请记下您希望进度指示器出现在其中的元素,例如id='progressBar'.

然后,当您遍历循环时,每 100 次左右的迭代,回显一条 javascript 行以使用新百分比更新该元素:

echo "
    <script type='text/javascript'>
        $('#progressBar').html('".(int)$percentage."');
    </script>";

根据迭代次数,您需要确保不会用 javascript 代码块压倒浏览器。也许在回显块之前检查百分比是否可以被 5 整除。

此外,如果您正在循环遍历 CSV 并INSERT逐行对其进行 ing,最好(更快)插入其中的一个块,例如 500 行每INSERT. 这也很容易使用相同的方法显示。

于 2013-11-08T16:01:33.847 回答