php - 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 内存使用和最佳实践的技术解释——特别是为什么我没有看到内存差异——而不是解决该问题的方法。
解决方案
LIMIT 1
使用;确保查询结果返回一行 如果没有找到结果,则getParent()
返回false
ornull
以便可以将其设置$parent
为退出while
循环。而且我不认为你需要$node
在你的情况下通过引用传递参数。
推荐阅读
- r - 根据每组中的百分比为 R 中的列分配一个值
- javascript - Expo Go Stripe:本机模块不能为空
- javascript - 单击后 CSS 在 React JS 中不起作用,在页面重新加载后它正在工作
- python - .txt 文件中每一行的编号
- python - 格式化 Pandas 数据框以突出显示列标题并删除空白
- python - PyTorch:“梯度计算所需的变量之一已被就地操作修改”
- python - 如何在 Python 中删除具有特定属性的列表字典中的重复项?
- angular - 生产环境中的 ASP.NET Core Angular 错误 CSS
- cypress - 从以前保存的状态运行多个测试
- java - 在 Java 中使用 rdf 和 sparql 的 Web 应用程序的架构是什么样的?