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

我有一个php,每天计划任务执行一次,逻辑如下:
1.连接数据库,从数据库中Select读取相关数据到数组
2.根据得到的数据数量进行循环,循环中间包含3个mysql操作(select、insert、update各一个)
3.循环完后关闭数据库连接

循环执行的次数根据步骤1的mysql_num_rows而定,基本上几千上万。
那么在循环过程中就会短时间内连续执行几千上万X3次数据库操作,效率非常低下。并且因为循环次数多任务重需要很长时间才能执行完,会导致nginx出现504错误。
且频繁数据库操作和长连接,占用过多资源,导致整个环境效率低下。

请问该怎么优化呢?
麻烦各位大神赐教,先谢谢了


阿波罗的战车
浏览 221回答 5
5回答

千巷猫影

就你说的这个情况,建议不要用请求的方式解决,用 crontab 加计划任务在后台运行 php 脚本,数据库查询时分批处理,比如总共 100000 条,每次 1000 条;如果必须逐条处理且速度不是很快,建议一边 fetch_row 一边处理,避免先放入 array 再循环。记得根据执行情况 set_time_limit 和数据库连接的超时时间。

aluckdog

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

ITMISS

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

一只名叫tom的猫

一次不要取太多的数据(减少资源占用)采用多进程的方式,并行执行(提高效率)适当的使用 sleep

慕田峪9158850

对性能要求不高,数据量也不高(10W内都还好),可以直接定时任务(cli模式)。对性能要求稍高或数据量较大,可以用定时任务+队列(参考数据:20W数据,每次约5条sql;队列78个进程,约20秒处理完)
打开App,查看更多内容
随时随地看视频慕课网APP