从CSV和进程批量导入PHP

时间:2013-01-26 10:27:12

标签: php jquery

我有一个门户网站,您可以在其中添加新用户到托管平台,当您通过表单添加用户将用户信息保存到mysql表(pdo)时,实际上可能会插入3或4个表

此外,SOAP请求被发送到外部站点并且读取响应,具体取决于用户选项,可能会发送更多SOAP请求。

还与smpp提供商建立连接以发送短信。

因此,添加1个用户可能需要相当长的执行时间。我想制作批量导入csv选项,上传文件并将每一行作为要添加的新用户进行处理。

如何才能说出导入100个没有错误和超时的用户的最佳方式?

我在考虑每个用户的ajax请求,如how to put each php foreach value into each jquery ajax

所示

但回答的人也说"但是,我强烈建议将值作为一个数组传递,只有一个ajax调用"。但这不容易超时吗?

理想情况下,我认为最好的方法是一次添加一个,并获得每个用户的结果。

1 个答案:

答案 0 :(得分:2)

如果上传成功,您可以上传CSV文件并让服务器立即响应。服务器可以将CSV粘贴到队列中,让调度程序从队列中提取文件,并在单独的进程上执行所有操作。客户端会定期发送ajax请求以检查服务器是否已完成批量操作。如果完成,服务器将响应ajax调用,其中包含CSV中所有项目的所有操作的摘要以及任何错误。我不会在CSV中为每个项目发送一个ajax调用,这会使批处理项目的目的失败。

你在Linux上运行吗?如果是这样,一个例子是每分钟使用cron execute批处理php脚本。例如你的crontab文件:

* * * * * php /path/batch_processor.php

文件队列可以存储在DB表中,该表记录上传时间,处理开始和结束等,php脚本只需提取第一个未处理的文件即可开始工作。

或者,您可以使用exec上传CSV文件而不是使用调度程序立即启动后台进程。 PHP手册说:

  

如果程序是使用此功能启动的,则为了它   继续在后台运行,程序的输出必须是   重定向到文件或其他输出流。没有这样做会   导致PHP挂起,直到程序执行结束。

所以你可以在你的上传处理程序中使用类似的东西。

exec("nohup php /path/batch_processor.php 1 > batch_output.txt  2 > batch_error.txt &");

1 >2 >重定向脚本输出和错误; &表示在后台运行; nohup忽略挂断信号,例如,如果进程所有者会话结束。

如果你在Windows上然后搜索,那里有关于运行后台进程的大量信息。

当您的批处理脚本完成后,它可以将csv文件标记为在db表或其他共享资源中完成,因此当您处理ajax调用以检查csv批处理的状态时,您只需查找并检查已完成的标志如果完成,则将批输出返回给客户端。

如果您想改进功能并为每个ajax调用提供增量状态更新,无论批处理是否已完成,那么批处理将为其处理的每个项目和您的ajax写入共享资源(数据库或文件等) handler会从中读取并返回给客户端。