Если Вы создаете более менее серьёзный проект на 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-скриптов!
Метки: PHP, время, память, скрипт
Я вот попробовал применить ваш код на своем блоге (он пока на локальном сервере, на Дэнвере), и вот странно, что у меня в лог пишется адрес файла «/index.php» хотя я для эксперимента добавлял код в файл functions.php в моей теме на wordpress.
Может этот код не подходит для WordPress или я что-то делал не так?
esst,
все правильно, так и должно было быть, ведь вы по всей видимости после добавления кода в файл functions.php обычным способом открывали страницы вашего блога, а скрипты в WordPress начинают работать опираясь на файл index.php, остальные же файлы подключаются по мере их востребованности, например конструкциями включений include, require… Вот и получается, что по сути выполняется код файла index.php, а остальные уже подключаются к его коду по мере надобности, поэтому в лог и записывается путь и имя файла /index.php.
Приведенный мной метод оптимальнее использовать для отладки скриптов когда вызывается сам тестируемый файл-скрипт именно по прямой ссылке. Например вот так _http://ваш-сайт.ru/test/test.php
Спасибо, Владимир. Теперь все понятно стало. Я создал новый php файл и вызывал по ссылке именно его, и теперь все в логе записывается правильно.