为了账号安全,请及时绑定邮箱和手机立即绑定

PHP执行大规模任务时如果提升效率?

PHP执行大规模任务时如果提升效率?

阿波罗的战车 2018-06-10 09:39:41
我有一个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 和数据库连接的超时时间。

查看完整回答
反对 回复 2018-07-12
?
aluckdog

TA贡献1847条经验 获得超7个赞

大量数据的时候交由任务系统去执行。首先发起一个请求,由消息生产者将请求交给消费者处理,并返回,避免等待出现超时。消费者执行多线程处理。建议使用Gearman,使用起来很方便,而且支持PHP接口。其它的类似Workman,Swoole等都能实现。


查看完整回答
反对 回复 2018-07-12
?
ITMISS

TA贡献1871条经验 获得超8个赞

用cli模式的PHP脚本处理即可,不要使用WEB方式,很容易超时

查看完整回答
反对 回复 2018-07-12
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

  1. 一次不要取太多的数据(减少资源占用)

  2. 采用多进程的方式,并行执行(提高效率)

  3. 适当的使用 sleep


查看完整回答
反对 回复 2018-07-12
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

  • 对性能要求不高,数据量也不高(10W内都还好),可以直接定时任务(cli模式)。

  • 对性能要求稍高或数据量较大,可以用定时任务+队列(参考数据:20W数据,每次约5条sql;队列78个进程,约20秒处理完)


查看完整回答
反对 回复 2018-07-12
  • 5 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信