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

新手上路,请多包涵

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

阅读 5.7k
4 个回答

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

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

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

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

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

任务表

字段 类型 描述
id int id
status tinyint 状态,默认0 (1已完成 0 未完成)
filename varchar 文件名称,可选
datetime datetime 创建时间
completetime datetime 完成时间

子任务表

字段 类型 描述
id int id
jobId int 任务id
joinId int 关联id(需要插入到pdf的数据id)
status tinyint 状态,默认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"

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

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

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题