我是有个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。