关于内存耗尽问题
php吧
全部回复
仅看楼主
level 7
何以為生 楼主
我的接口从官方API获取数据然后在循环里处理,但是数据量太大,处理到中途就会超时报502,请问怎么解决这个问题。
2021年08月16日 09点08分 1
level 7
何以為生 楼主
1
2021年08月16日 09点08分 2
level 7
何以為生 楼主
1
2021年08月16日 09点08分 3
level 7
何以為生 楼主
1
2021年08月16日 10点08分 4
level 7
何以為生 楼主
1
2021年08月16日 10点08分 5
level 7
何以為生 楼主
还有个问题,在循环里面的变量会累积内存吗?比如一个$a赋值十次,是会消耗一块内存,还是不止一块?
2021年08月16日 11点08分 6
level 1
一个$a赋值十次,只会消耗一块内存
用init_set 可以临时修改内存和超时时间(只在本次请求中生效),还不够就unset掉没用的变量。
大批量数据用接口跑很不稳定,如楼上所说,建议用cli 脚本跑,将数据分块(看你的规则划分,每块不要太大)每次跑一定量的数据,用trycatch 方法防止报错程序跑不下去,建一个表记录是否执行成功,执行失败就记录错误信息到数据库的表中(用log也可以,但是用表更清晰可溯源)
注意最好十几条到几十条一起插入一次数据库,不要一条一条的插入,数据库链接会被占用到导致服务器卡顿。
更好的方法就是上swoole和redis,弄个队列,开多进程处理数据。
2021年08月16日 14点08分 8
讲得好,辛苦了。但是循环里如果有一个a变量一直赋值,内存会累积。
2021年08月16日 14点08分
@何以為生 那可能是我记错了,总之以前跑大批量数据的时候直接改最大内存就解决了。 不过没上swoole多线程的结果就是每次要跑半小时,又慢又不稳定
2021年08月28日 13点08分
level 11
如果太大,可以用除法,分多个异步进程去搞
2021年08月19日 13点08分 9
level 14
内存不够这还不简单,加内存呗[滑稽]
首先,看看超时限制有没有关闭。也就是默认30秒。有个max_execution_time可以设置,关闭的自己去搜。排除了这个你才能说硬件不够。
那么这个数据量很大,还是第三方的,不是你能控制的。那得看是不是需要实时处理返回给用户,不是的话很好处理,搞个消息队列,延时排队处理。要是要实时返回给用户,加cpu加内存,或者用swoole的协程。
2021年08月22日 07点08分 10
1