如何处理长PHP脚本?

如何处理长PHP脚本?,php,mysql,Php,Mysql,我正在使用foreach函数将一个30mb的CSV文件导入MySQL。这个脚本需要运行大约2-5分钟,我已经在使用ob\u flush 现在我的问题是: 是否有其他选项向用户指示加载进度?此时,您永远不知道脚本何时将被完全加载 我正在使用foreach函数将一个30mb的CSV文件导入MySQL。这个脚本需要运行大约2-5分钟,我已经在使用ob_flush了 最好的建议是根本不要使用foreach循环将CSV导入MySQL。。。。MySQL提供了一个内置的导入CSV文件的功能,这大大加快了导入速

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

现在我的问题是:

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

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

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

在手册页面中查找MySQL特性


说真的,当我说“快得多”时,我的意思是——将代码切换为使用
加载数据填充
,这样就不需要进度条了。

实现这一点的一个简单方法是在所有页面HTML发送到浏览器后,调用在页面末尾执行工作的函数

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

然后,当您在循环中迭代时,大约每100次迭代,回显一行javascript以使用新的百分比更新该元素:

echo "
    <script type='text/javascript'>
        $('#progressBar').html('".(int)$percentage."');
    </script>";
echo”
$('#progressBar').html('.”(int)$percentage.“);
";
根据迭代次数的不同,您需要确保浏览器不会被javascript代码块淹没。在回显块之前,可能会检查百分比是否可以被5整除


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

我同意@SuperJer,您必须使用AJAX

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

如果数据较少,Foreach是好的,但对于海量数据,我认为这并不好。始终使用内置的方法或函数

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

LOAD DATA INFILE 'c:/your_csv_file.csv' INTO TABLE tablename.

通过长时间轮询(发送间歇性AJAX请求以检查当前记录进度的数据库,例如,脚本已完成25%,将里程碑保存到DB,等待AJAX读取,然后相应地更新bar)或使用WebSocket。不要在web服务器进程内执行此操作。将其放在预定事件(例如cron)或添加到作业服务器(例如Gearman)中。我要补充的一个警告是,CSV不是标准格式,并且不是一个工具生成的每个CSV文件都可以由另一个工具干净地导入,更不用说正确地与SQL类型对齐。但是,您通常可以将原始数据导入到临时表中,并运行UPDATE语句来修复特定列的问题。另一种方法(加载数据填充需要文件访问)是将多个INSERT组合到一个具有多个值的INSERT中。它可以快很多倍,而且不需要更改数据库。@IMSoP-
加载数据填充
在定义分隔符、行尾等方面非常灵活。它非常擅长处理奇数格式的文件,只要格式一致就可以处理。我的解决方案实际上完全没有AJAX。本质上,Javascript命令是在工作完成时附加到页面上的,而不是与会话的重复通信。请注意,您的CSV数据必须绝对正确,因为不正确的数据将导致各种各样的问题。@tadman您是对的……如果用户传递错误或无效数据,它将抛出错误/警告。。或者您可以使用日志文件进行验证。。