gpt4 book ai didi

PHP脚本内存限制及内存优化

转载 作者:行者123 更新时间:2023-12-04 00:43:32 25 4
gpt4 key购买 nike

我有一个 php 脚本来删除网站(仅限文本文件)。运行几个小时后,我注意到脚本因达到内存限制而停止。我知道我可以增加限制,但是由于脚本加载的文件是 onlty HTML 文件,我解释了达到限制的原因是脚本无法在每次循环后清空内存。我可以通过定期刷新()内存来优化脚本的内存管理吗?

最佳答案

一般来说,您不需要在 PHP 中手动管理内存,因为它在 Zend 引擎中内置了一个高级内存管理器,可以为您处理这件事。但是,了解一些其工作原理有助于更好地理解您的代码内存不足的原因。

作为一个非常基本的概述,PHP 根据引用特定数据的变量数量的“引用计数”释放内存。所以如果你说 $a = 'hello'; $b = $a;,包含字符串 'hello' 的单个内存块的引用计数为 2。如果调用 unset()无论是变量,还是它们超出范围(例如,在定义它们的函数的末尾),引用计数都会减少。一旦引用计数达到零,数据将被删除并释放内存。请注意,在这种情况下,“释放”意味着释放供该 PHP 脚本的其他部分使用,不一定释放回操作系统供其他进程使用。

有一些 PHP 版本之间的差异 值得了解:

  • 如果您有循环引用(例如 $obj1->foo = $obj2; $obj2->bar = $obj1;) 因为引用计数永远不会达到零。在 PHP 5.2 及更早版本中,这意味着此类循环引用会导致内存泄漏,并且必须由程序员手动处理。在 PHP 5.3 中,一个 "Garbage Collector"添加专门用于处理这种情况。它不会取代正常的引用计数机制,但如果循环引用在您的代码中很常见,它可能值得一读。
  • PHP 5.4 对 PHP 分配和使用内存的方式进行了大量优化。据我所知,这些都不会改变关于如何编写高效代码的基本建议,它们只是一个很好的理由,如果可以的话,升级您的 PHP 版本。

除此之外,还有一些编写 PHP 代码以充分利用内存的常用技巧:

  • 确保在不再需要时丢弃未使用的变量。在结构良好的程序中,这通常不是问题,因为大多数变量都是特定函数的局部变量;当函数退出时,它们将超出范围并被释放。但是,如果您要创建大型中间变量,或动态创建大量变量,手动调用 unset() 可能是个好主意。如果你的代码是非常线性的,或者使用了大量的全局和静态变量,那么仅仅将它重构为一个更模块化的结构可能会提高它的内存性能以及它的可读性、可维护性等。
  • 通过引用分配或传递变量 ($foo = &$bar) 可能会导致 PHP 使用比直接分配 ($foo = $bar).这是因为PHP使用了一种“Copy On Write”机制,将具有相同内容的变量存储在内存的一个位置,但引用赋值与这种机制有冲突,因此PHP不得不提前复制变量。
  • 对象比标量值(整数、 bool 值、字符串)或数组更需要内存。这是在 PHP 5.4 中得到很大改进的事情之一,但仍然值得思考 - 虽然显然不排除编写结构良好的代码!

关于PHP脚本内存限制及内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586438/

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