PHP освобождает память включаемого файла - PullRequest
3 голосов
/ 15 мая 2011

Можно ли освободить память, сгенерированную из включенного файла, вот мои коды

a.php

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

b.php

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

function ....

}

?>

Я проверилчто после того, как я включу b.php, использование памяти увеличится, что выше, чем при создании нового объекта.Результат как показано ниже:

348832 496824 497072

Итак, как мне освободить память включенного файла?

Ответы [ 3 ]

3 голосов
/ 15 мая 2011

Я думаю, что PHP не может де-включить (я имею в виду, освободить пространство памяти, удерживаемое включенным файлом), так как содержимое файла может быть использовано позже. Это дизайнерский выбор создателей PHP.

После того, как ваш PHP-скрипт завершит работу, он освободит израсходованную память, не беспокойтесь об этом слишком сильно, если он действительно не слишком загружен и у вас большая нагрузка трафика.

Если существует (скажем, огромный) объект из включенного файла, который вы хотите освободить прямо сейчас, используйте unset($obj). Это поможет некоторым. Для более точной настройки вы должны прочитать больше о политике сборки мусора PHP.

2 голосов
/ 15 мая 2011

PHP компилирует код из всех ваших включенных / необходимых файлов для кода операции для более быстрого выполнения, эта память не может быть выделена, php освобождает ее после завершения скрипта.

Если вы выделите некоторую память / объект в вашем втором требуемом файле, он также займет память, но вы можете сбросить эти переменные (но это не ваш случай, так как вы просто объявляете класс в вашем b.php) .

Кроме того, php должен знать, что вы не хотите снова включать файл b.php (include_ONCE), поэтому он хранит внутреннюю запись файлов, которые вы включили, чтобы не пытаться включить их снова (это означает, что это также потребляет память).

Как сказал ахмет алп балкан, вы также можете попытаться сохранить использование памяти вашего скрипта как можно ниже, если вы освободите переменные, которые вам больше не нужны, через unset (); Но по соображениям производительности PHP не выделяет эту память прямо в момент, когда вы вызываете unset, а скорее отмечает эту неустановленную переменную как «освобожденную». Затем приходит сборщик мусора и освобождает все освобожденные переменные (+ те, которые, по его мнению, вам больше не нужны). 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();
?>
1 голос
/ 03 января 2015

Если существует реальная опасность нехватки памяти и вам нужно только извлечь конкретную информацию из файла, вы можете использовать $ 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';

В некоторых случаях вы можете сэкономить больше памяти, обрабатывая файл построчно.

Недостатком является то, что файл не будет размечен, поэтомуон будет занимать больше памяти во время использования, но, по крайней мере, вы не будете носить его с собой до конца программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...