Изучаем PHP вместе с IBM |
|
Десять ошибок, которые губят web-сайты |
Вы потратили много времени и денег на создание собственного сайта. Вы же не хотите совершать такие ошибки, которые, в лучшем случае, будут раздражать пользователей, а в худшем - приведут к тому, что вы просто потеряете клиентов? В конце концов, если вы настраиваете против себя пользователей, то вы теряете прибыль. А кому это по карману?
Якоб Нильсен, директор Нильсен Норманн Групп, утверждает, что существует десять самых распространенных ошибок:
1 Отсутствие цен. Цена - это часть минимальной информации, необходимой пользователям, чтобы понять суть предложения. Если цены отсутствуют, то посетители могут просто не понять о чем идет речь. Указание цен позволяет отличать один товар от другого.
2 Негибкие поисковики. Чересчур «образованные» поисковики снижают юзибилити, поскольку пользователи могут допустить опечатку или не знать как правильно пишется слово. Поисковики также должны отдавать приоритет не количеству вариантов запросов, а важности каждого документа.
3 Горизонтальное прокручивание. Пользователи ненавидят, когда их заставляют осуществлять прокрутку слева на право. Страницы, которые требуют горизонтального прокручивания в стандартном окне (800*600 пикселей) просто ужасны!
4 Фиксированный размер шрифта. В 95% случаев фиксированный шрифт имеет просто крошечные размеры, снижая удобочитаемость страницы. Пользователи должны иметь возможность самостоятельно изменять размер текста по необходимости.
5 Блоки текста - их скучно читать, что приводит к потере пользователей.
6 JavaScript в ссылках. Если ссылка ведет себя непредсказуемым образом, то пользователи чувствуют себя потерявшимися. Они также ненавидят поп-апы.
7 Нечасто задаваемые вопросы в FAQ. Не указывайте вопросы, которые бы вы хотели, чтобы вам задали.
8 Сбор e-mail адресов при отсутствии политик неразглашения информации. Когда web-сайты просят e-mail, пользователи обычно реагируют отрицательно. В наше время спама никто не хочет вот так просто сообщать такую информацию.
9 URL длиной больше 75 знаков, которые почти невозможно отправить другу. Если URL слишком длинный и весь не виден в строке адреса, то пользователи просто не будут знать, как его скопировать. А если ссылка не работает, то они могут не знать, как вернуться на изначальную страницу.
10 Ссылки «mail to» в неожиданных местах. Не размещайте такие ссылки под именами, вместо этого четко укажите, что это e-mail адрес.
Существует множество компаний, которые могут помочь вам избежать подобных ошибок.
Старайтесь избегать этих 10 ошибок, указанных Нильсеном, при создании своего web-сайта, и пользователям он понравится, что повлияет на уровень посещаемости.
|
Руководство по эффективному использованию CSS |
Браузер работает с CSS следующим образом:
1 ПАРСИНГ HTML-ДОКУМЕНТА И СОЗДАНИЕ ДЕРЕВА ЭЛЕМЕНТОВ;
2 ИДЕНТИФИКАЦИЯ ЦЕЛЕВОГО ТИПА МЕДИА (УСТРОЙСТВА ОТОБРАЖЕНИЯ);
3 ПОЛУЧЕНИЕ ВСЕХ СТИЛЕЙ ДОКУМЕНТА В СООТВЕТСТВИИ С УКАЗАННЫМИ ТИПАМИ МЕДИА;
4 АННОТАЦИЯ КАЖДОГО ЭЛЕМЕНТА ПУТЕМ ПРИСВОЕНИЯ СВОЙСТВАМ ЭЛЕМЕНТОВ ЗНАЧЕНИЙ ИСХОДЯ ИЗ УКАЗАННЫХ ДЛЯ НИХ СТИЛЕЙ, А ТАКЖЕ С УЧЕТОМ НАСЛЕДОВАНИЯ РОДИТЕЛЬСКИХ;
5 ГЕНЕРАЦИЯ СТРУКТУРЫ ФОРМАТИРОВАНИЯ НА ОСНОВЕ ДЕРЕВА ДОКУМЕНТА;
6 ПЕРЕДАЧА ФОРМАТИРОВАННОГО ДОКУМЕНТА НА ВЫВОД (ДИСПЛЕЙ, НА ПЕЧАТЬ И Т.Д.).
Для web-страниц существует три типа подключения стилей, которые разграничивают по источнику:
1 АВТОРСКИЕ СТИЛИ (СОЗДАННЫЕ РАЗРАБОТЧИКАМИ САЙТА), КОТОРЫЕ, В СВОЮ ОЧЕРЕДЬ, МОГУТ ПРИМЕНЯТЬСЯ ТРЕМЯ РАЗЛИЧНЫМИ СПОСОБАМИ:
А) ВНЕШНИЕ ТАБЛИЦЫ СТИЛЕЙ.
РАСПОЛАГАЮТСЯ В ОТДЕЛЬНОМ ФАЙЛЕ *.CSS, НА КОТОРЫЙ ДАЕТСЯ ССЫЛКА В HTML-ДОКУМЕНТЕ. НАПРИМЕР:
<style type="text/css" media="screen">@import url(/styles/screen.css);</style>
В) ВСТРОЕННЫЕ СТИЛИ.
КОД CSS ПОМЕЩАЕТСЯ В ТЕЛЕ HTML-ДОКУМЕНТА: <style type="text/css" media="screen">.style {font-family: Verdana,sans-serif}</style>
С) СТРОЧНЫЕ СТИЛИ, КОТОРЫЕ ПРИМЕНЯЮТ ИНДИВИДУАЛЬНО ДЛЯ КОНКРЕТНОГО ЭЛЕМЕНТА И УКАЗЫВАЮТСЯ В АТРИБУТЕ STYLE НУЖНОГО НАМ ТЕГА:
<p style="font-weight:bold">
2 ПОЛЬЗОВАТЕЛЬСКИЕ СТИЛИ.
НЕКОТОРЫЕ БРАУЗЕРЫ (НАПРИМЕР OPERA) ПОЗВОЛЯЮТ ПОЛЬЗОВАТЕЛЮ СОЗДАВАТЬ СОБСТВЕННЫЕ СТИЛИ, КОТОРЫЕ ХРАНЯТСЯ В ЛОКАЛЬНОМ CSS-ФАЙЛЕ И ИСПОЛЬЗУЮТСЯ ДЛЯ ОПРЕДЕЛЕНИЯ СТИЛЕЙ НА ВСЕХ ПРОСМАТРИВАЕМЫХ СТРАНИЦАХ. ЭТУ ВОЗМОЖНОСТЬ ОБЫЧНО ИСПОЛЬЗУЮТ ЛЮДИ С ПЛОХИМ ЗРЕНИЕМ ИЛИ С ДЕФЕКТАМИ ЦВЕТОВОГО ВОСПРИЯТИЯ.
3 СТИЛЬ БРАУЗЕРА.
«ЗАВОДСКИЕ НАСТРОЙКИ», ПРЕДУСМОТРЕННЫЕ РАЗРАБОТЧИКАМИ ДЛЯ ОПРЕДЕЛЕНИЯ ПРЕДСТАВЛЕНИЯ ЭЛЕМЕНТОВ HTML ПО УМОЛЧАНИЮ.
Пользовательские стили имеют самый высокий приоритет и позволяют переопределять авторские. Исключение составляют стили с параметром !important, который был введен специально для защиты авторских стилей от переопределения на стороне пользователя. Если ни пользователь, ни автор сайта не определили стиль для некого элемента, он будет отображен в соответствии с собственными стилями браузера. В различных браузерах они могут отличаться, поэтому не стоит полагаться на совесть производителя программы-бродилки.
практикаГрядущая спецификация CSS3 вводит свойство «box-sizing», позволяющее выбирать нужную модель, указывая значение «content-box» для использования стандартной модели, и «border-box» — для использования модели IE. Браузер Mozilla, поддерживающий черновые рекомендации CSS3, уже поддерживает это свойство под собственным именем «-moz-box-sizing». Разработчики также ввели еще одно, на данный момент нестандартное значение (и еще одну блочную модель) — «padding-box», которым подразумевается, что ширина блока равна ширине области контента и отступов, исключая границы.
Хороший и правильный (X)HTML-код начинается с правильного указания типа документа (DOCTYPE). Эти сведения необходимы браузеру для выбора режима рендеринга документа. Если тип не декларируется либо при его объявлении допущены ошибки, документ рендерится в особом «режиме несоответствия стандартам» (quirks-mode) и руководствуется при этом не логикой рекомендаций W3C, а собственным разумением. Хотелось бы обратить внимание web-девелоперов на необъяснимый глюк в IE6: верстая в XHTML 1.0 Transitional, нельзя указывать пролог (<?xml version="1.0"?> ), так как он приводит к рендерингу документа в quirks-mode, несмотря на то, что все сделано правильно. К счастью, пролог является необязательным элементом и его можно смело удалить.
Для CSS справедливы «правила хорошего тона», которыми программеры пользуются при написании кода. Аккуратность, выверенная логика, привычка комментировать код и стремление к оптимизации сослужат тебе хорошую службу. Код, подобный приведенному ниже, запросто может быть оптимизирован на 20%-30%, приобретя при этом приятную чистоту и прозрачность. Нужно ли говорить о том, насколько благотворно это отразится на быстроте загрузки файла со стилями?
Было | Стало |
P { color: #336699; border-style : solid; border-width : 1px; border-color : #ff0000; font-weight : bold; line-height : 1.3em; margin-bottom : .7em; margin-left : .4em; margin-right : 1.3em; margin-top : .7em; border-color: #c06565; } |
P { |
Специфика реализации каскадных стилей в различных смотрелках заставляет web-разработчиков искать способы «вправить мозги» программам, имеющим собственный, оригинальный взгляд на вещи. В результате получаем: одинаковое отображение страницы в большинстве браузеров... и невозможность пройти валидацию CSS. Такие хитрости называют хаками либо CSS-фильтрами. Избирательность возможна благодаря глюкам отдельных версий браузеров, что позволяет «скармливать» нужный код конкретной программе, в то время как другие его проигнорируют. Соответственно, о соблюдении стандартов не может быть и речи.
Например:
/* Стандартная блочная модель */
селектор { width: 100px; padding: 10px; border:10px; }
/* Подгоняем внешний вид блока в IE под стандартную модель*/
* html селектор { width: 140px; padding: 10px; border:10px; }
Код, приведенный выше, поможет в борьбе с монстром от Microsoft, но для Opera 5 и Netscape 4 придется подыскать другие способы наставить их на путь истинный. К примеру, для Netscape можно использовать его неприятие конструкции @import, а для Opera — . Если ты готов пожертвовать валидностью своего кода, хаки здорово облегчат тебе жизнь. Нужно лишь помнить о том, что универсальных хаков не существует, — вставая на скользкий путь одурачивания браузеров, нужно припасти лекарства для обширного зоопарка смотрелок. Богатая библиотека CSS-фильтров расположилась по адресу www.dithered.com/css_filters/css_only.
Нельзя обойти вниманием еще один курьез от Microsoft: корпорация сама создала лекарство для лечения болезней собственных браузеров. Речь идет о проприентарных тегах (в терминологии авторов — Conditional Comments), позволяющих «подсунуть» нужные стили для Internet Explorer 5.x
<!--[if IE 5]>
<link rel="stylesheet" type="text/css" href="css/IE5.css" />
<![endif]-->
Более разумной, с точки зрения стандартов, альтернативой хакам и проприентарным тегам может послужить использование Javascript для определения типа браузера. Однако параноидальные пользователи, отключая исполнение скриптов в браузерах, не позволяют использовать данное решение как панацею.
печать
CSS предоставляет нам блестящую возможность больше не заботиться о создании страниц с printer-friendly версиями документов. В первую очередь скроем функциональные блоки, бесполезные в твердой копии страницы, при помощи значения «none» свойства display;. Это большая часть дизайнерских наворотов в шапке и подвале страницы, а также навигация, баннеры и все прочее, что не имеет прямого отношения собственно к контенту. Поскольку принтеры имеют более высокое разрешение, имеет смысл скрыть также и логотип сайта и отдать принтеру другой (можно даже черно-белый) — с более высоким разрешением. Для этого создай блок со вторым логотипом и скрывай его в версии для дисплея. Подобным образом, например, поступила команда Артемия Лебедева — они создали таблицу стилей для печати страниц сайта Студии.
Для печати принято задавать размер кегля шрифта в пунктах (типографская единица измерения), и будет вполне логичным поступить таким же образом и при создании стилей для принтера. В результате пользователи получат буквы оптимального размера, привычные им по распечаткам документов Microsoft Office.
Отдельного упоминания заслуживают фоновые изображения. Поскольку шансы на то, что текст будет читаться так же хорошо, как и на экране, минимальны (большинство пользователей печатают на ч/б), смело отменяем использование картинок на бэкграунде. Также не помешает оптимизация палитры для придания ей максимальной контрастности. Идеал — белый фон и черный текст. Если ты все же решил использовать в стилях для печати не только оттенки серого, не поленись проверить, как будет выглядеть твое буйство красок, если его распечатают на стареньком монохромном лазернике.
На благодарном поприще создания стилей для печати разработчика поджидают несколько подводных камней. Один из них — ошибка в Mozilla (касается всех браузеров, основанных на движке Gecko — Firefox, Netscape, Camino и др.), связанная с печатью блочных элементов, для которых задано свойство float. Баг выражается в том, что независимо от размеров блок распечатывается только на одной странице. Все, что не поместилось на нее, игнорируется. Решение проблемы просто, как советские трусы за рупь двадцать: назначаем свойству float значение «none» и радуемся жизни.
Хотелось бы упомянуть рацпредложение Эрика Майера, выдвинутое в его статье «CSS. Going to Print» на сайте A List Apart. Суть новации такова: при распечатывании документа, содержащего ссылки, естественным образом теряются адреса URL (кто там кликает на листе бумаги?). Пытливый ум нашего буржуйского коллеги нашел выход из данной ситуации — применил в стилях для печати достижения CSS2. Результатом их работы станет появление после текста самой ссылки адреса URL в скобках. Эта красота работает в браузерах Mozilla и Netscape 6.x.
a:link:after, a:visited:after {
content: " (" attr(href) ") ";
font-size: 90%;
}
Кроме принтеров, есть смысл создавать отдельные стили и для наладонников, которые отличаются маленьким экраном с ограниченным разрешением и медленным (и часто дорогим) соединением с интернетом. Как сделать это, читай на сайте Александра Качанова (снимаю шляпу!) www.webmacson.com. Прочие типы устройств вывода, равно как и голосовые браузеры, пока недостаточно распространены... хотя бы для того, чтобы протестировать на них свой сайт. Так что можно не распыляться и сосредоточиться на популярных медиа :). Исключение составляет, пожалуй, телеприставка WebTV, в прошлом популярная в Штатах. Она характеризуется низким разрешением, меньшей четкостью и более узким, чем RGB, цветовым пространством — все это издержки конструктивных особенностей телевизоров, которые используются как приставки в качестве монитора.
|
Обзор форумов |
Метки: форум phpBB phpbb 3 punbb simple machines forum vanilla |
SQL injection |
SQL Injection – внедрение произвольных sql-команд, в результате которого меняется логика оригинального запроса к базе данных. Это представляет серьезную угрозу, так как таким образом злоумышленник может утянуть из нее конфиденциальную информацию. Типичный пример — через ошибки в web-интерфейсе у разных провайдеров не раз крали базы с логинами и паролями пользователей.
Успешность атаки SQL Injection не зависит от используемого для написания web-приложений языка программирования - будь то PHP, Perl или ASР. Если сценарий работает с базами данных, а проверка входных параметров отсутствует, то всегда есть возможность внедрения sql-кода. Это относится не только к web-приложениям, но и к обычным программам, которые работают с базами данныхЧтобы не грызть сухую теорию, давай рассмотрим небольшой пример. Допустим, у тебя на сервере баз данных есть своя база, а в ней - таблица Users, в которой хранится информация обо всех зарегистрированных пользователях. Как правило, такие таблицы имеют минимум три поля: id (идентификатор), UserName (имя пользователя) и Password (пароль). Допустим, для того чтобы посмотреть профиль пользователя, используется следующий запрос к базе данных:
SELECT * FROM UsersWHERE id = переменная
В данном примере видно, что значение поля id будет сравниваться со значением переменной. Если в качестве значения переменной указать, например, 10, то честный пользователь увидит свой профиль. Вроде все хорошо и прекрасно, но что будет, если модифицировать запрос до такого вида:
SELECT * FROM Users WHERE id = переменная OR UserName = “Администратор”
После выполнения такого запроса отобразится запись не только с id = значению переменной, но и запись, в которой значение поля UserName = Администратор. То есть после такого запроса хакер увидит всю информацию об учетной записи «Администратор».
www.site.ru/profile.php?id=10 OR UserName=’Администратор’
На этом примере видно, что после того, как мы дописали к URL дополнительные sql-команды (OR UserName=…), логика запроса изменилась. Отсутствие фильтрации входных параметров - вот причина, из-за которой появилась возможность воспользоваться SQL Injection! Чтобы этого не произошло, необходимо перед выполнением запроса в сценарии кое-что проверить. В данном случае достаточно просмотреть содержимое одной (это при условии, что остальные переменные нигде не видны, но лучше проверять все) переменной id: в ней не должно быть никаких символов, кроме цифр от 0 до 9.
Проблема специальных символов
Знатоки языка запросов SQL знают, что с помощью специальных символов можно полностью изменить логику запроса и обойти многие ограничения, которые изначально придумывал программист.
Одинарные и двойные кавычки
Их используют для выделения значений. Предыдущий пример (UserName = 'Администратор') как раз об этом. Первое, с чего начинает хакер свое исследование, это попытка вставки одинарной кавычки вместе со значением переменной. Если отсутствует фильтрация на спецсимволы, то взломщик увидит ошибку, сгенерированную сервером БД. В результате он уже точно будет знать, что есть возможность внедрить свой sql-код.
Значит, в своем сценарии надо отключить вывод любых ошибок. Лучше в момент возникновения ошибки вывести свой текст, чем текст, который сгенерирует сервер БД.
Двойное тире
Два тире подряд в SQL означают начало комментария. То есть все, что будет после двух знаков тире, не будет восприниматься как часть запроса. Рассмотрим пример:
SELECT * FROM Users WHERE UserName=root AND Password= переменная
Это запрос должен выбрать запись, где поле UserName равно root (как правило, в основном это имя используется для обозначения супер-пользователя), а поле Password равно значению переменной. Имя мы знаем, а пароль, естественно, нет. Но это не повод отчаиваться - можно умудриться модифицировать запрос до такого вида:
SELECT * FROM Users WHERE UserName=root--AND Password = переменная
В результате, код, который стоит после двух знаков тире (AND Password = переменная), не будет выполнен, и, следовательно, мы успешно проходим данную проверку, зная одно лишь имя пользователя.
В SQL есть еще пара символов, которые обозначают комментарий, — «/*». Если вдруг оказывается, что знак тире фильтруется, то можно воспользоваться «/*». Принцип действия тот же самый. Весь текст запроса, который стоит после этих символов, не будет выполняться, а значит, можно отбросить лишние проверки и обойти защиту.
Знак равенства
Казалось бы, чем может грозить простой знак равенства (=)? Но при правильном подходе и отсутствии фильтрации этого символа знак равенства превращается в боевое оружие. Пример:
SELECT * FROM Users WHERE id= переменная
Взломщик может без проблем в качестве значения переменной подставить «1 OR UserName=Aдмин», и запрос легким движением руки превратится в:
SELECT * FROM Users WHERE id = 1 OR UserName=Админ
Результат этого запроса вернет запись, где поле id равно единице или поле UserName равно «Админ». Теперь представь, что было бы, если бы знак равенства всегда отрезался. Запрос уже выглядел бы следующим образом:
SELECT * FROM Users WHERE id = 1 OR UserNameАдмин
Этот запрос неверный, поэтому он не будет выполнен сервером БД, а значит, взломщик останется с носом.
Точка с запятой
Знак «;» тоже относится к специальным символам, он используется для разделения запросов между собой. Любой сервер БД может выполнять несколько действий одним запросом, но для этого каждое действие в запросе должно быть отделено друг от друга точкой с запятой. Как этим можно воспользоваться?
SELECT * FROM Users WHERE id = переменная
Теперь, если представить, что в переменную, с которой сравнивается значение поля id, вписывается такое значение:
1; DELETE FROM Users
Запрос будет выглядеть следующим образом:
SELECT * FROM Users WHERE id = 1; DELETE FROM Users
Сначала сервер выполнит выборку из таблицы Users — запись, в которой значение поля id равно единице. А затем полностью удалит все записи из таблицы Users. Конечно, в реальной ситуации очистить все содержимое таблицы непросто, так как необходимо знать ее имя, а получить имена таблиц бывает непросто... но возможно.
Знак плюса
Знак плюса в SQL сопоставляется со знаком пробела. Допустим, что воспользоваться обычным символом пробела бывает невозможно (фильтруется он, и все тут), в этом случае можно воспользоваться знаком плюса.
SELECT * FROM Users WHERE id = 1+OR+UserName=Администратор
Такой запрос будет абсолютно корректен и успешно выполнится.
Специальные операторы
В языке SQL есть множество операторов, воспользовавшись которыми, можно получить гораздо больше возможностей, чем при использовании простых специальных символов.
INSERT
Этот оператор используется для вставки новых записей в таблицу. Бывает необходимо сделать себе аккаунт (допустим, на каком-нибудь интересном форуме, где просто так не зарегистрируешься). Тогда, найдя возможность внедрения, можно добавить в запрос этот оператор.
SELECT * FROM Users WHERE UserName=root and Password=123; INSERT INTO Users values (“0”, “spider_net”, “qwerty”)
После выполнения такого запроса в таблице UserName добавится новая запись, в которой будут содержаться данные нового пользователя с логином spider_net и паролем qwerty.
LIKE
Оператор LIKE идентичен знаку «=», только используется для сравнения строк. Но многие забывают об одном нюансе, который проще показать на примере:
SELECT * FROM Users WHERE UserName LIKE переманная1 AND Password LIKE переменная2
Если для сравнения используется именно LIKE, то достаточно к значению переменной с паролем добавить символ «%». В результате запрос будет выполнен успешно, и если он используется для авторизации пользователей, то мы без проблем сможем залогинится под любым пользователем.
SELECT * FROM Users WHERE UserName LIKE root AND Password LIKE %
В SQL знак процента используется для сопоставления с любыми символами. Эта ошибка достаточно распространена, особенно в самописных сценариях. Если ты занимаешься исследованием подобного сценария, то первым делом имеет смысл проверять внедрение именно этого знака.
UNION
Оператор UNION служит для объединения запросов. Если удается внедрить этот оператор в запрос, то перед тобой открываются безграничные возможности. Допустим, ты нашел какой-нибудь уязвимый сценарий (например, раздел новостей), но издевательства над новостями тебя не интересует, а хочется всего лишь утянуть всю базу данных с логинами и паролями юзеров. Вот в этом случаем как нельзя кстати пригодится оператор UNION.
SELECT * FROM News WHERE id=1 UNION SELECT Id, UserName, Password FROM Users
После выполнения этого запроса помимо текста новости отобразится информация обо всех учетных записях из таблицы UserName.
OUTFILE
Думешь, что если ты нашел возможность внедрения, то единственное, чем можно управлять на атакуемом сайте, это база данных? Нет, это не так — с помощью SQL можно получить доступ и к файловой системе. Опять же, пример:
SELECT ‘Мой текст’ INTO OUTFILE ‘text.txt’
Если запрос выполнился успешно, то будет создан файл text.txt с единственной фразой «Мой текст». Конечно, если записать простой текст в файл, то выгоды будет мало. Но что если записать в качестве текста свой сценарий, который будет выполнять какую-нибудь системную функцию...
SELECT '<?php system($cmd) ?>' INTO OUTFILE 'cmd.php'
Запрос создаст php-сценарий, который будет выполнять команду из переменной $cmd. Таким же способом можно без проблем дефейснуть сайт, перезаписав файл index (если для этого есть соответствующие права).
КАК ИЩУТ УКРОМНОЕ МЕСТЕЧКО ДЛЯ SQL INJECTION
Первым делом ищут любые сценарии на сайте. Бывает так, что весь сайт выполнен в виде статичного html, а какой-нибудь один раздел (например, новости) является сценарием. Вот в нем и ищут возможность внедрения SQL Injection. Пробуют подставлять свои SQL-команды к значению переменных, которые передаются сценарию.
Если на атакуемом сайте есть поиск, то его тоже проверяют. На многих сайтах сценарии поиска — самописные, значит, всегда есть шанс, что неопытный программист где-то допустил ошибку.
Форум и гостевые книги – отличное место для поиска уязвимостей. Стоит только узнать название и версию форума и, если он известный, можно попробовать найти уже готовый эксплойт в Сети.
Метки: sql injection |
оптимизация 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 не должен тратить более одной секунды на её генерацию.
Метки: php |
Что такое RSS-подписка и как она может помочь? |
Как читать RSS-подписки?
Существует ряд программ, при помощи которых можно просматривать обновления ваших RSS-подписок. Например браузер Opera имеет встроенный функционал для работы с RSS-подписками
Метки: rss |
Обзор бесплатных CMS 2 |
Textpattern
Адрес в сети: http://textpattern.ru
Textpattern – система управления контентом, написанная на PHP и использует базу данных MySQL. Система эффективна как в качестве блогового движка, так и в качестве системы публикации статей и новостей. Textpattern отличается понятным интерфейсом, а также тем, что способна генерировать страницы на чистом HTML.
Textpattern позволяет создать любой сайт, предлагая для этого гибкие и функциональные инструменты: модуль управления статьями с возможностью сортировки по дате и/или по категории, модуль комментариев к статьям, поисковый модуль, наличие RSS/ATOM ленты. Устройство системы администрирования также является одной из привлекательных сторон системы. Эргономичный интерфейс очень прост и понятен и позволяет редактировать материалы и управлять сайтом без каких-либо проблем. В зоне администрирования можно установить общие настройки для всего сайта, распределить пользователей по группам (всего 6 групп с различным уровнем привилегий), посмотреть статистику посещаемости, получить доступ к диагностическим инструментам, инсталлировать плагины.
Plume CMS
Адрес в сети: http://www.plume-cms.net/en
Xoops
Адрес в сети: http://www.e-xoops.com
RunCMS
Адрес в сети: http://www.ruscms.ru/
Zope
Адрес в сети: http://www.zope.org
В отличии всех ранее перечисленных cms, Zope написан на Python. В него включено множество компонентов, некоторые из которых могут быть использованы независимо.Одной из самых притягательных сторон Zope является то, что пользователи, которые не являются программистами могут без проблем инсталлировать и настроить компоненты-приложения, которые интегрируются с платформой. На сайте Zope.org можно найти ссылки на множество (более 300) компонентов. Web-интерфейс Zope позволяет не только управлять содержимым и решать задачи администрирования, разработчик также сможет найти там инструменты для решения своих задач. Выгода такого подхода очевидна: пользователи будут управлять сайтом при помощи банальных инструментов, которые имеют знакомый пользовательский интерфейс.
Метки: обзор cms textpattern plume cms xoops runcms zope cms |
Основные приемы оптимизации html кода |
|
Обзор бесплатных CMS |
Joomla
Адрес в сети: http://joomlaportal.ru
Метки: бесплатные cms e107 joomla drupal typo3 cms |
Дневник web_developer |
|
Страницы: [1] Календарь |