С последнего курса по разработке сайтов прошло уже больше полугода, так что настало время запустить еще один.

На этот раз мы познакомимся с работой на чистом PHP, без уютной админки и набора готовых инструментов. Мы напишем свой собственный мини-движок, который будет уметь разбирать запросы от пользователей и выводить страницы сайта. Конечно, мы будет стараться писать его красиво и логично, чтобы наш движок можно было расширять.

Хочу предупредить вас сразу, что я не считаю себя экспертом в программировании. По образованию я врач-эпидемиолог, и программирование в медицинской академии не преподавали. Всё, что я знаю, я освоил сам по книжкам и «методом тыка».

Люди, уже программирующие на PHP, из этих уроков ничего нового не вынесут (ну, может что-то и подсмотрят любопытное, но не факт), так что курс будет интересен исключительно новичкам. Я рассчитываю на то, что вы знаете только базовые функции PHP и умеете писать простейший спагетти-код, то есть PHP вперемешку с HTML и выводом через echo().

Тот мини-движок, который мы напишем, можно будет использовать в реальной работе, но он явно не будет лучшим решением среди всех готовых. Его задача — проиллюстрировать курс, а не написать мега-инструмент для работы.

Первое занятие бесплатное, а дальше будет нужно купить доступ. Всё уже открыто бесплатно.

Хостинг

Первым делом нам нужно определиться с хостингом. Подойдёт абсолютно любой, который умеет выполнять PHP и работает с MySQL. Я буду пользоваться modhost.pro на тарифе «Минимальный». Хоть этот хостинг и рассчитан на MODX, там есть возможность создавать пустые сайты, без движка.

Вы можете выбрать любой удобный для вас хостинг, единственное пожелание — не использовать Windows сервера, чтобы не было неприятных сюрпризов с отсуствием поддержки каких-нибудь модулей.

На веб-сервере мы настраиваем работу ЧПУ. Если это nginx, то нужно задать в нём вот такие правила (на modhost.pro они включены по умолчанию):
location @rewrite {
	rewrite			^/(.*)$ /index.php?q=$1;
}

location / {
	try_files		$uri $uri/ @rewrite;
}
А на Apache2 вот такое:
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Суть их работы в том, чтобы все запросы по несуществующим адресам на сайте отправлять на index.php — там мы их будем ловить и обрабатывать.

На настройке подключения к серверу я останавливаться не буду, вы уже должны это знать. Если же нет, то почитайте вот в этой заметке. Как и раньше, я советую всем использовать для работы IDE PhpStorm.

Пишем index.php

Первым делом нам нужно написать основной файл для приёмки запросов, который принято называть index.php.

По традиции, создаём index.php корне сайта с таким содержимым:
<?php

echo 'Hello World!';
И проверяем, чтобы он открывался на сервере. Лично я открываю сайт s1889.h3.modhost.pro. Если всё ок — продолжаем. Если нет, начинаем задавать вопросы в комментариях.

Мы хотим написать хороший движок, поэтому в index.php сразу добавляем вывод всех ошибок на экран:
ini_set('display_errors', 1);
ini_set('error_reporting', -1);
Index.php должен принимать все запросы, которые будут отправляться на сайт. Вообще все, то есть в деле обработки запросов он самый главный. Именно он определяет, что запросили и что нужно показать в ответ.

Поэтому, он должен анализировать массив $_REQUEST, в котором находятся все данные, присланные пользовательским браузером. Чтобы их увидеть, делаем так:
<?php

echo '<pre>';
print_r($_REQUEST);
Вот этот вот метод с распечаткой массива после вызова тега pre мы будем использовать очень часто, как средство простейшей диагностики.

Вот что должно быть на экране:
Array
(
)
Негусто, да? Ну так мы ничего и не запросили. Давайте откроем укажем в URL параметр ?id=1 и увидим:
Array
(
    [id] => 1
)
Вот и первый запрос на наш сайт. Index.php уже может что-то на него ответить, если захочет. Как видите, данные приходят в пеерменную q, которую мы ранее указали в настройках веб-сервера.

Давайте теперь оформим первисное подобие ЧПУ, которое будем развивать на следующих занятиях:
// Массив доступных страниц
$pages = array('home', 'test');
// Определяем страницу для вывода
$page = '';
// Если запрос не пуст - проверяем, есть ли он в массиве наших страниц
if (!empty($_REQUEST['q'])) {
	$request = explode('/', $_REQUEST['q']);
	// Если есть - окей, всё верно, используем это имя
	if (in_array(strtolower($request[0]), $pages)) {
		$page = strtolower($request[0]);
	}
}
// Иначе используем страницу по умолчанию
if (empty($page)) {
	$page = 'home';
}

echo "Мы выводим страницу <b>{$page}<b>";
Теперь мы можем хапрашивать адреса s1889.h3.modhost.pro/ и s1889.h3.modhost.pro/test/ и видить, что текст меняется.

Мы написали простейший роутер для ЧПУ.

Заключение

На следующем занятии мы начнем осваивать объектно-ориентированное программирование для написания основного класса с ядром системы, а также напишем первый контроллер страницы.

Дальше будет простенький шаблонизатор и вывод первых документов пользователю по запрошенным url.

Все изменения я буду сохранять на GitHub, чтобы давать ссылки на код урока. Например, сегодня мы написали вот это.

Следующая заметка
Основы ООП и контроллеры страниц
Наверх, в раздел
Работа на чистом PHP


Комментарии (10)

  1. Михаил 25 мая 2015, 03:30 # 0
    Поддерживаю!!! Молодец!!!
    1. Wassi Wassinen 25 мая 2015, 17:46 # +1
      Основы — это хорошо.

      Василий, установи OrphoMan, чтобы очепятки присылать удобно было.
      1. Дмитрий Алпатов 05 июля 2015, 08:11 # 0
        Василий, добрый день!
        Хочу взять консультацию по скайпу. Есть еще такая возможность?
        1. Василий Наумкин 05 июля 2015, 08:58 # 0
          Неа
          1. Дмитрий Алпатов 05 июля 2015, 09:01 # 0
            Жаль. Спасибо за сайт и всю ту работу, которая тобой сделана!
            Огромное количество полезных материалов.
            1. Василий Наумкин 05 июля 2015, 10:30 # 0
              Вопросы можно задавать на modx.pro
              1. Александр 17 августа 2015, 15:14 # 0
                а есть какая то единая оплата за курсы ???
                1. Василий Наумкин 17 августа 2015, 15:30 # 0
                  В смысле?

                  Сейчас пока только один курс платный — последний, про чистый PHP. Первые два открыты для всех.
        2. Александр 29 января 2016, 09:37 # 0
          Ничего если я буду задавать глупые вопросы?
          Можно вместо
          $page = '';
          присваивать сразу дефолтное значение
          $page = 'home';
          чтобы не делать проверку в конце? Или это несет с собой какие-то подводные (для меня) камни?
          1. Василий Наумкин 29 января 2016, 10:28 # 0
            Можно!
          Добавление новых комментариев отключено.