Распределение коллективного заработка между членами бригады
Система премирования Тарифная система надбавок и доплат может дополняться премиальной системой. Под премированием...
В этой статье я хочу дать несколько советов, следуя которым можно значительно ускорить обработку PHP-скриптов, тем самым, разгрузив сервер хостера от бесполезной работы в пользу более полезной…
Дело в том, что текст, заключенный в двойные кавычки сканируется процессором на наличие в нем переменных, а также мнемонических подстановок (например, \n для вставки в текст символа новой строки).
print("Это совершенно обычный текст, но PHP-процессор сканирует его на наличие переменных и мнемонических подстановок перед тем, как вывести. При достаточной длине такой строки, этот процесс занимает значительное время.");
Если же текст заключен в одинарные кавычки, то PHP-интерпретатор послушно выводит его в первозданном виде, даже не думая искать в нем что-то. Это отнимает намного меньшее время, чем в предыдущем примере.
print("PHP-процессор сильно обрадуется, увидев строку, заключенную в одинарные кавычки. А как тут не обрадоваться — ведь не нужно делать бесполезную работу!");
Естественно, строки такого вида можно использовать не только в функциях, но и в переменных.
$string="Какое счастье не парсить лишний раз эту строку!";
Очень часто приходиться видеть подобную картину.
print("PHP-процессору пришлось обрабатывать эту страницу $time секунд.");
Усвоя мой предыдущий совет, и зная, что PHP-интерпретатору намного легче "склеивать" строки, чем сканировать их на наличие переменных и заменять их на соответствующие этим переменным строки, нетрудно догадаться, что мой предыдущий пример — пример неэффективного использования ресурсов сервера. А теперь порадуем сервер оптимизированным скриптом.
print("PHP-процессор, радуясь жизни, обработал этот скрипт за ".$time." секунд.");
Для тех, кто в танке: склейка строк производится с помощью точки (.), то есть
print("Адрес этого сайта — http://".$_SERVER["HTTP_HOST"]."/!");
выведет текст «Адрес этого сайта — http://argon.com.ru/!»
Нужно всегда помнить, что любая глобальная переменная храниться в памяти втечение всего времени выполнения скрипта! Как пример издевательства над сервером приведу такой код.
Спрашивается, а нахрена занимать лишнюю память, попусту нагружая сервер?.. Намного эффективней сделать так.
print("PHP-процессору доставляет одно удовольствие выводить такие строки.");
Так что, если какая-то строка используется меньше двух раз, присваивать переменной значение этой строки вредно.
Если в скрипте используются переменные с неоправданно длинными именами, нагрузка на сервер, естественно возрастает.
$windows_xp_edition="Professional";
$windows_xp_build="2600";
$windows_server2003_edition="Standard";
$windows_server2003_build="3200";
Но и слишком лаконичные имена давать тоже не стоит — в будущем при правке скрипта внушительных размеров сто раз вспомнишь мать его создателя, причем не ласковым словом:)
$ifa="Professional";
$ifb="2600";
$ifc="Standard";
Sifd="3200";
Оптимальный же вариант — давать лаконичные, но понятные имена, не превышающие восьми символов.
$wxped="Professional";
$wxpbld="2600";
$ws2k3ed="Standard";
Sws2k3bld="3200";
Очень часто приходиться видеть такое дело.
$string=str_replace("\n"," ",$string);
$string=str_replace("\r"," ",$string);
$string=trim($string);
$string=stripslashes($string);
$string=chop($string);
$string=substr($string,0,1024);
print($string);
$string))))),0,1024));
Согласен, выглядит это ужасающе, зато наблюдается ощутимый прирост производительности! Сделать такую штуку очень просто, если начинать с конца, подставляя каждый раз вместо переменной соответствующее ей значение…
Приведу простой пример скрипта, заменяющего все специальные символы HTML на соответствующие им мнемонические подстановки.
$string=str_replace("<","<",$string);
$string=str_replace(">"",">",$string);
print($string);
Этого же самого можно добиться, если использовать такой код.
print(htmlspecialchars($string));
И выглядит поприятнее, и весит меньше и заметно снижает нагрузку на сервер, особенно при обработке длинных строк.
Еще один пример. С помощью этого скрипта можно прочитать содержимое какого-нибудь текстового файла в массив.
$fp=fopen("database.txt","r");
while($array=fgets($fp,1024));
fclose($fp);
Но PHP имеет жутко полезную встроенную функцию file(), которая выполняет абсолютно то же самое, но намного быстрее!
file("database.txt");
Вывод: никогда не ленитесь лишний раз заглянуть в справочник функций PHP. Уверен, что вы там найдете множество средств, облегчающих вашу (и сервера) жизнь.
Часто необходимо обработать несколько строк по совершенно одинаковому алгоритму. Вот, что делают неопытные программисты…
print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ",$string1
))))),0,1024));
print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ",$string2
))))),0,1024));
А опытные пойдут более простым путем.
function format(&$string){
}
print(format($string1));
print(format($string2));
Таким образом можно выполнять одно и тоже действие несколько раз, минимально нагружая сервер.
К примеру, если довольно опытный программист забудет или вообще не будет знать о существовании встроенной нужной ему функции, он с легкостью способен написать такую сам.
function optimize(&$string){
$string=str_replace("&","&",$string);
$string=str_replace(""",""",$string);
$string=str_replace("<;","<",$string);
$string=str_replace(">"",">",$string);
}
print(optimize($string));
А ведь можно обойтись более простыми средствами.
print(htmlspecialchars($string);
Вот пример неэффективного кода.
print("Мой дядя ");
print("самых честных грабил…");
Но его можно очень просто оптимизировать.
print("Мой дядя "."самых честных правил…");
Чувствуете разницу? Поверьте, хостер в этом случае вам будет только благодарен за освободившиеся ресурсы сервера…
Например, такой скрипт.
print(ereg_replace("нормальный","несчастный",$string));
Включает алгоритм обработки регулярных выражений (POSIX), там, где это совсем не требуется. А сервер нагружается намного сильнее. А ведь можно облегчить его участь, заменив прожорливую функцию на менее жадную к ресурсам.
print(str_replace("несчастный","счастливый",$string));
Известно, что все, содержащееся вне тега PHP-кода, PHP-процессор не обрабатывает, а просто передает в неизменном виде. Некоторые пользуются этим вот так.
…шапка страницы…
print($заголовок);
?>
…навигация…
?>
…подвал страницы…
Но ввод в режим обработки PHP и вывод из него нагружают сервер более, чем если бы использовалось вот это.
print("…шапка страницы…".$заголовок."…навигация…");
include("динамический контент");
print("…подвал страницы…");
?>
Пока что я осветил лишь мизерную часть айсберга оптимизации PHP. Возможно, следование какому-то одному совету не даст ощутимого прироста производительности, но выполнение всех этих элементарных правил вежливости программиста в комплексе заметно снизит нагрузку на сервер и поднимет ваш авторитет.
Если у вас возникли вопросы или предложения, обращайтесь на.
Удачной вам оптимизации!
Типичная проблема:
В какой-то момент сайт начинает открываться и работать слишком медленно. Бывает, что хостинговая компания блокирует сайт за превышение нагрузки или перерасход ресурсов. Что же делать в такой ситуации?
Может быть, сайт стал пользоваться слишком высокой посещаемостью или был установлен какой-то ресурсоёмкий модуль, совершается атака или сайт заражен вирусом. Так или иначе, но у всех этих случаев есть кое-что общее и это проблема всех сайтов на всех хостингах.
И если говорить о серверах для PHP, то такой проблемой является способ исполнения php кода, ровно как и другие значимые настройки окружения на сервере.
Не зависимо от того, есть ли проблема в вашем коде или её нет, высокая у вас посещаемость или нет, от настроек сервера зависит очень многое. Что бы все сказанное не звучало пустыми словами и была написана эта статья.
В этом обзоре я протестирую только что установленный сайт на одном из самых распространённых движков управления контентом Drupal 7.33 .
Для теста выбрана лишь одна составляющая php-хостинга. Мы будем тестировать web-серверы Nginx и Apache2 , модули mod_php и php-fpm , версии php php53 и php56 , посмотрим, как влияют оптимизаторы apc и opcache на скорость работы сайта.
Конечно, эти параметры лишь часть настроек от которых зависит скорость сайта. Но мы умышлено
ограничиваемся этим, что бы не делать обзор бесконечным.
В локальной сети есть сервер zabbix и его задачи каждую минуту:
По архитектуре - это один из самых передовых вариантов. По производительности - наибольшее разочарование.
Производительность оставляет желать лучшего, но нагрузку такой вариант будет выдерживать гораздо лучше чем вариант №2 с Apache2. Так же, такой вариант будет расходовать оперативную память существенно эффективнее.
Cамый типичный для хостингов вариант. 90% популярных хостинг-провайдеров используют этот вариант. Хоть php53 давно не поддерживается разработчиками, но в интернете очень много сайтов, до сих пор работающих на этой версии.
Такой вариант не только очень медленный, но и быстро падает под небольшой нагрузкой из-за нехватки рабочих процессов Apache2, либо из-за нехватки оперативной памяти на сервере.
Этот вариант создан как решение для современных сайтов. Его предлагают хостинги, которые стремятся предоставлять свежую версию PHP. Согласно бытующему мнению, эта версия PHP должна быть более быстрой и безопасной, чем предыдущие.
К сожалению, далеко не все сайты могут работать полноценно c этой версией. Почти каждая новая версия PHP перестает поддерживать некоторые устаревшие и «небезопасные» функции, нарушая работу «старого» кода.
Сам по себе php56 без оптимизатора довольно медленный, а mod_php склонен падать и занимать всю память на сервере под нагрузкой.
Достаточно передовая конфигурация, для тех кто не желает иметь проблемы из-за ошибок с оптимизатором кода. При этом используется «совместимая» версия интерпретатора PHP, а также из связки убирается ресурсоемкий Apache2.
Еще одна распространенная вариация. Очень многие хостинги применяют именно её, при этом либо используют по умолчанию, либо дают возможность включать оптимизатор в своих панелях управления.
Обычно Apache2 оставляют для работы.htaccess-правил, таких как преобразование ссылок и ЧПУ.
Получаем прирост скорости в 3,5 раза, по сравнению с вариантом без использования оптимизатора.
Сам по себе Apache (при использовании его собственного модуля mod_php) расходует для свой работы гораздо больше ресурсов, чем вариант с php-fpm. Apache2 склонен падать, если в одном из его модулей случается сбой или заполнять собой всю оперативную память сервера.
Отличный вариант для сайтов на старых движках, не требующих сложных.htaccess
Именно такой вариант я использую, когда необходимо поднять устаревший сайт, добиться от него удовлетворительной скорости и надежной работы при высоких нагрузках.
Вариант для устаревших сайтов со сложными.htaccess. Например - старые инсталляции Bitrix.
Это идеальный вариант для устаревших сайтов. Данная конфигурация устойчива к высоким нагрузкам, совместима и достаточно производительна.
Отлично подходит, когда нужны правила.htaccess и дополнительные модули Apache2.
Из недостатков - устаревшая и не обновляемая версия php, но если нет выбора - это самый лучший вариант. Отлично подходит для старой версий Bitrix, Joomla и других распространенных CMS не самых свежих версий.
Достаточно производительная, но ресурсоёмкая конфигурация со всеми недостатками mod_php.
Достаточно быстро, но под нагрузкой у сервера может закончится память, а скорость существенно упадет.
Самый производительный вариант.
Это самый лучший вариант для всех современных сайтов. Хорошо держит нагрузку, показывает самый лучший результат с точки зрения производительности. Именно такой вариант я использую, когда стоит задача оптимизировать производительность сайта и увеличить скорость его работы.
Единственный недостаток - это то, что мы не сможем использовать.htaccess и все правила mod_rewrite нужно переписать на синтаксис Nginx.
Также не будут работать модули Apache2. Если таковые используются, то этот вариант не подойдёт.
Самый лучший вариант для сайтов, где нужен.htaccess. Идеально подходит для свежих версий Bitrix.
Хорошо держит нагрузку за счет php-fpm. Активно использую этот вариант для большинства сайтов.
Главная страница тестового сайта | |||
Номер конфигурации | Архитектура | Средний отклик мс. | |
1 | 77,04 | 103,6 | |
2 | 78,79 | 103,98 | |
3 | 78,85 | 102,38 | |
4 | 81,55 | 97,88 | |
5 | Apache2 + mod_php53 + apc | 303,37 | 29,36 |
6. | Nginx + php-fpm53 + apc | 312,33 | 24,73 |
7. | Apache2 + php-fpm53 + apc | 339,63 | 23,32 |
8. | 484,96 | 16,91 | |
9. | Nginx + php-fpm56 + opcache | 546,34 | 14,08 |
10. | Apache2 + php-fpm56+ opcache | 571,14 | 13,78 |
Авторизация в админке тестового сайта | |||
Номер конфигурации | Архитектура | Средняя скорость загрузки кб. | Средний отклик мс. |
1 | Nginx + php-fpm56 без оптимизатора opcache | 67,51 | 239,01 |
2 | Apache2 + mod_php53 без оптимизатора apc | 64,61 | 257,51 |
3 | Apache2 + mod_php56 без оптимизатора opcache | 66,75 | 242,42 |
4 | Nginx + php-fpm53 без оптимизатора apc | 68.79 | 233.15 |
5 | Apache2 + mod_php53 + apc | 173,81 | 94,26 |
6. | Nginx + php-fpm53 + apc | 173,3 | 91,3 |
7. | Apache2 + php-fpm53 + apc | 182,1 | 90,5 |
8. | Apache2 + mod_php56 + opcache | 218,35 | 77,55 |
9. | Nginx + php-fpm56 + opcache | 252,83 | 62,25 |
10. | Apache2 + php-fpm56+ opcache | 262,8 | 60,85 |
Выход из админки тестового сайта | |||
Номер конфигурации | Архитектура | Средняя скорость загрузки кб. | Средний отклик мс. |
1 | Nginx + php-fpm56 без оптимизатора opcache | 41,01 | 184,49 |
2 | Apache2 + mod_php53 без оптимизатора apc | 42,42 | 188,97 |
3 | Apache2 + mod_php56 без оптимизатора opcache | 42,06 | 188,37 |
4 | Nginx + php-fpm53 без оптимизатора apc | 45,48 | 169,15 |
5 | Apache2 + mod_php53 + apc | 190,1 | 41,87 |
6. | Nginx + php-fpm53 + apc | 185,92 | 41,24 |
7. | Apache2 + php-fpm53 + apc | 202,78 | 39,21 |
8. | Apache2 + mod_php56 + opcache | 315,56 | 26,23 |
9. | Nginx + php-fpm56 + opcache | 373,19 | 20,43 |
10. | Apache2 + php-fpm56+ opcache | 381,21 | 20,57 |
И главное - от конфигурации вашего сервера или хостинга, зависит скорость вашего сайта. Подобрав верную архитектуру, вы можете получить пятикратное увеличение скорости работы сайта.
Если у вас возникнут вопросы, трудности или потребуется совет:
Мои контакты в
Всем доброго времени суток.