目前环境是windows系统,laravel框架,要把大量数据库的数据写入文档,同步方法操作经常超时,所以考虑异步处理,该怎么弄?
目前环境是windows系统,laravel框架,要把大量数据库的数据写入文档,同步方法操作经常超时,所以考虑异步处理,该怎么弄?
1.如果是在网页操作,网关超时的话,建议换到服务端使用artisan命令执行;
2.如果是数据量过大造成内存溢出,建议调大php的内存限制,同时配合Laravel ORM的chunk方法,一次只取有限的数据进行处理;
3.如果是在终端执行artisan命令时间过长导致连接断开,可以试试nohup
4.如果是想要多线程并行处理,PHP也支持,可以自己写或者找个插件,注意控制好每个线程处理的数据范围不要重复。
”实在网页端,用户点击按钮,调用控制器方法执行数据写入到文档的操作,但是由于数据量过大,经常超时。服务端artisan命令怎么操作?没用过,完全不懂啊“
------如果界面上不是需要及时返回写入结果肯定是需要改成异步的,至于异步方案需要你的实际量实际大小和数据来源等综合考虑。
”实在网页端,用户点击按钮,调用控制器方法执行数据写入到文档的操作,但是由于数据量过大,经常超时。"
用队列吧,看laravel的文档比在这问的清楚
https://xueyuanjun.com/post/8993
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答716 阅读✓ 已解决
2 回答2.3k 阅读
1 回答687 阅读✓ 已解决
你如果对定时任务或者队列什么的不是很了解,可以从最原始/基本的来,首先要知道怎么实现它,基本的思路得有。
就是你需要以
任务表
+定时脚本
的方式来实现。页面点击保存,然后就弹出提示用户,“您的文件正在导出/保存中,完成后会发消息或者邮件给您”。如果没有消息通知或者邮件的方式,可以直接提示,请稍后再来此页面查询结果。
然后你点击保存,后端的逻辑是这样:
0未执行
状态的任务1已完成
,执行其他后续操作,比如发邮件等任务表
子任务表
crontab
定时任务crontab,每分钟执行一次
用curl请求(不推荐):
用php执行脚本:
php 来执行脚本的话,可以采取锁
flock -xn /tmp/lock.lock
的方式来解决脚本由于超时,没有执行完毕又被执行一次的情况,甚至可以把执行结果保存到日志: