«Если хочешь, чтобы что-то было сделано хорошо — сделай это сам» — принцип, в котором я иногда дохожу чуть ли не до абсурда. Но, всё благо, что приносит удовольствие.
Итак, после двух зим упорной разработки мой проект audiophilesoft.com «вышел в люди». История его создания весьма продолжительная: более года назад я анонсировал разработку собственного веб-приложения, причем абсолютно самописного — включая back-end (PHP, MySQL) и front-end (HTML, CSS и самая капля JavaScript).
Итак, начал я тогда с написания простейшего HTML (первый сайт на HTML я создал еще в 2006-м году, с мобильного телефона), но с некоторыми нововведениями: я стал использовать семантическую разметку новоиспеченного HTML5, полностью валидный код, а также вынес все стили в CSS, причем тоже новой, 3-й версии. Дизайн русской версии сайта был скопирован практически полностью, но сравните теперь этот сайт (audiiophilesoft.ru) и новый audiophilesoft.com, так сказать в разрезе:
Результат, как говорится, «на лицо». Скажу честно: код шаблонов uCoz/uWeb — это тихий ужас, и привести его хоть к какому-то стандарту (чтобы валидатор W3C не ругался) просто нет возможности, так как отдельные элементы просто недоступны для редактирования. А чего стоят стили, распиханные где попало — то в HTML, то в CSS... Интересно, что же у них тогда творится в PHP-коде?
Но разметка и стили — это были цветочки. Затем я полез со своим Notepad++ писать PHP-код... Начал прямо как школьник — с процедурного кода в отдельных php файлах, копировать/вставить (нет, чужой код я не использовал, но вот свой дублировать приходилось постоянно) и т. д.
В какой-то момент, параллельно изучая PHP, я дошёл до объектно-ориентированного программирования. Вот тут-то мой мир и перевернулся. Я понял, насколько убог процедурный стиль по сравнению с ООП, и понял, какие проблемы могут меня ждать, если в дальнейшем я захочу что-то подкорректировать или добавить. Так началась долгая история осваивания ООП на PHP. Было много проб, ошибок; код свой я, включая процедурную версию, переписывал наверное раз пять полностью (тот вариант, когда архитектура придумывается прямо на лету). В общем, это был довольно увлекательный процесс, который продлился всё начало прошлого года, и, после полугодового перерыва, продолжился этой зимой.
Интересно отметить один момент: когда моё приложение разрослось (количество классов превысило несколько десятков), я понял, что со своим простеньким редактором Notepad++ я точно далеко не пойду. В памяти приходилось держать огромное количество информации: где что лежит, где какие методы и параметры, а практически каждую букву кода, пробелы и переносы приходилось ставить руками. Причем в итоге я стал тратить 60% времени на поиск и исправление синтаксических ошибок, а еще 30% на отладку и исправление логики.
К счастью в конце концов я решился поставить и освоить замечательный IDE под названием PHPStorm. Благодаря ему я ускорил процесс разработки в несколько раз, избавился от рутинных операций, а отлавливать ошибки стало чрезвычайно просто: синтаксические PHPStorm показывает сразу, runtime отлавливаются дебаггером — в пошаговом режиме выполнения кода. И я уже не говорю об интеграции с системой контроля версий. Иногда мне хотелось чуть ли не расцеловать разработчиков этого IDE — настолько они упростили мне жизнь.
Итак, к чему же я пришёл. Мне удалось остаться верным своим принципам: никакого чужого кода, сторонних компонентов и прочей ерунды «на блюдечке». В конце концов я даже научился ставить и настраивать связку Apache/PHP/MySQL на Windows. Касаемо PHP-приложения: мне удалось воссоздать концепцию модулей аналогичную uWeb (с некоторыми улучшениями, о которых я грезил всё время пользования CMS): на данный момент функционирует модуль страниц, статей, программ (с добавлением материалов через веб-интерфейс), есть простая регистрация, возможность добавлять комментарии для зарегистрированных пользователей. Также реализовано большое количество неочевидных, но крайне полезных для поисковой оптимизации штук: автогенерация sitemap (причем изнутри, без HTTP запросов), отправка заголовков Last-Modified, Not-Modified, разметка RDF — наконец-то мне удалось взять под контроль всё, вплоть до заголовков, отправляемых Apache. Ну и конечно безопасность: при регистрации есть капча, все проверки полей выполняются как в браузере, так и на сервере, возможность SQL инъекций исключена; также я ввёл ограничение на количество неудачных попыток входа и на добавление комментариев. Приложение построено по принципу Model-View-Controller, в View реализована шаблонизация.
Финальным этапом всей этой эпопеи было то, чего я боялся весь последний год: знакомство с Linux. В какой-то момент мой сайт заработал как надо на моём локальном компьютере, но теперь мне предстояло запустить его в сеть. Я сразу отказался от всяческих хостингов: ведь мой проект написан для последних PHP 7, MySQL 5.7.7+, и последние версии компонентов окружения для него критичны. Кроме того, как я уже писал, мне нужен полный контроль над каждым компонентом системы: Apache, MySQL, PHP.
Таким образом я сделал выбор в пользу VPS (виртуального частного сервера). Благодаря человеку с toster.ru я нашёл отличный недорогой хостинг FirstVDS. Интересно заметить, что я приобрёл свой простенький VDS за 270 р/месяц, а за один только CMS uWeb я плачу 300 р (и это еще со скидкой как старожилу, иначе было бы все 600). Повторяться о различиях собственного сервера и ограниченного CMS я не буду.
А дальше — не знаю, что бы я делал без сайтов toster.ru, stackoverflow.com (и, конечно, своего опыта работы с компьютерами). Человеку, который всю жизнь сидел на Windows GUI — и сразу вот так дать SSH консоль CentOS (Linux)... В общем, неделю-другую мне пришлось очень хорошо покопаться, дабы, во-первых, установить необходимые компоненты, настроить их, и, во-вторых, заставить работать сайт в этом окружении. Здесь вам и поиск репозиториев, и слеши (а вы знали, что Linux в путях использует только слеши «/», в то время как Windows — и «/» и «\»?), и проблемы с временной зоной, кодировками и прочие проблемы, о которых не подозреваешь, пока не попытаешься перенести своё приложение с Windows на Linux. Последней проблемой, которую я решил буквально только что, стал запуск почтового сервера (для отправки писем при регистрации пользователей). Теперь чувствую, что претендую не только на роль программиста, но и сисадмина (по совместительству).
Но хорошо всё то, что хорошо кончается. Домен уже перенесен на новый IP, сайт работает — пока в режиме отладки, так что буду благодарен, если потестируете (начиная с регистрации) и сообщите о найденных ошибках.
А вот так сейчас выглядит файл загрузки моего приложения в PHPStorm:
P. S. Теперь, когда закончится отладка, самое время будет заняться заполнением сайта материалами — то есть переводом с русского на английский.
Информация от спонсора
ITVDN: видеокурсы по программированию. В рамках курса PHP Start https://itvdn.com/ru/video/php_start Вы получите базовые теоретические и практические знания языка PHP, которые в дальнейшем позволят Вам развиваться самостоятельно.