当前位置:首页 > 记一次curl扩展的内存泄漏

记一次curl扩展的内存泄漏

发布于 2018-03-11 阅读 343 次 Linux PHP

这件事已经挺久了

起因

当时需要做一个第三方的数据迁移,量还是挺大的。接这个需求的时候也没多想,通过php cli下进行 curl 的http请求。
因为数据量比较大,用到了curl的并行请求。一次性构造多条记录同时发送。

脚本写完后,自己本地开发跑了一段时间。一切正常,性能也不错perfect。于是放到了某台生产机器上跑了起来。

事件

刚开始,脚本运行稳定(可当时忽略了机器内存)我也放下心去吃饭了
然而没过多久,接到了服务器的报警,立马跑回来查看问题

发现机器的内存都被吃完了,迅速猜到可能是我写的脚本问题。于是先把运行的脚本停了,果然内存降下来了
后面查看监控记录日志发现脚本运行开始后内存消耗是稳定的斜线上升

因为当时是有php运行最大内存设定限制,所以猜测到可能是内存泄漏问题

于是我重新在本地排查问题,由于引用了第三包。遂一个个排除,未果
后面想到可能是curl的问题,于是对curl进行单独处理,通过 memory_get_usage()显示内存占用量。这时一切正常
这会我准备重新提交到生产执行,同时一直盯着内存情况
刚运行没多久,诡异的事情开始了,内存占用在慢慢的以固定的额度上升。于是我迅速stop脚本,内存马上回到正常

测试多次,亦是如此。一回到本地环境测试又立马正常了
当时心中有万匹草尼马奔腾而过

也是一直没往扩展版本上想,后面突然打印了一下phpinfo()搜索了一下curl的版本,与本地对比发现竟然相差好几个版本(至于当时的版本是多少,由于太久了也不记得了)遂立马去 pecl 下载了一个当前支持的稳定版本。替换扩展版本后,重新执行脚本。发现内存稳定了

后语

通过这一次事件,也给自己涨了一次姿势
也是自己一直用的Ubuntu的最新版本,较与服务器的(Centos 5)可能装的扩展版本都比较新。所以一直没发现这个版本导致的问题

如果刚好有看了这篇文章的朋友,可以去看下自己环境的curl扩展版本,如果太低了可以适当的升级一下