оптимизация php скриптов |
В этой статье я хочу дать несколько советов, следуя которым можно значительно ускорить обработку PHP-скриптов, тем самым, разгрузив сервер хостера от бесполезной работы в пользу более полезной. Перед тем как начать рефакторинг - посмотрите сколько времени и памяти кушает ваш проект, а теперь вперед - оптимизируем. После того как нелегкий труд будет закончен замерим результаты - поразительный прирост производительности - процентов 5-6% - удивлены? Давайте немного проанализируем советы приведенные в данной статье:
Выносите $переменные из “текстовых строк” - ускорение 25-40%
$x="test $test";
$x="test"; $x.=$test;
$x="test".$test;
Посчитайте кол-во таких строк в вашем проекте, я думаю их кол-во будет стремиться к нулю, если вы используете какой-нить шаблонизатор (Smarty).
Короткие переменные не более 7 символов - ускорение 15%
Читабельность кода от этого не улучшится, я обычно называю переменную по имени объекта хранящегося в ней, а имена объектов частенько переваливают за десяток символов. Но переменные от 32 символов могут тормознуть программу почти на половину.
Тормозят ли массивы в PHP? Вернее, как именно. Ускорение 40%
Доступ к элементу одномерного ассоциативного массива по имени, не заключенному в кавычки, тормозит процесс на треть (относительно того же примера, но в кавычках). А вот в двухмерном массиве программа работает медленне аж в 2.5 раза! После такого теста хочешь не хочешь, а в любой программе пожертвуешь удобством - обращение к элементам массива по имени без кавычек.
$test["aa"]=1;$test["bb"]=1;$test["cc"]=1;$test["dd"]=1;$test["ee"]=1;
$test[aa]=1; $test[bb]=1; $test[cc]=1; $test[dd]=1; $test[ee]=1;
$test[a][b]=1;$test[x][y]=1;$test[d][c]=1;$test[a][s]=1;$test[b][n]=1;
Выносите многомерные массивы из “текстовых строк” - ускорение 25-30%
При использовании многомерных массивов в строках наблюдается заметное снижение скорости Из-за многомерности нужно заключать переменные в парные фигурные скобки. Да и читабельность повыше будет.
$x="test {$myarray[name][second][1]} test";
Циклы: for, foreach, while, count/sizeof() - ускорение 15%-30%
Бесспорный вывод - использование foreach сильно тормозит дело, а между for и while большой разницы нет. (На голом тесте
Для чтения файла file() быстрее, чем fopen+цикл - ускорение 40%
Чтобы прочитать в массив $x файл размером 1Мб (100 000 строк по 10 байт) можно воспользоваться двумя вариантами: чтение файла с помощью file(), либо традиционным методом fopen/fgets. Разумеется, для файлов разного объема и содержимого скорость может меняться. Но в данном примере статистика такова:
$f=fopen("1Mb_file.txt","r") or die(1);
while($x[]=fgets($f,1000));
fclose($f);
Аналогичный вариант
$f=fopen("1Mb_file.txt","r") or die(1);
while($s=fgets($f,1000)) $x[]=$s;
fclose($f);
работают еще медленнее (во втором случае лишняя функция feof() заметно снижает скорость). Тот же тест, но на 15Мб файле (100 000 строк по 150 байт) показывает разницу в 50%, в пользу file().
Архитектура
Тут есть где разойтись, и начать писать весь проект заново ;) но лучше чуть-чуть напильником пошаманить - зачастую эффект будет поразительным. Для начала - не подключайте сразу все библиотеки используемые в проекте - всё только по требованию. Старайтесь разделить проект на составляющие - шаблоны проектирования еще никто не отменял.
Работа с БД
Очень много времени уходит на работу с БД, как сам факт обращения к ней, так и сама выборка из БД происходит не моментально. И что же делать? Необходимо убирать лишнее, где это возможно, а где нет - стараемся кэшировать. И уберите же обращение к БД в цикле!
Вывод:
1. Потратьте на разработку архитектуры проекта чуть больше, чем пару часиков
2. Уберите лишние обращения к БД (если первый пункт займет у вас несколько дней - то и этот не появится)
3. Используйте кэширование данных получаемых из БД или XML
4. Используйте кэширование готовых HTML страничек
5. Установите какой-нить оптимизатор PHP (XCache или Zend Optimizer)
И еще - где-то упоминалось, что страничка не должна грузиться более двух секунд - значит PHP не должен тратить более одной секунды на её генерацию.
Рубрики: | полезные советы |
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |