PHP大量数据写入文档,如何异步处理?

发布于 2022-09-12 00:38:54 字数 72 浏览 29 评论 0

目前环境是windows系统,laravel框架,要把大量数据库的数据写入文档,同步方法操作经常超时,所以考虑异步处理,该怎么弄?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

紫罗兰の梦幻 2022-09-19 00:38:54

你如果对定时任务或者队列什么的不是很了解,可以从最原始/基本的来,首先要知道怎么实现它,基本的思路得有。

就是你需要以任务表+定时脚本的方式来实现。

页面点击保存,然后就弹出提示用户,“您的文件正在导出/保存中,完成后会发消息或者邮件给您”。如果没有消息通知或者邮件的方式,可以直接提示,请稍后再来此页面查询结果。

然后你点击保存,后端的逻辑是这样:

  1. 建立一个任务表
  2. 把需要存入pdf的数据id单独保存在一个子任务表
  3. 设置定时任务(crontab),编写脚本(脚本设置没有超时限制),每分钟执行一次这个脚本,然后查询任务表状态是0未执行状态的任务
  4. 根据任务id取出子任务表中的数据,然后执行保存到pdf操作
  5. 保存完成,改变任务表状态为1已完成,执行其他后续操作,比如发邮件等

任务表

字段类型描述
idintid
statustinyint状态,默认0 (1已完成 0 未完成)
filenamevarchar文件名称,可选
datetimedatetime创建时间
completetimedatetime完成时间

子任务表

字段类型描述
idintid
jobIdint任务id
joinIdint关联id(需要插入到pdf的数据id)
statustinyint状态,默认0 (0未操作 1已操作)

crontab

定时任务crontab,每分钟执行一次

用curl请求(不推荐):

*/1 * * * * "/usr/bin/curl http://tianji.unspace.cn/cgi/api/demand_send_wx_notice >> /opt/web/tianji/cgi/cron_demand.log"

用php执行脚本:

*/1 * * * * 服务器php绝对路径 脚本绝对路径

php 来执行脚本的话,可以采取锁flock -xn /tmp/lock.lock的方式来解决脚本由于超时,没有执行完毕又被执行一次的情况,甚至可以把执行结果保存到日志:

*/1 * * * * flock -xn /tmp/lock.lock -c "服务器php绝对路径 脚本绝对路径 >> /data/crobtab.log"
茶底世界 2022-09-19 00:38:54

1.如果是在网页操作,网关超时的话,建议换到服务端使用artisan命令执行;

2.如果是数据量过大造成内存溢出,建议调大php的内存限制,同时配合Laravel ORM的chunk方法,一次只取有限的数据进行处理;

3.如果是在终端执行artisan命令时间过长导致连接断开,可以试试nohup

4.如果是想要多线程并行处理,PHP也支持,可以自己写或者找个插件,注意控制好每个线程处理的数据范围不要重复。

善良天后 2022-09-19 00:38:54

”实在网页端,用户点击按钮,调用控制器方法执行数据写入到文档的操作,但是由于数据量过大,经常超时。服务端artisan命令怎么操作?没用过,完全不懂啊“

------如果界面上不是需要及时返回写入结果肯定是需要改成异步的,至于异步方案需要你的实际量实际大小和数据来源等综合考虑。

吃颗糖壮壮胆 2022-09-19 00:38:54

”实在网页端,用户点击按钮,调用控制器方法执行数据写入到文档的操作,但是由于数据量过大,经常超时。"

用队列吧,看laravel的文档比在这问的清楚
https://xueyuanjun.com/post/8993

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文