我有一个门户网站,您可以在其中添加新用户到托管平台,当您通过表单添加用户将用户信息保存到mysql表(pdo)时,实际上可能会插入3或4个表
此外,SOAP请求被发送到外部站点并且读取响应,具体取决于用户选项,可能会发送更多SOAP请求。
还与smpp提供商建立连接以发送短信。
因此,添加1个用户可能需要相当长的执行时间。我想制作批量导入csv选项,上传文件并将每一行作为要添加的新用户进行处理。
如何才能说出导入100个没有错误和超时的用户的最佳方式?
我在考虑每个用户的ajax请求,如how to put each php foreach value into each jquery ajax
所示但回答的人也说"但是,我强烈建议将值作为一个数组传递,只有一个ajax调用"。但这不容易超时吗?
理想情况下,我认为最好的方法是一次添加一个,并获得每个用户的结果。
答案 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会从中读取并返回给客户端。