gpt4 book ai didi

php - 如何找到泄漏内存的 PHP 脚本?

转载 作者:IT王子 更新时间:2023-10-29 01:13:58 26 4
gpt4 key购买 nike

我的专用服务器有 32GB 内存,内存不断增加,我现在必须每天重新启动它。这让我付出了客户和金钱的代价。

我很难找到内存泄漏的位置。我在网上只能找到人们说“使用 xdebug”,但我找不到任何有关查找内存泄漏的 xdebug 教程。我曾尝试在函数调用之前和之后打印 memory_get_usage 但这是正确的方法吗?

我有许多 php 脚本正在运行——一些来自访问者,另一些来自 cron 作业——我需要找出其中的哪些正在泄漏内存并尽快修复它,但我什至不知道如何确定是否存在给定函数是否泄漏内存。

我尝试在函数调用之前和之后打印 memory_get_usage,它会上升,但是如果我多次调用该函数,它就不会再上升了。谁能解释一下并告诉我如何简单轻松地判断 PHP 函数是否存在内存泄漏?

最佳答案

你可以做各种各样的事情,但首先你应该尽量避免造成内存泄漏。

让我澄清一下:PHP 是一种脚本语言,它不是为长时间运行的脚本而设计的,因此它的内存管理不是市场上最好的。但为什么会这样呢?它的目的是在请求级别上调用,因此它的运行范围非常小(不超过 2 - 3 秒)。其他一切都应该放在后台。

我可以做些什么来防止内存泄漏?

  1. 如果您的版本低于 5.4,则需要注意循环引用,因为它们不会被垃圾回收。

  2. 如果您需要连续运行脚本,您可能会考虑另一种方法。请尝试 while(true) 实现,但将 supervisor ( http://supervisord.org ) 包裹在您的脚本周围,并在脚本结束后调用它。这样您就可以 100% 确保永远不会发生内存泄漏。

  3. 您可以使用 xdebug 逐个分析您的脚本并找出消耗大量内存的位置。

  4. 如果不再需要该类,您可以实现一个析构函数来取消设置所有引用。

    public function __destruct(){
    $this->cleanup();
    }

    public function cleanup() {
    //cleanup everything from attributes
    foreach (get_class_vars(__CLASS__) as $clsVar => $_) {
    unset($this->$clsVar);
    }

    //cleanup all objects inside data array
    if (is_array($this->_data)) {
    foreach ($this->_data as $value) {
    if (is_object($value) && method_exists($value, 'cleanUp')) {
    $value->cleanUp();
    }
    }
    }
    }
  5. 阅读有关垃圾收集的 PHP 文档 http://us3.php.net/manual/en/features.gc.php

  6. 避免使用全局变量,因为它们永远不会被垃圾回收,需要明确地unset。如果您使用 ZF 或 Symfony 之类的框架,这可能是不可能的,因为这样做会破坏功能。

最后但同样重要的是,我想再次强调,PHP 不适合长时间运行的脚本!如果你有事情要做,需要持续运行,你不应该因为 PHP 的内存泄漏而崩溃,而是花时间学习更复杂的语言,如 JAVA 或 C#。

关于php - 如何找到泄漏内存的 PHP 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com