gpt4 book ai didi

php - 在 PHP 中跟踪内存使用情况

转载 作者:IT王子 更新时间:2023-10-28 23:28:52 25 4
gpt4 key购买 nike

我正在尝试跟踪处理 URL 的脚本的内存使用情况。基本思想是在将另一个 URL 添加到 cURL 多处理程序之前检查是否有合理的缓冲区。我正在使用“滚动 cURL”概念,它在多处理程序运行时处理 URL 数据。这意味着我可以通过在每次处理现有 URL 并将其删除时从池中添加一个新 URL 来保持 N 个连接处于事件状态。

我使用 memory_get_usage() 取得了一些积极的结果。添加 real_usage 标志有帮助(不太清楚“系统”内存和“emalloc”内存之间的区别,但系统显示更大的数字)。 memory_get_usage() 确实会随着 URL 的添加而上升,然后随着 URL 集的耗尽而下降。但是,我刚刚超过了 32M 的限制,我最后一次内存检查是 ~18M。

每次 cURL 多信号返回请求时,我都会轮询内存使用情况。由于多个请求可能同时返回,有可能是一堆URL同时返回数据,实际占用14M内存。但是,如果 memory_get_usage() 是准确的,我想这就是正在发生的事情。

[更新:我猜应该在询问之前运行更多测试,增加了 php 的内存限制(但在脚本中保留了相同的“安全”数量)并且报告的内存使用量确实从低于我自己设定的 25M 到超过 32M 的限制。然后,正如预期的那样,随着未添加的 URL 缓慢下降。但我会留下一个问题:这是正确的方法吗?]

我可以以这种方式信任 memory_get_usage() 吗?是否有更好的替代方法来获取内存使用情况(我见过一些脚本解析 shell 命令的输出)?

最佳答案

real_usage 以这种方式工作:

Zend 的内存管理器不会对它需要的每个 block 都使用系统 malloc。相反,它分配一大块系统内存(以 256K 为增量,可以通过设置环境变量 ZEND_MM_SEG_SIZE 进行更改)并在内部对其进行管理。所以,内存使用有两种:

  1. 引擎从操作系统中占用了多少内存(“实际使用情况”)
  2. 应用实际使用了多少内存(“内部使用”)

memory_get_usage() 可以返回其中任何一个。哪一个对您更有用取决于您正在研究什么。如果您正在考虑优化特定部分的代码,“内部”可能对您更有用。如果您要在全局范围内跟踪内存使用情况,“真实”会更有用。 memory_limit 限制“真实”数字,因此一旦从系统中取出限制允许的所有 block 并且内存管理器无法分配请求的 block ,分配就会失败。请注意,这种情况下的“内部”使用量可能低于限制,但分配仍可能因碎片而失败。

另外,如果你正在使用一些外部内存跟踪工具,你可以设置这个环境变量 USE_ZEND_ALLOC=0 将禁用上述机制并使引擎始终使用 malloc()。这将有更差的性能,但允许您使用 malloc 跟踪工具。

另见 an article about this memory manager ,它也有一些代码示例。

关于php - 在 PHP 中跟踪内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290611/

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