Опубликован: 22.10.2016 | Уровень: для всех | Доступ: платный
Лекция 4:

Серверные технологии

< Лекция 3 || Лекция 4: 1234

Конфигурация. Версия 08

Все настройки хранятся у нас в файлах exe/config.php и exe/dns.php (mysql). Хранить настройки в отдельных файлах удобно: это повышает читаемость (да и прочность) кода. К тому же можно привести массив в config.php к однородному виду (сделать всё в два уровня), и тогда можно будет править параметры через http (то есть прямо на сайте). Практика, однако, показывает, что заказчики сайтов не пользуются такой возможностью – всегда обращаются к разработчику для изменения любых параметров конфигурации. Поэтому мы не будем усложнять нашу маленькую CMS в эту сторону – вся конфигурация будет правиться только в файле.

Почему параметр из предыдущей главы (о почтовых уведомлениях) нельзя хранить в файле config.php? Можно, но не совсем правильно. У нас прослеживается три типа параметров:

  1. для конкретного сайта,
  2. для всей CMS,
  3. для "хоста" – компьютера, на котором работает веб-сервер.

Например, Mysql – совершенно отдельная система, она не входит в CMS (и даже не входит в систему ApachePhp); поэтому мы выделили эти настройки в отдельный файл dns.php. То же и с доступом к командам ОС (convert, например) – мы должны записать в dns.php, есть ли у нашей CMS такая возможность, и разветвлять рабочий код соответственно.

Есть ли на нашем хостинге (сервере) возможность отправлять сообщения через sendmail, тоже не имеет прямого отношения к CMS, и этот параметр мы тоже поместим в dns.php.

***

Интересен вопрос о второй группе параметров – "для всей CMS". У нас почти все параметры именно такие. Более того, 95% всего рабочего кода у нас не относится к конкретному сайту (ведь именно к этому мы и стемились, начиная писать CMS). И пора переходить на следующую ступень – выделить код "ядра" в отдельную папку, стоящую выше конкретных сайтов (и сразу много сайтов смогут использовать общий код этого ядра). Ядро у нас получилось так себе – не ядро, а ядрышко, зёрнышко, всего 60 килобайт. Так и назовём его в соответствии с размером – не "kernel", а "Kern", Kern.sys (расширение – для надёжности, чтоб не путать эту папку с другими "просто папками").

В папку "бибилиотеки" Kern.sys поместим файлы Command.php, common.php, config.php, dns.php, functions.php, а на сайтах, в папках exe, останутся файлы Site.php, users.php, Abadon.php. Строго говоря, для "персональных" параметров сайта надо добавить ещё файл site_config.php, и перекрывать его параметрами значения из общего файла config.php. Но пока в этом нужды нет, а когда (и если) возникнет – сделаем.

Эти изменения требует переезда на следующую версию – 08 http://nichtig.ru/08/. Возникает сразу пара небольших проблем:

  1. у нас 10 М файлов на сайте и мы не хотим их размножать по всем версиям;
  2. вам надо будет как-то получать zip-архив "библиотеки", которая теперь находится не в папке сайта.

Первую проблему решаем, добавив в наш "контекстный коммандер" Abadon.php следующую функцию:

<?php
class Ab {
	static function lfile () {
		$f = SITE . '/files';
		if (!file_exists($f)) symlink(SITE . '/../07/files', $f);
	}
//...

Функция вызывается так: http://nichtig.ru/08/addon.com?lfile (нужен авторизованный пользователь со статусом 2).

Вторую задачу решить сложнее из-за запутанной логики скачивания архивов. Там javascript отправляет на сервер запрос downzip.com с параметром type, который описан прямо в функции Command::downzip(). Мы добавили сейчас параметр "8", который потребует совершенно отдельной обработки – и в коде ниже придётся добавить самый "верхний" if: если параметр равен 8, пакуем рекурсивно папку Kern.sys (функцией work_zip):

<?php
class Command {
//...
	static function downzip () {
//...
		if ($type == $rtypes['lib']) {
			work_zip($Zip, LIB, LIB);
		}
//...

Ну, и последняя деталь. Вы видите в примере константу LIB, которой не было в предыдущей версии. Мы не хотим связывать себя конкретными обязательствами по месту расположения нашего Kern.sys, поэтому создаём (прямо в файле index.php) функцию lib_find, которая будет искать свою "библиотеку" начиная с папки самого сайта (да, можно помещать Kern.sys хоть внутри сайта):

<?php
define('SITE', realpath(dirname(__FILE__)));
//...
define('LIB', lib_find(EXE, 'Kern.sys'));
//...
function lib_find($path, $lib_name) {
	$res = null;
	DIRECTORY_SEPARATOR == '/' || $path = str_replace('\\', '/', $path); 
	$path_arr = explode('/', $path);
	while(array_pop($path_arr)) {
		$test = implode('/', $path_arr) . '/' . $lib_name;
		if (file_exists($test)) {
			$res = $test;
			break;
		}
	}
	return $res;
}

Остаётся пока вопрос, как все эти пути будут работать под Windows. Протестируйте это, если у вас есть Windows. Если возникнут проблемы, пишите комментарии. Впрочем, и так известно, что возникнут. Поэтому заменим сразу строчку определения константы SITE:

<?php
define('SITE', str_replace('\\', '/', realpath(dirname(__FILE__))));

Вот теперь проверяйте (это домашнее задание). Проверять надо так:

  1. скачайте себе на компьютер "ядро" Kern.sys http://nichtig.ru/08/downzip.com?type=8 ;
  2. скачайте файлы самого сайта http://nichtig.ru/08/downzip.com?type=1 ;
  3. распакуйте всё это в нужные папки вашего домашнего веб-сервера;
  4. скачайте sql http://nichtig.ru/08/dump.com и загрузите его в вашу базу данных.

Второе задание: создайте систему редактирования файла Kern.sys/config.php

Инструкции для пользователей

Написать код рабочей CMS и описать её работу – разные задачи. И вторая отнюдь не проще. Начнём с инструкции по установке.

Инструкция по установке CMS "Шутка" (назовём её так):

  1. Скачайте к себе на компьютер архив http://nichtig.ru/08/source/Unsinn_prog&lib.zip .
  2. Распакуйте архив в любую папку своего веб-сервера, доступную по http.
  3. [можно пропустить] Перенесите папку Kern.sys на один-два уровня выше (чтобы она была недоступна по http).
  4. Добавьте в файл exe/users.php пользователя со статусом "2". Это можно сделать, например, с помощью команды консоли в вашем каталоге exe: "./add_user.sh my-name my-password 2" (где вместо my-name и my-password вы должны написать своё имя и пароль). Или допишите элемент массива руками (вычислив md5 для пароля в другой программе).
  5. Отредактируйте файл Kern.sys/dns.php – впишите туда правильные имя пользователя, пароль и БД для подключения к Mysql.
  6. Откройте в браузере http-адрес, по которому находится ваш новый сайт. Нажмите Ctrl + Alt + e для перехода на страницу авторизации (или введите в адресную строку адрес edit.com и перейдите по нему). Авторизуйтесь с именем и паролем пользователя, которого вы создали (со статусом "2").
  7. Нажмите кнопку "Создать таблицы mysql" в списке красных ссылок справа, убедитесь по отчёту, что таблицы созданы.
  8. Наполняйте сайт содержимым: создавайте новые страницы и редактируйте. Добавляйте фото.
  9. Откройте файл exe/Site.php и начинайте создавать шаблоны (php, выводящий mysql-данные в окружении HTML-тэгов в нужных местах страницы) для нового сайта.
  10. Добавляйте в файл site.css правила для отображения HTML-элементов нового сайта.
< Лекция 3 || Лекция 4: 1234
Михаил Гутентог
Михаил Гутентог

Этот курс ( Практикум по разработке CMS ) создавался, когда у PHP была версия 5.3 или 5.4. Со временем какие-то функции PHP устаревают (mysql, each), какие-то начинают работать по-другому (empty). Пожалуйста, следите за изменениями в PHP по сайту php.net!

Александр Мельников
Александр Мельников

Изучаю курс "Практикум по созданию CMS" в листинге 4.3

$n = count($_GET); if ($n > 0) { $param = each($_GET); // самое простое: пропускаем только первый параметр if ($n > 1 || !isset($valid[$param['key']])) { _404(); }

При попытке просмотра в браузере получаю ошибку: Deprecated: The each() function is deprecated.  И не пойму как исправить ситуацию.

Елена Суханова
Елена Суханова
Россия, Москва, МИЭТ, 2011
Анастасия Щитова
Анастасия Щитова
Россия, Москва, ФГБОУ ВО "Московский государственный юридический университет имени О.Е. Кутафина (МГЮА)", 2016