【发布时间】:2011-03-21 22:15:46
【问题描述】:
我有一个命令行脚本,它通过循环运行 array() 的文件,并使用文件名作为参数来调用辅助对象上的方法。
每次运行脚本,PHP 的memory_get_usage 报告一个越来越大的数字
53294264
57019624
61374624
65699176
70230600
75157152
79900392
84630472
89359264
94300016
100031176
105202448
110360808
115777528
121146976
126784824
132366952
直到我出错
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
很明显,有些东西正在泄漏内存,或者某种全局/静态存储区域不断被添加到。在 PHP 中调试此类错误的最佳方法是什么?在 PHP 中是否存在不经意间发生这种情况的常见情况? xDebug 是否有一些神奇的选项可以帮助我查明这一点?其他工具?
我想出的最好办法是跟踪执行链并通过调用 memory_get_usage() 乱扔代码库,直到我查明确切的问题,但这似乎是一种乏味且低效的方法。
【问题讨论】:
-
我有一个类似的问题stackoverflow.com/questions/849549/…。不幸的是,它没有产生任何“奇迹”解决方案。
-
有用的信息,尽管迈克,感谢您的指点。
-
感兴趣的人的解决方法。我最终为我的脚本编写了一个 bash 包装器。脚本本身检查当前内存使用情况 (us3.php.net/memory_Get_usage) 与内存限制 (us3.php.net/manual/en/ini.core.php#ini.memory-limit) 并在我们开始用完时使用特定的退出代码 (exit(1)) 退出。如果 bash 脚本检测到该退出代码,它会重新生成自己。正在循环的对象是通过从外部源读取 ID 列表来构建的,并且每次脚本成功通过循环时都会更新此列表。
-
我认为 xhprof 在这种情况下没有多大帮助?
-
@Charles - 这是一个一次性导入脚本,编写一个简单的解决方法比在我的环境中启动和运行一个新的 PECL 扩展并学习读取它的输出要快。不过,我打算在将来结帐 xhprof!
标签: php memory memory-leaks memory-management xdebug