如何处理长PHP脚本?

时间:2013-11-08 15:42:24

标签: php mysql

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

现在我的问题是:

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

3 个答案:

答案 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.