如果上传成功,您可以上传 CSV 文件并让服务器立即响应。服务器可以将 CSV 放入队列中,并让调度程序从队列中提取文件并在单独的进程上执行所有操作。客户端会定期发送一个 ajax 请求来检查服务器是否完成了批量操作。如果完成,服务器将响应 ajax 调用,其中包含对 CSV 中所有项目的所有操作和任何错误的摘要。我不会在 CSV 中为每个项目发送一个 ajax 调用,这会破坏批处理项目的整个目的。
你在 Linux 上运行吗?如果是这样,一个示例是使用cron每分钟执行一次批处理 php 脚本。例如在你的 crontab 文件中:
* * * * * php /path/batch_processor.php
文件队列可以存储在记录上传时间、处理开始和完成等的数据库表中,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 处理程序将读取从这里返回给客户。