Я делаю небольшой класс тестов для отображения времени загрузки страницы и использования памяти. Время загрузки уже работает, но когда я показываю использование памяти, он не меняется. Пример:
$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), чтобы получить использование памяти в байтах.
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();