PHP查询大批量MySQL疑问?

整体环境:Apache2.4.25 + PHP5.6 + MySQL5.5.57

需求:

比如用户表中有2万条数据,需要将这些数据先查出,然后根据用户组表中对应设置的比例,计算用户应该升级还是降级,再进行更新操作。

问题:

当用户量小的时候,没有任何问题,直接浏览器执行,运行结束,所有任务完成。
但是当用户量超过6000后,发现浏览器中会报Apache Server错误
我的PHP代码中也增加了ignore_user_abort(true);和set_time_limit(0);

做法:

我目前的解决方案是,将这条任务拆分成若干个小任务,单个执行,这样虽然能解决了,但是不是长久之计啊。
因为用户量还是会增加的。

疑问:

想问下,大神们,你们是如何处理这种情况的?

因为代码原先不是我写的,只是接手后,用户增长到6000以上了,才发现这个问题的。

中间我想调试下,用ob_flush() flush()看看过程的,结果完全失效,怎么弄都没反应,后来改用日志记录查看,才发现,每次每条任务,只能执行到大概2500左右的位置,就会自己挂掉。

查看服务器资源,cpu和内存也没有满,数据库连接数也没有满,而且因为之前的频繁请求出错,我现在数据库已经改成长连接了。

所以,唠叨了这么多,还是想问,大神们,你们在遇到这种任务的时候,是如何执行的?也是和我这边一样,同一个请求,一直等响应吗?还是有其他方法??

阅读 2.1k
2 个回答

不知道你的场景是否和我一样
我是批量导入,提取在库数据比对校验。
方法1:队列执行,前端轮询结果做响应。
方法2:前端轮询的方式推进任务进度,将整个任务拆分步骤,读取,转格式,分批校验过滤(前端显示进度,每次比对固定数量的数据防止超时),保存有效的记录数据,最后一次性更新插入。

ignore_user_abort(true)set_time_limit(0);设置后还是超时报错,那就是 apache 的超时时间没有设置

这个需求是一定要手动触发然后实时返回的吗?我的理解是,这是一个定时的计算任务,比如每天凌晨计算一次那种
这样的情况下,写成一个 PHP 脚本,用 crontab 做成定时任务是一种比较好的解决方案

最后给一个用浏览器触发的解决方案:
JS 里面拆分任务而不是 PHP,分成多个 Ajax HTTP 请求,保证每个请求不超过 30 秒,这样多长时间都可以执行

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