1

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

此外,一个 SOAP 请求被发送到外部站点并读取响应,这取决于用户选项,可能会发送进一步的肥皂请求。

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

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

说导入 100 个用户而没有错误和超时的最佳方式是什么?

我正在考虑每个用户的 ajax 请求,如此处所示如何将每个 php foreach 值放入每个 jquery ajax

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

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

4

1 回答 1

2

如果上传成功,您可以上传 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 处理程序将读取从这里返回给客户。

于 2013-01-26T10:44:56.743 回答