整体环境: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和内存也没有满,数据库连接数也没有满,而且因为之前的频繁请求出错,我现在数据库已经改成长连接了。
所以,唠叨了这么多,还是想问,大神们,你们在遇到这种任务的时候,是如何执行的?也是和我这边一样,同一个请求,一直等响应吗?还是有其他方法??
不知道你的场景是否和我一样
我是批量导入,提取在库数据比对校验。
方法1:队列执行,前端轮询结果做响应。
方法2:前端轮询的方式推进任务进度,将整个任务拆分步骤,读取,转格式,分批校验过滤(前端显示进度,每次比对固定数量的数据防止超时),保存有效的记录数据,最后一次性更新插入。