Оптимизация РНР: методы.
Не секрет, PHP очень легкий и доступный язык програмирования. Поэтому количество людей именующих себя PHP программистами - огромно. Но если при этом начать изучать код программ или доступные статьи, то становиться понятно что уровень програмирования среди пхпшников довольно слаб. И не редки случаи когда свежекупленный скрипт приводит к падению сервера.
Я не раз говорил об оптимизации отдельных функций или команд в PHP, но настоящая оптимизация, которая необходима при разработке скриптов способных работать при большой нагрузке, начинается с разработки алгоритма работы приложения. Кроме того, есть несколько простых правил позволяющих ускорить как процесс создания (редактирования) кода, так и скорость работы приложений.
- 1. Все переменные,индексы массивов, файлы используемые в скрипте должны быть определены, или скрипт должен проверять их наличие. Сравните два варианта: if(!$_SERVER[’PHP_AUTH_USER’]){exit;} и if(empty($_SERVER[’PHP_AUTH_USER’])){exit;} Какой вариант по вашему будет быстрее? Правильный ответ - второй. Потому что при использовании подобной конструкции в реальном приложении, в случае отсутствия переменной PHP_AUTH_USER РНР генериует предупреждение и расходует на это лишние ресурсы. Теоретически можно предположить что этого можно избежать используя оператор @ или команды error_reporting(0); ini_set(’display_errors’,’0’); однако на практике, несмотря на то что вывод сообщений об ошибках будет подавлен PHP все равно тратит ресурсы на обработку команд.
- 2. Старайтесь свести количество переменных, массивов (и их индексов) а также их значения и время использования к минимуму. РНР в дефолтной конфигурации позволяет использовать до 3мб памяти, но некоторые разработчики считают что этого слишком мало и ставят ini_set("memory_limit","50M"); или что-то в этом роде. Все это не критично если вы будете единственным пользователем. Но если существует вероятность что к вашему скрипту будут одновременно обращаться несколько пользователей, то следует задуматься о том, что количество свободной памяти непостоянно. И для приложений которые будут работать на большом трафике количество используемой памяти должно быть сведено к минимуму, в противном случае вы рискуете снизить быстродействие всей системы из за неправильного распределения ресурсов. Все это достаточно очевидно, но давайте возьмем пример:
/* some code */
$tabname=array(1,2,3,4,5,6,7,8,9);
$a=file(’log’); //допустим что тут файл из 1000 строк, по 10000байт каждая.
echo ’<table><tr>’;
foreach($tabname as $x)
{ echo "<td>$x</td>";
} echo ’</tr>’,$a[10],’</table>;
/* some code */
На первый взгляд данный код достаточно логичен. Однако в реальности может возникнуть следующая ситуация: output_buffering в дефолтной установке PHP выключен, а это значит что результаты работы скрипта сразу (или, в зависимости от настроек, по мере накопления минимальной длины) отправляются пользователю.
В случае если между сервером и пользователем маленькая скорость передачи данных РНР будет держать данные (приостановит выполнение) до момента окончания передачи кода. Таким образом если в теории ваш скрипт отрабатывает (и соответственно освободает память) за доли секунды, то на практике PHP будет использовать ресурсы до окончания передачи данных.
Чтобы этого избежать следует использовать ob_start() или определять переменные в последний момент и освобождать после использования. Таким образом вышеуказанный код можно переписать следующим образом:.
/* some code */
$tabname=array(1,2,3,4,5,6,7,8,9);
ob_start();
echo ’<table><tr>’;
foreach($tabname as $x)
{ echo "<td>$x</td>";
}
$a=file(’log’);
echo ’</tr>’,$a[10],’</table>;
unset($a);
ob_end_flush();
/* some code */
Однако также стоит заметить что не стоит зацикливаться на подобных моментах если вы работаете с переменными которые занимают небольшое количество памяти. В зависимости от структуры скрипта - необходимо использовать разные методы его оптимизации.
з.ы. Продолжение следует.
4 comments for “Оптимизация РНР: методы.”
На самом деле, при грамотном подходе это катит везде, просто под словом статика следует понимать не только HTML страницы, но и отдельные части страниц для получения которых требуется большое количество ресурсов.
Даже новостные сайты и крупные форумы обновляются далеко не каждую секунду, а если при этом количество пользователей между обновлениями дает нагрузку большую, чем модуль для генерации статики, - то следует подумать о кешировании и статике. Исключение - системы где каждыйответназапросотуникального пользователя должен быть польностью персонализирован и обработан индивидуально.
Но и тут можно использовать этот метод для отдачи статики неавторизованным пользователям (или к примеру поисковым ботам).
//bog