Разработка сайта Spravka333333.ru — один из тех проектов, в которых 90% сил было брошено на программирование серверной части ресурса. Для бизнес-справочника Дальнего Востока была важна функциональность и удобство поисковой системы. Даже идеально проработанная клиентская часть при неудачно реализованной базе данных или системе поиска, работающей с ошибками, не сделала бы проект успешным.
Программирования серверной части справочного портала
Полнотекстовый поиск — центральная функция портала. Он работает так: пользователь вводит поисковый запрос в специальное поле и получает ответ в виде определённого набора страниц. Однако механизм реализации подобной функциональности намного сложнее, чем может показаться на первый взгляд.
Понимая, что бюджет на разработку не бесконечен, мы решили воспользоваться готовыми поисковыми алгоритмами. Но и это оказалось задачей не самой простой задачей. Решений много, но нужно было найти подходящее по широкой группе параметров.
Критерии выбора поискового механизма
Полнотекстовый поиск — важнейшая задача. Важно, чтобы он работал эффективно. Под полнотекстовым поиском понимается следующее: пользователь вводит поисковую фразу, а сервер выдаёт ответ в виде набора страниц.
В процессе подбора подходящего поискового механизма, мы учитывали следующие параметры:
Мы провели анализ огромного количества систем полнотекстового поиска. Для этого проекта выбрали Sphinx. Он наиболее полно соответствовал нашим запросам.
В чём особенности Sphinx?
На наш взгляд, Sphinx можно отнести к числу быстрейших и мощнейших отрытых движком. Он очень удобен. В базовой конфигурации Sphinx поддерживает прямое взаимодействие с популярными типами БД, продвинутые возможности поиска, ранжирование и стемминг для русских и англоязычных объектов. К тому же поисковый механизм поддерживает русский язык, ведь его автором является наш соотечественник Андрей Аксенов.
Также можем отметить несколько нетривиальных возможностей, которые поддерживает Sphinx. Это и распределённый поиск и кластеризация. Однако одна из ключевых особенностей системы — невероятно высокая скорость поиск и индексации. Она умеет грамотно распараллеливаться и использовать мощности современных серверов. Система Sphinx уже не раз использовалась для создания крайне серьёзных и нагруженных инсталляций, внутри которых содержались терабайты информации. Так что эта систему можно считать отдельным сервером для проектов любой сложности и объёма.
Отлично отлаженная работа с такими популярными базами данных, как MySQL и PostgreSQL позволяет использовать его в окружении, которое стандартно для веб-разработки. К тому же даже в стандартной конфигурации есть API для PHP и других языков. Так что работать можно не применяя сторонних модулей и библиотек.
Однако на обычном хостинге такой поисковик не запустить. Он компилируется и устанавливается только на VDS или собственный сервер. При этом чем больше памяти, тем лучше. Чтобы Sphinx корректно работал с большим количеством добавленных или изменённых документов, мы настроили отдельный дельта-индекс. Учитывая, что индекс у поисковика монолитный, это было весьма нетривиальной задачей. Тем не менее, так как скорость работы Sphinx велика, ничто не мешает настроить перестройку индекса по расписанию. На работе поиска это никак не скажется.
Клиентская часть справочного портала
Клиентская часть проекта реализована на HTML5 c использованием CSS3. Так же используется динамический язык стилей LESS.
Преимущества использования LESS:
Плагины
Для реализации различных функциональных возможностей и анимации были выбраны такие плагины как FancyBox и JScrollPane.
С помощью FancyBox можно одинаково легко выводить в отдельном окошке увеличенную картинку при клике на уменьшенном изображении, организовать галерею слайдов с навигацией и просто вывести попап окошко.
Достоинства:
Выбор плагина JScrollPane обусловлен желание заказчика видеть на своем сайте необычный, красивый скроллбар. JScrollPane - это плагин позволяющий кросс-браузерно стилизовать скроллбар с помощю jQuery и CSS. Этот плагин преобразует стандартные полосы прокрутки браузера (скроллбары) в HTML-структуру, которая может быть легко оформлена с помощю CSS в соответствии с вашим дизайном. JScrollPane очень гибкий плагин, но в тоже время и очень прост в использовании.
Так как в проекте используются самые современные технологии и инструменты обработки информации – возникла проблема реализации определения актуальности браузера пользователя. Дело в том, что старые браузеры не поддерживают некоторые технологии современной web разработки. В результате возникает риск некорректного отображения проекта и неработоспособности функционала в случае использования старого браузера.
Для решения это проблемы мы решили прибегнуть к помощи плагина jReject.
jReject – это специальный плагин для jQuery, определяющий использование неподходящего браузера и дающий возможность отображать подробные уведомления об этом, а так же ссылки для скачивания актуальных версий браузеров.
Плагин позволил гибко настроить список браузеров и выдавать пользователям вот такое уведомление.
Серверная часть
Для организации реализации серверной части проекта был выбран фреймворк Yii2.
Почему мы выбрали именно Yii2:
1. Простота установки
Вся установка осуществляется через Composer , если мы захотим установить дополнительный компонент или модуль, это также можно сделать с помощью Composer. Очень удобно.
2. Использование современных технологий
Yii является полностью объектно-ориентированным фреймворком и использует все преимущества продвинутых PHP функций, такие как: Стандартная библиотека PHP (SPL), Позднее статическое связывание и Анонимные функции. Все классы теперь находятся в одном пространстве имен, полностью совместимых с PSR-4. Это означает, что теперь для того, чтобы получить доступ, например, к HTML-helper классу достаточно указать пространство:
use yii\helpers\Html; Yii также позволяет задавать алиасы (aliases), что упрощает использования пространств имен.
3. Гибкость и расширяемость
Yii framework можно легко настроить под свои нужды. Практически каждый компонент фреймворка является расширяемым. Простым примером является добавление и использование уникального значение идентификатора $bodyId. Для этого, нам нужно создать файл View.php в директории app/components и добавить следующий код:
namespace app\components;
class View extends yii\web\View {
public $bodyId;
public function getBodyIdAttribute() {
return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : '';
}
}
Теперь, чтобы использовать идентификатор, достаточно открыть основной файл макета (app\views\layouts\main.php) и подставить в нужном месте наш метод:
BodyIdAttribute?>>
Для того, чтобы Yii использовал наш расширенный класс View, мы укажем его через файл конфигурации:
return [
// ...
'components' => [
// ...
'view' => [
'class' => 'app\components\View'
]
]
];
4. Тестирование
Yii тесно интегрирован с Codeception. Codeception – это замечательный инструмент для тестирования, который упрощает создание юнит, функциональных и интеграционных тестов при создании приложения. Расширение Codeception упрощает конфигурацию нашего приложения во время тестов, к примеру:
return [
'components' => [
'mail' => [
'useFileTransport' => true,
],
'urlManager' => [
'showScriptName' => true,
],
'db' => [
'dsn' => 'mysql:host=localhost;dbname=mysqldb_test',
],
],
];
При использовании данной конфигурации произойдет следующее:
a) Любые письма отправленные во время тестов, будут записаны в файл и не будут отправляться.
b) URL адреса при тестах будут иметь вид index.php/controller/action , а не /controller/action.
c) При тестировании будет использоваться тестовая база данных, а не production DB.
В Yii существует специальный модуль, который добавляет несколько полезных методов для тестирования, которые помогут в работе с Active Record во время функциональных тестов. Например для того, чтобы увидеть успешно ли создался новый пользователь с именем “TestUser” достаточно сделать следующее:
$I->amOnPage('register');
$I->fillField('username', 'testuser');
$I->fillField('password', 'qwerty');
$I->click('Register');
$I->seeRecord('app\models\User', array('name' => 'testuser'));
5. Безопасность
Безопасность является важнейшей частью любого веб-приложения, и к счастью, в Yii есть большие возможности для облегчения организации защиты.
Yii поставляется с компонентом Security, который предоставляет несколько методов для помощи в создании более безопасного приложения. Некоторые из наиболее полезных методов:
Yii автоматически проверяет валидность CSRF токена на всех небезопасных методах HTTP запроса (PUT, POST, DELETE) и будет генерировать и выводить токен при использовании метода ActiveForm::begin() , чтобы создать свой тег формы. Эта функция может быть отредактирована с помощью конфигурационного файла следующим образом:
return [
'components' => [
'request' => [
'enableCsrfValidation' => false,
]
];
В целях защиты от XSS, Yii предоставляет другой вспомогательный класс под названием HtmlPurifier. Этот класс имеет один статический метод process, и будет фильтровать выходные данные, используя HTML Purifier.
Yii также включает готовые к использованию классы для аутентификации и авторизации пользователей. Авторизация разбивается на два типа: ACF (Фильтры контроля доступа) и RBAC (Контроль доступа на основе ролей).
Самым простым является ACF и его использование реализуется добавлением метода в контроллер:
use yii\filters\AccessControl;
class DefaultController extends Controller {
// ...
public function behaviors() {
return [
// ...
'class' => AccessControl::className(),
'only' => ['create', 'login', 'view'],
'rules' => [
[
'allow' => true,
'actions' => ['login', 'view'],
'roles' => ['?']
],
[
'allow' => true,
'actions' => ['create'],
'roles' => ['@']
]
]
];
}
// ...
}
Этот код говорит DefaultController'у дать доступ гостям к действиям login и view и запрещает действиеcreate. (? является псевдонимом для не авторизированных пользователей, и @ относится к пользователям, прошедшим авторизацию).
RBAC является более мощным способом управления доступом к приложению. Он включает в себя возможность создания ролей пользователей, например, администратор или модератор. Мы можем использовать RBAC, если захотим создать роль модератора, и разрешить всем пользователям группы “модератор”, например, редактировать статью. Гибкая настройка RBAC позволяет сделать приложение более функциональным, например, вы можете разрешить пользователю редактировать свои статьи, но запретить редактировать статьи других пользователей.
6. Сокращаем время на разработку
Практически любой проект связан с тем, что нам приходится повторять одно и тоже по нескольку раз, например написание CRUD для новой сущности. Yii дает нам несколько инструментов, которые помогают нам уменьшить затрачиваемое время на не приоритетные задачи и сконцентрироваться над основной задачей.
Один из таких инструментов называется “Gii”. Gii это веб-инструмент – генератор кода, который позволяет быстро создавать шаблоны кода для:
7. Легко настроить для лучшей производительности
Всем известно, что медленный сайт вызывает недовольство пользователей, во избежании этого Yii предоставляет несколько инструментов, которые помогут нам выжать больше скорости из проекта. Все компоненты кэша Yii расширяются от yii/caching/Cache, который позволяет выбрать в зависимости от требований ту систему кэширования, которую мы хотим. Есть возможность зарегистрировать несколько компонентов кэширования одновременно. Yii в настоящее время поддерживает кэширования БД и файловой системы, а также APC, Memcache, Redis, WinCache, XCache и Zend Data Cache. По умолчанию, если мы используем ActiveRecord, перед запросом Yii делает еще один дополнительный запрос, чтобы узнать схему таблицы(таблиц), участвующих в генерации модели. Мы можем настроить кэширование этой схемы путем редактирования файла конфигурации.
В итоге как и любой хороший фреймворк, Yii позволяет быстро создавать современные веб-приложения, и убедиться, что они работают хорошо. Мы можем легко использовать большинство его характеристик в первозданном виде. И мы будем использовать этот фреймворк для реализации данного проекта.
Что в итоге?
В результате ничто не мешает назвать Yii отличным фреймворком, который помогает в быстром создании современных онлайн-приложений, работающих стабильно и безопасно. Большинство модулей можно использовать в стандартном виде. Разработка портала в нашем агентстве CASTCOM (www.castcom.ru) полностью оправдала ожидания клиентов и позволило реализовать крупный, сложный, но интересный интернет-проект.
Авторы: Константин Мошкин (директор по разработке и маркетингу), Асеева Анастасия (менеджер проекта), Роман Завалишин (ведущий разработчик), Наталья Зайцева (разработчик), Александр Клопотенко (верстка), Сусана Карапетян (дизайнер), Анна Давыдова (дизайнер).
Проведите конкурс среди участников CMS Magazine
Узнайте цены и сроки уже завтра. Это бесплатно и займет ≈5 минут.