如何解决php跑大循环时候的内存耗尽问题

标签(空格分隔): 爬虫


最近认识到了php在和xpath以及mysql配合的方便性后,迫不及待地想找东西来练手。于是乎就盯上了超级玩家,而后更是惊喜地发现,该站没有做爬虫限制(连UA限制都没做),url又是非常的规律,于是就迫不及待地动手啦。

首先还是按惯例用chrome的xpath helper插件来对网页上的dom元素进行分析。

可以很快就得到对应的xpath路径,然后构造sql语句。然而这些都不是今天的重点(因为并不难啊)。
今天的重点是解决php的内存耗尽问题。

当用php跑一个大循环而且每次循环都会对数据库进行查询或者插入时,php就很容易内存耗尽。像最初的脚本,五十万的循环我仅仅是跑到三千多就停止了。至于问题是为何产生的,可以参考PHP的内存限制 Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in以及PHP大量数据循环时内存耗尽问题的解决方案

也就是说只要你每次查询都用ubuffered还有在php脚本一开始就加上ini_set("memory_limit","521M");就好了。然而我的脚本最后还是内存耗尽了,在百度一番后才知道是我的变量使用习惯不好。于是乎我在每次循环结束都用unset函数把变量全部释放感觉,最终这个五十万的大循环终于完完整地跑完了。其实想要进一步优化还有几个办法,比方说把整个循环拆分成若干个部分,每个部分结束就mysql_close()一下。又或者不要用老化的mysql模块。用新的mysqli也可能对性能有所提升