• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php之 Zend 内存管理器

php 搞代码 3年前 (2022-01-20) 14次浏览 已收录 0个评论
文章目录[隐藏]

Zend 内存管理器

Zend 内存管理器,经常缩写为 ZendMMZMM,是一个 C 层,旨在提供分配和释放动态请求绑定内存的能力。

注意上面句子中的“请求绑定”。

ZendMM 不仅仅是 libc 的动态内存分配器上的一个经典层,主要由两个 API 调用 malloc()/free()表示。ZendMM 是关于 PHP 在处理请求时必须分配的请求绑定内存。

相关学习推荐:PHP编程从入门到精通

PHP 中两种主要的动态内存池

PHP 是一个无共享架构。 Well, not at 100%. Let us explain.

注意

在继续之前,你可能需要阅读 PHP 生命周期章节,你将获得有关 PHP 生命周期中的不同步骤和周期的更多信息。

PHP可以在同一个进程中处理数百或数千个请求。默认情况下,PHP 会在完成当前请求后,忘记对当前请求的任何信息。

“忘记” 信息解释为释放处理请求时分配的任何动态缓冲区。这意味着在处理一个请求的过程中,不能使用传统的 libc 调用来分配动态内存。这样做是完全有效的,但是您给忘记释放缓冲区了机会。

ZendMM 附带了一个 API,通过复制其 API 来替代 libc 的动态分配器。在处理请求的过程中,程序员必须使用该 API 而不是 libc 的分配器。

例如,当 PHP 处理请求时,它将解析 PHP 文件。例如,那些将导致函数和类的声明。当编译器开始编译 PHP 文件时,它将分配一些动态内存来存储它发现的类和函数。但是,在请求结束时,PHP 会释放这些。默认情况下,PHP 会忘记从一个请求到另一个请求的大量信息。

然而,存在一些非常罕见的信息,你需要持久地跨越多个请求。但这并不常见。

什么可以通过请求保持不变?我们所说的持久对象。再次说明:那是不常见的情况。例如,当前的 PHP 可执行路径不会在请求之间更改。其信息是永久分配的,这意味着它调用了 传统 libc 的 malloc ()来分配。

还有什么? 一些字符串。例如,“_SERVER” 字符串将在请求之间重用,因为每个请求都将创建 $_SERVER PHP 数组。所以 “_SERVER” 字符串本身可以永久分配,因为它只会被分配一次。

你必须记住:

  • 在编写 PH*本文来源gaodai#ma#com搞@代~码^网+搞代gaodaima码P 核心或扩展时,存在两种动态内存分配方式:

    • 请求绑定的动态分配。
    • 永久动态分配。
  • 请求绑定动态内存分配

    • 仅在PHP处理请求时才执行(不在此之前或之后)。
    • 应该只使用 ZendMM 动态内存分配 API 执行。
    • 在扩展设计中非常常见,基本上95%的动态分配都是请求绑定的。
    • 由 ZendMM 追踪,并会通知你有关泄漏的信息。
  • 永久动态内存分配

    • 不应该在PHP处理请求时执行(这不是禁止的,但是是一个坏主意)。
    • 不会被 ZendMM 追踪,你也不会被告知泄漏。
    • 在扩展中应该很少见。

另外,请记住,所有 PHP 源代码都基于这种内存级别。因此,许多内部结构使用 Zend 内存管理器进行分配。大多数都调用了一个“持久的” API,当调用这个时,将导致传统的 libc 分配。

这是一个请求绑定的分配 zend_string:

zend_string *foo = zend_string_init("foo", strlen("foo"), 0);

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php之 Zend 内存管理器

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址