包含文件的 PHP 释放内存


PHP release memory of include file

我可以释放从包含的文件生成的内存吗,这是我的代码

答.php

<?
echo memory_get_usage();
include_once "b.php";
echo memory_get_usage();
$n = new obj();
echo memory_get_usage();
?>

乙.php

<?
class obj {
protected $_obj = array{
....
}
function ....
}
?>

我检查了一下,在我包含 b.php 后,内存使用量会增加,这比创建新对象要高。结果如下

348832496824497072

那么,如何释放包含文件的内存?

我认为 PHP 不能取消包含(我的意思是,通过包含的文件释放内存空间),因为文件的内容可能会在以后使用。这是PHP创建者的设计选择。

PHP脚本完成后,它将释放消耗的内存,不要太担心它,除非它真的会产生太大的开销并且您的流量负载很高。

如果(假设一个巨大的)对象来自您现在要解除分配的包含文件,请使用 unset($obj) .它会帮助一些人。您应该阅读有关 PHP 垃圾回收策略的更多信息以进行微调。

PHP

将你所有包含/必需文件中的代码编译为操作码以加快执行速度,此内存无法取消分配,PHP 会在脚本完成后释放它。

如果您在第二个必需文件中分配了一些内存/对象,它也会占用内存,但您可以取消设置这些变量(但这不是您的情况,因为您只是在 b.php 中声明一个类)。

此外,php 必须知道,您不想再次包含文件 b.php(include_ONCE),因此它会保留您已包含的文件的内部记录,以免再次尝试包含它们(这意味着这也消耗内存)。

正如 ahmet alp balkan 所说,如果您通过 unset() 释放不再需要的变量,您也可以尝试将脚本的内存使用率保持在尽可能低的水平;但是出于性能原因,PHP 不会在调用 unset 的那一刻取消分配此内存,而是将这个未设置的变量标记为"freed"。然后垃圾收集器来释放所有释放的变量(+那些它认为你不再需要的变量)。GC 会随着时间的推移而触发。

尝试例如:

<?
echo memory_get_usage();
include_once "b.php";
echo memory_get_usage();
$n = new obj();
echo memory_get_usage();
unset($n);
echo memory_get_usage();
// try to wait for GC
sleep(5);
echo memory_get_usage();
?>

如果确实存在内存不足的危险,并且只需要从文件中提取特定信息,则可以在函数或方法中使用$x = file_get_contents(),然后使用preg_match()提取信息。

这会降低您的速度,但$x函数或方法返回时应释放。它的另一个优点是,如果从未调用函数或方法,则根本不会使用文件占用的内存。例如:

/* You need the value of $modx->lang_attribute and there is something like this
   in the file: $modx_lang_attribute = 'en'; */
$x = file_get_contents('path/to/file');
$pattern = "/modx_lang_attribute's*='s*'('w'w)'/";
preg_match($pattern, $x, $matches);
return isset($matches[1])? $matches[1] : 'en';

在某些情况下,您可以通过逐行处理文件来节省更多内存。

这样做的缺点是文件不会被标记化,因此它在使用时会占用更多内存,但至少您不会在程序的其余部分随身携带它。