我有一个php,每天计划任务执行一次,逻辑如下:1.连接数据库,从数据库中Select读取相关数据到数组2.根据得到的数据数量进行循环,循环中间包含3个mysql操作(select、insert、update各一个)3.循环完后关闭数据库连接循环执行的次数根据步骤1的mysql_num_rows而定,基本上几千上万。那么在循环过程中就会短时间内连续执行几千上万X3次数据库操作,效率非常低下。并且因为循环次数多任务重需要很长时间才能执行完,会导致nginx出现504错误。且频繁数据库操作和长连接,占用过多资源,导致整个环境效率低下。请问该怎么优化呢?麻烦各位大神赐教,先谢谢了
5 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
就你说的这个情况,建议不要用请求的方式解决,用 crontab 加计划任务在后台运行 php 脚本,数据库查询时分批处理,比如总共 100000 条,每次 1000 条;如果必须逐条处理且速度不是很快,建议一边 fetch_row 一边处理,避免先放入 array 再循环。记得根据执行情况 set_time_limit 和数据库连接的超时时间。
aluckdog
TA贡献1847条经验 获得超7个赞
大量数据的时候交由任务系统去执行。首先发起一个请求,由消息生产者将请求交给消费者处理,并返回,避免等待出现超时。消费者执行多线程处理。建议使用Gearman,使用起来很方便,而且支持PHP接口。其它的类似Workman,Swoole等都能实现。
慕田峪9158850
TA贡献1794条经验 获得超7个赞
对性能要求不高,数据量也不高(10W内都还好),可以直接定时任务(
cli模式
)。对性能要求稍高或数据量较大,可以用定时任务+队列(参考数据:20W数据,每次约5条sql;队列78个进程,约20秒处理完)
- 5 回答
- 0 关注
- 220 浏览
添加回答
举报
0/150
提交
取消