84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
我是有个php 定时任务,里面是我一次从数据库取1w条数据,处理,完之后再写到数据库。
现在的问题是,每处理1w条数据,内存占用一直在增长,直到超出限制,而不是一直在这1w条所需内存的量上下浮动。
处理好5、6w左右就需要1G多内存了,然后就超出了限制。
我里面处理完上一批数据,这一批的变量都是重新赋值的。不应该一直增长啊。
有什么好办法可以调试出问题出在哪里吗?
妹的,是zend db库有问题。
学习是最好的投资!
1.将1W条数据,修改为每次获取100条处理。2.set_time_limit(0)设置下脚步时长3.每分钟执行一次脚步,每次少量获取
如果使用了遍历:
php 5.5+
遍历中加关键字yield
减少中间变量
循环几次后 print_r($GLOBALS); 看看变量是否有增长,如果有 应该unset掉无用的
如果以上没有问题 那么看看mysql连接问题,建议不要长期连接mysql做循环查询,最好是一次性全部拿出来。随着查询越多,php内存会越来越大。这时应该free_result或断开或销毁进程还有 加参数 -d menory_limit=1g
建议使用workerman 或 swoole 的定时任务功能
workerman
swoole
不知道你读数据库时候用的什么链接方式,比如有mysql_connect和mysql_pconnect,如果是长链接访问的,可以尝试下别用长链接访问;另外,请贴出关键代码结合代码分析。这种问题很像是C里面的内存泄漏。
首先你用php做定时任务就不科学,估计没人有勇气这样做
定时器比较常用的应该还是linux crontab。
1.将1W条数据,修改为每次获取100条处理。
2.set_time_limit(0)设置下脚步时长
3.每分钟执行一次脚步,每次少量获取
如果使用了遍历:
php 5.5+
遍历中加关键字yield
减少中间变量
循环几次后 print_r($GLOBALS); 看看变量是否有增长,如果有 应该unset掉无用的
如果以上没有问题 那么看看mysql连接问题,建议不要长期连接mysql做循环查询,最好是一次性全部拿出来。随着查询越多,php内存会越来越大。这时应该free_result或断开或销毁进程
还有 加参数 -d menory_limit=1g
建议使用
workerman
或swoole
的定时任务功能不知道你读数据库时候用的什么链接方式,比如有mysql_connect和mysql_pconnect,如果是长链接访问的,可以尝试下别用长链接访问;另外,请贴出关键代码结合代码分析。这种问题很像是C里面的内存泄漏。
首先你用php做定时任务就不科学,估计没人有勇气这样做
定时器比较常用的应该还是linux crontab。