memory_get_usage - PullRequest
       32

memory_get_usage

5 голосов
/ 09 марта 2010

Я делаю небольшой тестовый класс для отображения времени загрузки страницы и использования памяти. Время загрузки уже работает, но когда я отображаю использование памяти, оно не меняется Пример:

$conns = array();
ob_start();
benchmark::start();
$conns[] = mysql_connect('localhost', 'root', '');
benchmark::stop();
ob_flush();

использует ту же память, что и

$conns = array();
ob_start();
benchmark::start();
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}
benchmark::stop();
ob_flush();

Я использую memory_get_usage (true), чтобы получить использование памяти в байтах.

Ответы [ 4 ]

8 голосов
/ 09 марта 2010

memory_get_usage(true) покажет объем памяти, выделенный механизмом php, фактически не используемый скриптом.Вполне возможно, что ваш тестовый скрипт не требует, чтобы механизм запрашивал больше памяти.

Для теста возьмите большой (ish) файл и прочитайте его в память.Тогда вы должны увидеть изменение.

Я успешно использовал memory_get_usage(true) для отслеживания использования памяти скриптами сканирования в Интернете, и это работало нормально (поскольку целью было замедлить работу, прежде чем достигнуть ограничения системной памяти)).Единственное, что нужно помнить, это то, что оно не изменяется в зависимости от фактического использования, оно изменяется в зависимости от памяти, запрошенной механизмом. Итак, в конечном итоге вы видите внезапные скачки, а не замедление роста (или сжатия).

Если вы установите флаг real_usage в значение false, вы можете увидетьочень небольшие изменения в памяти - однако, это не поможет вам контролировать истинный объем памяти, запрашиваемый php из системы.

( Обновление : чтобы понять разницу, яописывается между памятью, используемой переменными вашего скрипта , по сравнению с памятью, которую механизм запрашивает для запуска вашего скрипта . Все тот же скрипт, другой способ измерения.)

2 голосов
/ 09 марта 2010

Посмотрите на:

for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}

Вы могли бы зациклиться на 100 000, и ничего бы не изменилось, это то же самое соединение. Ресурсы для него не выделяются, поскольку запоминающий их связанный список никогда не увеличивался. Почему это будет расти? Там уже (предположительно) действительный дескриптор на $conns[0]. Это не будет иметь значения в memory_get_usage (). Вы провели тест $conns[15], чтобы увидеть, работает ли он, да?

Может ли root @ localhost иметь несколько паролей? Нет. Почему PHP потрудился обработать другое соединение только потому, что вы сказали это? ( язык в щеке ).

Я предлагаю запустить то же самое через CLI через Valgrind , чтобы увидеть фактическое использование кучи:

valgrind /usr/bin/php -f foo.php .. или что-то подобное. Внизу вы увидите, что было выделено, что было освобождено и сборщик мусора на работе.

Отказ от ответственности: я знаю, как разбираться во внутренностях PHP, но я не эксперт в этом намеренно запутанном лабиринте, написанном на C, который Zend называет PHP.

2 голосов
/ 09 марта 2010

Я не гуру во внутренностях PHP, но я могу представить, что echo не влияет на объем памяти, используемой PHP, поскольку он просто выводит что-то клиенту.

Может быть иначе, если вы включите буферизацию вывода.

Следующее должно иметь значение:

$result = null;
benchmark::start()
for($i = 0; $i < 10000; $i++)
{
   $result.='test';
}
0 голосов
/ 09 марта 2010

эхо не изменит выделенное количество байтов (если вы не используете выходные буферы ).

переменная $ i сбрасывается после цикла for, поэтому она также не меняет количество выделенных байтов.

попробуйте использовать пример буферизации вывода:

ob_start();
benchmark::start();
for($i = 0; $i < 10000; $i++)
{
   echo 'test';
}
benchmark::stop();
ob_flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...