首页 > 解决方案 > PHP - 为什么通过引用传递使用相同数量的内存?

问题描述

我的 PHP 脚本中出现“内存耗尽”。我不知道为什么。限制为 128Mb。我正在从 javascript xmlrequest() 发送一个最大为 10MB(通常小于 1MB)的 json 字符串。PHP 脚本本身是 43K。即使将所有内容复制十几次,我也不应该耗尽内存。我在 getParentFolders() 对数据库进行了几次调用,但只产生了几行。当然不是它声称我正在使用的 62 兆字节。我使用过 Xdebug(见图),但这并没有告诉我任何有用的信息,只是,是的,我使用了很多内存。

所以在这一点上,我正在尝试做“最佳实践”以尽量减少内存使用。一个简单的解决方法,或者我想,是通过引用传递值。所以我在每个函数的每个变量之前都放了一个“&”。令我惊讶的是,内存消耗没有变化。事实上,它稍微差了几个字节。我也尝试过将每个变量都用作全局变量,但再次令我惊讶的是,几乎没有什么区别。

发生什么了?为什么通过引用传递和使用全局变量不会产生我预期的性能优势?(见图片)

Xdebug '按值传递'

在此处输入图像描述

Xdebug '通过引用'

在此处输入图像描述

请注意,它们几乎相同。

对于那些想要代码的人,这里是 getParentFolders() 函数,它只返回一个短字符串,但不知何故使用了 70Mb!

function getParentFolders(&$node) {  //returns a string of folders
    debugprint("GetParentFOlders()");  //prints if $DEBUG flag is on
    $parent = getParent($node);
    $path = "";
    while ($parent) {  //goes till we hit root folder
        $path = $parent->title . '/' . $path;  //prepend it
        $parent = getParent($parent);
    }
    return $path;
}

function getParent(&$node) {  //return node that is the parent 
    global $email;
    $parentId = $node->parentId;
    $clientId = $node->parentClient;
    $idCol = $clientId . "_id";
    $tablename = $email . "_bookmarks";
    $query = "SELECT * FROM `$tablename`
                        WHERE $idCol = '$parentId'";  //only return one row since id is unique
    $result = sendquery($query);
    return (object) $result[0];
}

编辑:

澄清一下,我正在寻找关于 PHP 内存使用和最佳实践的技术解释——特别是为什么我没有看到内存差异——而不是解决该问题的方法。

标签: phpmemorymemory-managementout-of-memorypass-by-reference

解决方案


LIMIT 1使用;确保查询结果返回一行 如果没有找到结果,则getParent()返回falseornull以便可以将其设置$parent为退出while循环。而且我不认为你需要$node在你的情况下通过引用传递参数。


推荐阅读