Объем памяти и время работы PHP скрипта

Если Вы создаете более менее серьёзный проект на PHP, пишите сложные PHP-скрипты или функции, то всегда приходится учитывать объем доступных ресурсов, таких как объем памяти и пределы времени исполнения, выделенных для работы вашего сайта на сервере. В результате нередко придется заниматься оптимизацией скриптов для достижения наилучшей производительности и уменьшения расходуемой скриптами оперативной памяти.

Объем памяти и время работы PHP скрипта


В этой статье я покажу, как можно оценить объем памяти и время работы PHP скрипта.

Нечто подобное излагалось ранее в статье WordPress — нагрузка блога на сервер хостинга для анализа работы сайтов на движке WordPress. В этом же уроке будет показан один из несложных приемов анализа расхода объема памяти и времени работы PHP скрипта. Это может быть полезно при оптимизации сложных скриптов или конкретных функций, написанных на PHP.

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

В самое начало файла PHP-скрипта добавим пару строчек кода, в которых определим начальное значение объема памяти и засечем стартовое время:

Часть кода N1

   $start_memory_usage = memory_get_usage();
   $start_time = microtime(true);

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

В самом конце файла PHP-скрипта добавим пару строчек кода, в которых определим конечное значение объема памяти и зафиксируем конечное время работы скрипта:

Часть кода N2

   $end_time = microtime(true);
   $end_memory_usage = memory_get_usage();

В этом случае нам уже будут известны объем памяти, который был занят сайтом уже при работе нашего подопытного скрипта и время, когда наш скрипт завершил свою работу.

Теперь нам осталось получить отчет о результате тестирования PHP-скрипта. Я для этого обычно использую простое логирование, то есть записываю результаты в файл. Для этого в самый конец PHP-скрипта добавим еще немного кода, который будет записывать результаты в файл:

Часть кода N3

   // создаем и открываем файл лога для записи 
   $fp = fopen( "test_log.txt", "a" ); 
   fwrite( $fp, "\n\n===\n\n");
   // записываем дату и время в файл лога
   fwrite( $fp, date("d.m.Y H:i:s") ); 
   // записываем путь к скрипту и имя файла скрипта
   $script_file_path = "\n" . __FILE__ . "\n\n"; // вместо «волшебной» константы __FILE__ можно использовать и $_SERVER["SCRIPT_NAME"] в ряде случаев
   fwrite( $fp,  $script_file_path );

   // вычисляем время, затраченное на работу скрипта и записываем в лог
   fwrite( $fp, "Время исполнения:  \t".round(($end_time-$start_time),5)." секунд \n");

   // вычисляем объем памяти, которая была использована во время работы скрипта и записываем в лог
   $total_memory_usage = $end_memory_usage - $start_memory_usage;
   fwrite( $fp, "Расход памяти:  \t" . number_format($total_memory_usage, 0, '.', ',') . " байт\n");

   // получаем пиковый объем памяти, которая была использована во время работы скрипта и записываем в лог
   if(function_exists('memory_get_peak_usage')){
      fwrite( $fp, "Пиковый расход памяти:  \t\t" . number_format($get_memory_peak_usage, 0, '.', ',') . " байт\n");
   }

   fwrite( $fp, "\n===");
   fclose ($fp);

Теперь после каждого запуска нашего подопытного PHP-скрипта вся информация о расходуемой им памяти и время его работы будут записываться в файл лога. И так как мы файл лога создавали и открывали с параметром "a" open( "test_log.txt", "a" ), то новые данные всегда будут записываться в конец файла лога.

Напоследок стоит заметить, что выше описанный метод был показан для случаев, когда в тестируемом файле-скрипте всегда выполняются все команды, то есть когда нет где-то в середине скрипта или функции условий, таких как return; и тому подобных.
Если же в коде тестируемого скрипта встречаются упомянутые инструкции как return;, то будет разумным добавлять Часть кода N2 и Часть кода N3 перед каждой такой инструкцией, и к тому же добавлять комментарий для записи с лог-файл, чтобы знать когда и на каком этапе тестируемый скрипт завершил свою работу.

На этом все. Удачной вам оптимизации PHP-скриптов!

Метки: , , ,
Другие статьи похожей тематики:

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

3 комментария к “Объем памяти и время работы PHP скрипта”

  1. esst:

    Я вот попробовал применить ваш код на своем блоге (он пока на локальном сервере, на Дэнвере), и вот странно, что у меня в лог пишется адрес файла «/index.php» хотя я для эксперимента добавлял код в файл functions.php в моей теме на wordpress.
    Может этот код не подходит для WordPress или я что-то делал не так?

    Ответить
    • esst,
      все правильно, так и должно было быть, ведь вы по всей видимости после добавления кода в файл functions.php обычным способом открывали страницы вашего блога, а скрипты в WordPress начинают работать опираясь на файл index.php, остальные же файлы подключаются по мере их востребованности, например конструкциями включений include, require… Вот и получается, что по сути выполняется код файла index.php, а остальные уже подключаются к его коду по мере надобности, поэтому в лог и записывается путь и имя файла /index.php.
      Приведенный мной метод оптимальнее использовать для отладки скриптов когда вызывается сам тестируемый файл-скрипт именно по прямой ссылке. Например вот так _http://ваш-сайт.ru/test/test.php

      Ответить
      • esst:

        Спасибо, Владимир. Теперь все понятно стало. Я создал новый php файл и вызывал по ссылке именно его, и теперь все в логе записывается правильно.

        Ответить

Оставить комментарий

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

="4remind.ru