-Поиск по дневнику

Поиск сообщений в web_developer

 -Подписка по e-mail

 

 -Постоянные читатели

 -Сообщества

Читатель сообществ (Всего в списке: 1) Темы_дня

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 24.10.2007
Записей:
Комментариев:
Написано: 28


оптимизация php скриптов

Четверг, 25 Октября 2007 г. 00:02 + в цитатник

В этой статье я хочу дать несколько советов, следуя которым можно значительно ускорить обработку 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 большой разницы нет. (На голом тесте for/while/foreach {..} тормоза foreach - 30%). Это не удивительно, т.к. foreach делает копию массива, на что тратиться масса времени. Если нет необходимости в foreach используйте for.

Для чтения файла file() быстрее, чем fopen+цикл - ускорение 40%
Чтобы прочитать в массив $x файл размером 1Мб (100 000 строк по 10 байт) можно воспользоваться двумя вариантами: чтение файла с помощью file(), либо традиционным методом fopen/fgets. Разумеется, для файлов разного объема и содержимого скорость может меняться. Но в данном примере статистика такова: file("1Mb_file.txt") работает на 40% быстрее, чем:

$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 не должен тратить более одной секунды на её генерацию.

Рубрики:  полезные советы
Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку