1. Подготовка проекта. Блог на PHP
Друзья, я рад приветствовать вас на моем авторском блоге. На этом сайте я делюсь своим опытом в веб-разработке.
Я уверен, что я буду делиться с вами о разных интересных вещах, связанных с PHP, MySQL, JavaScript, а также HTML.
В этом видео-уроке, мы разберем с вами структуру нашего будущего блога. Также мы познакомимся с необходимыми технологиями, которые позволят нам создать свой первый блог на PHP.
Какие темы мы разберем в уроке
- Создадим Git репозиторий на GitHub
- Подготовим проект к разработке
- Установим Bootstrap и разберем, как правильно подключить эту библиотеку
- Разработаем главную страницу блога со статическим списком постов с помощью HTML и Bootstrap
Что нужно установить
Для начала работ по созданию блога на PHP, нам потребуется следующие установки на локальном компьютере:
- PHP 7.4 и выше
- Локальный сервер для работы над сайтом, в данном уроке, мы будем работать с Apache
- Менеджер пакетов Composer
- Удобный редактор для написания кода, рекомендую посмотреть в сторону платного PHPStorm или бессплатной версии редактора Visual Studio Code
- Система контроля версий Git
- Для Mac пользователей, Homebrew для установки PHP и Apache
Скачать код данного урока можно по ссылке.
Макс Пронько — Програміст, CEO компанії Pronko Consulting, розбираємо Веб технології. Автор YouTube каналу Макс Пронько. Телеграм група сайту.
Пишем блог на PHP
Вначале разберемся, что это за тип сайта – блог. Это такой сайт, где размещается текстовая, графическая или видеоинформация. Обязательная особенность – это возможность комментирования всей размещенной информации.
Если вы решили написать блог на PHP, выясним, какие знания будут необходимы. А если вы уже точно знаете для чего вам блог, то можете просто переходить к продвинутому курсу ООП в PHP, в рамках которого вы самостоятельно напишите свой блоговый движок на PHP и будете готовы к трудоустройству в хорошие компании.
Этапы создания блога
- Определяемся с тематикой. Задаем вопросы: кто и зачем будет делать посты, какой материал будет представлен и в каком виде. Набрасываем общий вид страниц сайта.
- Продумываем функциональную часть: какие действия может совершать пользователь, и как должна отреагировать система. Все это лучше записать в виде отдельных блоков.
- Определяемся, где и в каком виде будет храниться информация. Выбираем СУБД. Проектируем структуру базы данных.
- Выбираем, будем ли мы сами писать «движок» или возьмем уже существующий.
Движок блога на PHP
Движок или CMS – это набор некоторых функций, которые нужны для управления сайтом. Можно весь сайт написать с нуля, но можно значительно упростить задачу, если воспользоваться готовыми CMS.
Каждый вид сайта имеет особенности своей структуры. Пользователь привыкает к таким особенностям и, зайдя в интернет-магазин, будет искать фильтр или окно поиска – то, что должно быть присуще именно интернет-магазину. Аналогично и блоги. Здесь должна присутствовать страница с новостями, представленными в хронологическом порядке. Каждую новость можно посмотреть и прокомментировать.
- Привет, мир!
- Развернуть строку
- Чётные числа
- Числа Фибоначчи
Если вы принципиально решили писать блог на PHP самостоятельно, тогда рекомендуется разобраться в паттернах, т.е. шаблонах проектирования, чтобы не «изобретать велосипеды», ведь многие типичные проблемы решены и представлены в готовом виде. Рекомендуется посмотреть MVC и Singleton. Все это изучается в продвинутом курсе PHP.
Если же вы решили использовать CMS, перечислим некоторые из них: Joomla, Drupal, WordPress, Magento, OpenCart, osCommerce и т.п. И хотя большинство из них гибко настраиваемы, для блогов рекомендуются WordPress, vBulletin, phpBB , поэтому их и рассмотрим.
- WordPress – наиболее универсальное и популярное средство, на котором возможно создать практически любой проект. Из преимуществ: множество бесплатных плагинов и шаблонов, понятный интерфейс, огромное количество материалов и уроков.
- vBulletin – данное программное обеспечение ориентировано специально на форумы и блоги. Имеет большой набор плагинов для блогов, много компонентов для СЕО, высокий уровень безопасности. Но данный ресурс платный.
- phpBB – бесплатное и удобное средство для форумов и блогов. Поддерживает множество баз данных, но является уязвимым к взломам.
Скрипт блога на PHP
Но есть еще один способ написать блог на PHP – это использовать скрипты. Скрипт – это некоторый программный код, который выполняет определенные функции. Зачастую, копаться в коде скрипта не нужно, достаточно выполнить инструкцию по установке и ввести требуемые данные. Причем скрипт может стать как основой вашего сайта, так и расширить уже существующий функционал.
- Курс HTML для начинающих
- Курс PHP для начинающих
- Курс MySQL для начинающих
- Курс ООП в PHP
В интернете можно найти массу подходящих скриптов, достаточно указать в поисковике, что вам требуется скрипт блога на PHP. Данные ресурсы в основном предлагают выполнение различных функций, например, быструю публикацию новостей, создание каталогов, записей и страниц. Как правило, название таких скриптов содержит слово blog.
Заключение
Что бы вы ни выбрали, помните, что блоги уже давно придуманы, и не стоит ломать голову над выдумкой чего-то сверхъестественного. Гораздо важнее, если ваш сайт будет быстрым, удобным и внешне привлекательным для пользователя.
PHP Profi
Для тех, кто пропустил: 24 ноября вышла новая мажорная версия Flysystem. Новая версия позволяет порвать с прошлым ради будущего, что я и сделал.
Для создания второй версии Flysystem я начал с чистого листа. Многие основные элементы дизайна библиотеки были почищены и улучшены. API уменьшен, сохраняя при этом свой прежний функционал. Обработка ошибок теперь основана только на исключениях, а листинг директорий теперь используют генераторами. Несмотря на то, что изменений много, эта версия Flysystem верна своим корням. Давайте погрузимся в детали!
Laravel → Конечные автоматы для Eloquent

Laravel Eloquent State Machines — это пакет Андре Сантибаньеса(Andrés Santibáñez), который упрощает переход состояний Eloquent-моделей:
В эти выходные я начал работать над новым пакетом для @laravelphp, реализующий управоение конечными автоматами для моделей Eloquent. Было прикольно и я многому научился в процессе.
Я только что тегнул версию v1.0.0. Наслаждайтесь!
Отзывы приветствуются!
— Андрес Сантибаньес (@asantibanez) 7 декабря 2020 года
Laravel → Создаём REST API с помощью Laravel Orion

Вы заметили, что при создании API вы часто продолжаете писать один и тот же код снова и снова? Вы создаете контроллер для [назовите свою сущность здесь] с методами для составления списка, создания, отображения, обновления и удаления этой [сущности]. Затем вы создаете другой контроллер, и это происходит снова и снова. Затем вам нужно написать некоторые кастомные методы (endpoint’ы) только для поддержки обновления отношения или поля в сводной таблице. Звучит знакомо, не правда ли?
Laravel → При разработке локально используйте queue:listen вместо queue:work

Laravel имеет мощную систему очередей, и когда вы используете очереди, вам нужно запускать обработчики. Как правило, в рабочей среде вы используете команду queue:work для их запуска, но это долгоживущие процессы, которые хранят загруженное состояние приложения в памяти. Таким образом, это означает, что после того, как вы внесете какие-либо изменения в код, вам нужно будет перезапустить их, чтобы они использовали новый код.
Инструменты → Laravel Desktop Notifier

Инструменты → Сравнение производительности Xdebug 2 и Xdebug 3

Xdebug — это расширение PHP, которое помогает в отладке, трассировке, профилировании и предоставляет инструменты для покрытия кода, а также совершенствует PHP с помощью более информативных функций отладки. Xdebug — это де-факто PHP-расширение для пошаговой отладки PHP и продуманный инструмент для разработки на PHP.
Разработанная Derick Rethans (Дерик Ритенс), Xdebug 2 — это текущая стабильная версия. Пре-релиз Xdebug 3 вышел всего несколько дней назад, и в этой статье приводятся улучшения производительности в новой версии.
Инструменты → Как создать корзину с мягким удалением в Laravel 8 и 7
Всем привет! Я хотел бы рассмотреть некоторые концепции удаления в Laravel. Иногда нам может понадобиться спроектировать приложение так, чтобы в случае удаления пользователем данных, они не удалялись бы навсегда и все равно оставались в базе данных, но внешне не отображались. Laravel предоставил нам эту функцию «из коробки» под названием softDelete, поэтому я проиллюстрирую как удалить, просмотреть, восстановить и как навсегда удалить удаленные данные. Я назвал эту концепцию Корзиной (Recycle Bin).
Если вы предпочитаете видео, вы можете посмотреть видео на Youtube.
Инструменты → Оптимизация изображений с помощью GitHub Action
На днях я опробовал GitHub Actions. Это классный инструмент! Кратко: с его помощью можно запускать код за вас, например, запускать ваши процессы сборки, тесты и развертывания. Это просто файлы конфигурации, которые могут запускать все, что вам нужно. Существует целый маркетплейс Action’ов (действий), готовых работать на вас.
Laravel → Жадная загрузка в моделях маршрутов

TLDR: перезапишите метод resolveRouteBinding в вашей Eloquent-модели для жадной загрузки (eager loading) отношений, которые понадобится использовать.
Тестирование → Symfony Panther: PHP-библиотека для тестирования из браузера и парсинга веб-страниц
С самой первой версии Symfony 2, фреймворк предоставлял набор удобных инструментов для создания функциональных тестов. Они используют компоненты BrowserKit и DomCrawler для имитации веб-браузера, которые имеют дружественный API для разработчиков.

Тонкости языка → Оптимизация производительности PHP с помощью полных вызовов функций

Недавно в Твиттере быстро разгорелось небольшое обсуждение. Очевидно, PHP выполняет вызовы функций по-разному в зависимости от использования namespace (пространства имен). При вызове функций в контексте пространства имен в PHP запускаются дополнительные действия, которые приводят к более медленному исполнению. В этой статье я расскажу, что происходит, и как можно ускорить работу приложения.
Composer → Composer 2.0 уже доступен!
1/ Что нового?
Изменений и улучшений много: посмотрите полный список изменений, если вам интересно прочитать все. В этой статье я выделю несколько ключевых моментов.
Улучшения производительности
Мы пересмотрели почти все от протокола, используемого между Composer и packagist.org, до разрешения зависимостей, включая параллельную загрузку файлов с использованием curl и оптимизацию оценки ограничений. Это приводит к значительному улучшению как в скорости, так и в использовании памяти. Разница в производительности зависит от вашего варианта использования, поэтому, хоть я и видел отчеты об улучшениях более чем на 50% в некоторых проектах, назвать точную цифру не могу. Однако я уверен, если вы еще не пробовали Composer 2, то будете приятно удивлены.
В качестве дополнительного примечания к этому, require/remove и частичные обновления теперь намного быстрее, потому что Composer будет загружать только метаданные изменяемых пакетов.

Время первоначального обновления + установки (новый проект, пустой кэш) занимает примерно на 60% меньше времени при использовании Composer 2 с включенным ext-curl
Инструменты → 12 лучших инструментов для ревью кода для разработчиков (2020)
Ревью кода — это часть разработки программного обеспечения, которая подразумевает тестирование исходного кода для идентификации багов на ранней стадии. Процесс код-ревью обычно проводится перед слиянием с кодовой базой.
Эффективное ревью кода предотвращает попадание багов и ошибок в ваш проект путем улучшения качества кода на ранней стадии процесса разработки софта.
В этой статье мы объясним, что такое код-ревью и изучим популярные инструменты, которые помогают организациям с данным процессом.
Symfony → Тестируем маршрутизатор Symfony 4.1
Насколько быстрее новый маршрутизатор Symfony в реальных приложениях?
Мы провели несколько тестов, чтобы выяснить это.

Улучшенный маршрутизатор
Несколько дней назад мы получили фантастические новости, что маршрутизатор в Symfony был значительно улучшен. Конечно, мы хотели увидеть как изменения влияют на наше приложение, поэтому мы решили протестировать его на наших собственных роутах.
Если вы пропустили эту новость, вы можете почитать официальный анонс.
Если вы хотите знать, как новый маршрутизатор работает, почитайте пост Nicolas Grekas, где он более подробно описывает новые изменения.
Наши реалии
- Версия PHP: 7.1.13
- Статические маршруты: 285
- Динамические маршруты: 350
Инструменты → Быстрый Web-парсинг с помощью ReactPHP

Практически каждый PHP-разработчик когда-нибудь парсил данные из интернета. Часто нам нужны какие-то данные, которые доступны только на каком-то сайте, и мы хотим вытащить эти данные и сохранить их где-нибудь. Это похоже на то, что мы открываем браузер, ходим по ссылкам и копируем данные, которые нам нужны. Но то же самое может быть автоматизировано с помощью скрипта. В этом статье, я покажу вам путь, как вы можете увеличить скорость вашего парсера путём отправки запросов асинхронно.
Тонкости языка → Асинхронный PHP: Зачем?
Асинхронное программирование сегодня достаточно востребовано. Особенно в веб-разработке, где скорость реагирования приложения играет огромную роль. Никто не хочет тратить свое время и ожидать подвисшее приложение, пока вы выполняете несколько запросов к базе, отправляете электронное письмо или запускаете другие потенциально длительные задачи. Пользователи хотят получать ответы на свои действия, и они хотят, чтобы эти ответы происходили мгновенно. Когда ваше приложение становится медленным, вы начнете терять своих клиентов. После того как пользователь сталкивается с подвисанием приложения, в большинстве случаев он или она просто закрывает его и никогда не возвращается. Когда интерфейс зависает, с точки зрения пользователя не ясно — то ли ваше приложение поломано, то ли оно выполняет какие-то длительные задачи и на них требуется некоторое время.
Тестирование → Mockery: частичные двойники (mock’и)
Работая со старым кодом, я часто сталкиваюсь с таким классом, который расширяет большой базовый абстрактный класс, а методы этого класса вызывают методы того большого базового абстрактного класса, который делает очень много вещей. Я сам писал такие классы и методы в прошлом. Век живи, век учись.
Одна из самых больших проблем с этим кодом заключается в том, что это довольно трудно тестировать. Методы из базового класса могут возвращать другие объекты, побочно затрагивают другие части кода (или вызывают сервисы), делают http-запросы.
Инструменты → Test Coverage: Интеграция CodeClimate и Travis CI
Когда вы разрабатываете проект с открытым исходным кодом, считается хорошей практикой иметь высокое покрытие тестами, чтобы сообщество могло чувствовать себя в безопасности, используя ваш код в своих проектах. Существуют онлайн-сервисы, которые могут анализировать качество вашего кода и предоставляют отчёты и рекомендации. Одним из самых популярных является Code Climate. Этот сервис не запускает ваши тесты, но вы можете использовать один из инструментов непрерывной интеграции(CI) для их запуска, а затем отправлять его результат в Code Climate. В этой статье будет показано, как использовать Travis CI для запуска тестов и данные о покрытии тестами в CodeClimate.

Laravel → GroupBy по нескольким значениям в Laravel
В Laravel начиная с версии 5.5.29 можно группировать коллекции по нескольким критериям. Давайте посмотрим, что это означает и как это работает.

Подготовка
Итак, эта статья о новой функциональности в фреймворке Laravel. Но прежде чем мы посмотрим как она работает сейчас, давайте посмотрим как она работала раньше. Метод groupBy является методом класса Collection . Для наших примеров я создам немного данных, с которыми мы будем работать. Students будет фабрикой состояний для передаваемого класса User .
// Default user factory which comes with Laravel $factory->define(App\User::class, function (Faker $faker) < return [ 'name' =>$faker->name, 'email' => $faker->unique()->safeEmail, 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), ]; >); // Our new students state $factory->state(App\User::class, 'students', function (Faker $faker) < return [ 'skilllevel' =>collect(['beginner', 'intermediate', 'professional'])->random(), 'teacher' => collect(['Peter', 'Markus', 'Chris'])->random(), ]; >);
Пакеты → Slack. Отправка простого сообщения.
Недавно я писал пост о реинкарнации популярного PHP-пакета для Slack, в котором рассказывалось о форке популярного пакета и возобновлении поддержки оного. Однако, в статье нет ни слова о том как его использовать. Кроме того, на русском языке нет ни слова об использовании этого пакета. Да и об отправке сообщений в Slack в целом практически нет информации. Я решил исправить эту ситуацию и рассказать о том как можно быстро реализовать на PHP простейшую отправку сообщений в Slack.
Отправка Slack-сообщения на PHP
Сначала давайте взглянем в целом на реализацию отправки. Что бы мы могли отправить сообщение из PHP, нам необходимо сделать 3 небольших и простых пункта:
Как вывести блог на отдельной странице WordPress. 2 способа.
Я видел много сайтов на WordPress, у которых на главной странице отображается какая-нибудь статичная страница, а страница блога находится отдельно, например yourwebsite.com/blog .
Как же это реализовать на своём собственной сайте? На самом деле существует два способа — один простой и один не очень, рассмотрим их оба.
Способ 1. Использование index.php в качестве шаблона блога.
Это стандартный способ, предусмотренный в WordPress. Скорее всего на тех сайтах, про которые я говорил в самом начале поста, используется именно он. Рассмотрим пошагово.
Кстати, так как в разных темах содержимое файла index.php разное — оно может быть совсем не предназначено для блога, в таких случаях либо меняем сами свой index.php либо воспользуемся вторым способом, который я описал чуть ниже.
Шаг 1. Создание страницы блога.
Ну, что тут сказать, переходим в Страницы > Добавить новую, указываем какой-нибудь заголовок, например Блог и какой-нибудь URL, например blog, после этого сохраняем. Всё, с шагом 1 покончено.

Шаг 2. Настраиваем отображение страниц в настройках.
Переходим в Параметры > Чтение, настраиваем отображение нужной страницы на главной, а для страницы записей устанавливаем созданную в предыдущем шаге.

Шаг 3. Последний шаг. Добавляем страницу в меню.
Уже после завершения второго шага при переходе по адресу блога (у нас это yourwebsite.com/blog ), у вас будет отображаться страница с записями, использующая шаблон файла index.php .
Тем не менее можно также добавить эту страницу в меню сайта (если поддерживается темой разумеется). Для этого переходим в Внешний вид > Меню, слева в колонке выбираем нашу страницу блога и нажимаем кнопку «Добавить в меню»
Способ 2. Использование собственного шаблона блога. Создание нескольких блогов на одном сайте WordPress.
Этот способ позволяет создавать страницы блога, используя свой собственный шаблон. Этот способ отлично подходит, если вам требуется изменить параметры вывода постов. Можно создавать разные страницы с разными параметрами вывода.
Шагов будет чуть побольше и они будут немного позаковырестей, чем в предыдущем методе. Итак, поехали.
Шаг 1. Создание шаблона страницы
Открываем папку с темой и создаем там файл произвольного названия, например blog-template.php . Внутрь файла вставляем:
/* * Template name: Блог */
Шаг 2. Создаем страницу блога
Этот шаг аналогичен первому шагу из начала поста. Итак, переходим в Страницы > Добавить новую, придумываем название и URL странице, и кроме всего прочего в атрибутах страницы указываем только что созданный нами шаблон.

Шаг 3. Плагин постраничной навигации
Однозначно, что нам понадобится постраничная навигация. Скорее всего у вас уже используется какой-то плагин или функция навигации. Если же навигация не будет работать, рекомендую поставить WP_PageNavi — этот плагин работает отлично, я его протестировал, всё ок.
Шаг 4. Шаблон страницы блога
Это голый шаблон блога, без таких важных функций как get_header(), get_footer() и прочего. Просто в данный момент важно понять саму суть.
/* * Template name: Блог */ $current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // определяем текущую страницу блога $args = array( 'posts_per_page' => get_option('posts_per_page'), // значение по умолчанию берётся из настроек, но вы можете использовать и собственное 'paged' => $current_page // текущая страница ); query_posts( $args ); $wp_query->is_archive = true; $wp_query->is_home = false; while(have_posts()): the_post(); ?> the_title() /* заголовок */ ?>
the_content() /* содержимое поста */ ?>
endwhile; if( function_exists('wp_pagenavi') ) wp_pagenavi(); // функция постраничной навигации
Всё, страница блога создана, вы можете таким образом создать различные страницы блогов с разными параметрами массива $args. Полный список параметров здесь.
Миша
Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.
Пишите, если нужна помощь с сайтом или разработка с нуля.
Комментарии — 47
Сергей 22 Окт 2013
Здравствуйте Миша. Спасибо за статью, очень интересно. У меня сразу 2 вопроса.
1.Если проделать все выше сказанное вами, то придется менять чпу, скажем было:
http://sait.ru/category/какой-то_пост.html
на http://sait.ru/blog/category/какой-то_пост.html , ну чтобы логика не потерялась, соответственно придется делать редирект 301 в .htaccess, или все же не нужно менять структуру?
Мне кажется что нужно поменять структуру ЧПУ.
2. Не знаете как правильно сделать редирект?
Миша 26 Окт 2013
Добрый день!
нет, ЧПУ менять не нужно.
Денис 27 Май 2014
Сергей 21 Июн 2014
Здравствуйте Миша.
Огромное спасибо за блог и понятный и простой стиль изложения. Если Вас когда-нибудь посетят сомнения «нужен ли кому-то этот блог? стоит ли продолжать?» — не сомневайтесь — стоит! У меня такой вопрос: я не работаю с уже кем-то созданной темой, а пытаюсь написать тему сам. При этом есть задача вывести блог (новости) не на главную страницу, а на созданный мною специально для этого шаблон. В этот шаблон подгружается хедер из файла header-page.php (с таким названием я создал файл специально для размещения хедера на внутренних страницах сайта. т.е. это специальный кастомный хедер для внутренних страниц, на главную страницу подгружается хедер из файла со стандартным названием header.php). В этом хедере (header-page.php) подгружается каждый раз название страницы (раздела) сайта с помощью функцией the_title. В данном случае это название — Блог. Когда я прохожу со страницы Блог по ссылке какого-либо поста чтобы почитать его подробней (в развернутом виде) я перехожу на страницу которая использует шаблон single.php. Вопрос как сделать так чтобы в хедере, когда я нахожусь в одном из постов, отображалось не название данного поста, а по прежнему — название страницы сайт — Блог. Для этого мне нужно создать еще один хедер для подгрузки его именно в single.php со статичным названием страницы Блог, прописанным в HTML? я пробовал так, но в таком случае хедер отображается вообще без заголовка.
Как правильно называть файлы дополнительных хедеров? может в этом дело?
И как потом правильно подгружать такие кастомные хедеры в какие-либо из внутренних страниц сайта? Заранее благодарю за ответ и помощь!
Миша 21 Июн 2014
Добрый день! Спасибо 🙂 Относительно названий файлов дополнительных хедеров — всё ок. Итак, если я правильно понял, у нас две страницы — single.php и шаблон.php, в которых выводятся названия страниц при помощи the_title() из одного файла header-page.php. Нужно сделать, чтобы и там и там отображалось название страницы — Блог. Есть пара вариантов: 1) Написать там без функции статично — Блог, (вы пишете, что заголовок пропадает вообще — хм, скорее всего тут уже просто ошибка была в третьем файле хедера). А что вы имеете ввиду под заголовком — то, что находится в
echo get_the_title( 55 );
