memory_get_usage

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

$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), чтобы получить использование памяти в байтах.

Related of "memory_get_usage"

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

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

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

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

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

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

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

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

 $result = null; benchmark::start() for($i = 0; $i < 10000; $i++) { $result.='test'; } 

Смотреть на:

 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.

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

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

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

 ob_start(); benchmark::start(); for($i = 0; $i < 10000; $i++) { echo 'test'; } benchmark::stop(); ob_flush();