====== 8.5. Файл server_check.php ====== ===== Введение ===== Файл server_check.php - исполнительный файл, который будет проверять наш веб-сервер, а именно: * Версия PHP, * Версия Apache http server, * Наличие установленной версии системы управления базами данных MySQL, * Модули и библиотеки PHP * Права на чтение/запись в папки и файлы * Отсутствие файла конфигурации Так-же этот файл будет иметь функцию вывода информации (отображение данных файла **module_help.php**) о необходимых модулях и логику поведения приложения при разных действиях пользователя. ==== Подготовка ==== Создадим в директории **/test** вложенную директорию **img** для хранения и вывода иконок. В ней мы сохраним файлы иконок OK, ERROR и Refresh нашего установщика: {{:software:development:demo:cms:ucms:good_green_ucms_creat_5.png?|загрузить иконку OK}} , {{:software:development:demo:cms:ucms:close_red_ucms_creat_5.png?|загрузить иконку ERROR}} , {{:software:development:demo:cms:ucms:refresh_blue_ucms_creat_5.png?|загрузить иконку Refresh}}. Основная часть файла это перечисление, оформленное в таблице - структурированного набора данных, состоящего из строк и столбцов, внутри которой помещен заголовок и код запросов PHP.
Наименование модуля
* **%%%%** - основной тег HTML, определяющий начало таблицы. * **%%%%** - основной тег HTML, определяющий начало строки таблицы. * **%%%%** - основной тег HTML, определяющий конец ячейки таблицы. * **%%%%** - основной тег HTML, определяющий конец строки таблицы. * **%%
%%** - основной тег HTML, определяющий начало ячейки таблицы. * **%%%%** - закрывающий тег PHP. * **%%
%%** - основной закрывающий тег HTML, определяющий конец таблицы. '; ?> * **%%%%** - начало строкового контейнера. * **%%%%** - начало жирного выделения текста. * **%%%%** - конструкция в PHP для вывода объектов. * **%%$_SERVER[]%%** - встроенный массив, содержащий информацию о сервере, окружении и текущем запросе пользователя. * **%%'SERVER_SOFTWARE'%%** - строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос. * **%%%%** - закрывающий тег PHP. * **%%%%** - конец жирного выделения текста. * **%%%%** - конец строкового контейнера. :&11: **Пимечание:** \\ Код приведенный ниже, является основным строковым контейнером для фразового контента, что по своей сути, является всего лишь оберткой, к классу **table_block_install** позже будут подключенны стили ранее созданного (пока пустого) файла [[software:development:demo:cms:ucms:creating_file_install_css|install.css]] в директории **css**. **"Наименование модуля"** логично расположить в ячейке по левому краю формы, а контейнер **"кода запросов PHP"** отодвинуть, задав растояние, по правому. Это мы позже и пропишем в файле **install.css**. ==== Запросы ==== Ниже приведен основной перечень выводов запросов к серверу, который нами будет использоваться для отображения информации в таблице echo PHP_OS; echo $_SERVER['SERVER_SOFTWARE']; echo PHP_VERSION; print_r(get_loaded_extensions()); echo phpversion('curl'); echo substr(sprintf('%o', fileperms('/tmp')), -4); * **%%PHP_OS%%** - константа вывода только названия операционной системы. * **%%SERVER_SOFTWARE%%** - идентификатор сервера. * **%%PHP_VERSION%%** - информация о версии PHP. * **%%(get_loaded_extensions())%%** - возвращение массива имён скомпилированных и загруженных модулей. * **%%phpversion('curl')%%** - возвращает версию загруженного модуля, в примере: curl * **%%fileperms%%** — возвращает информацию о правах на файл ==== Блок логики версии PHP ==== Нами будет использоваться при написании приложения версия **PHP** не ниже **8.2** Логический операторы условия **ЕСЛИ** (**if**) и **ИНАЧЕ** (**else**) расмотрены в предыдущей главе [[software:development:demo:cms:ucms:creating_file_server_check|8.5. Файл server_check.php]]. В коде, приведенном ниже мы добавим тип данных с двумя возможными значениями: **true (истина)** и **false (ложь)**. = 0) { echo 'Версия PHP: ' . PHP_VERSION . 'good_green'; /* Иначе выводим просьбу обновить PHP*/ } else { echo 'Обновите версию PHP ' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?> * **%%version_compare()%%** - сравнивает две "PHP-стандартизованные" строки с номерами версий. Мы проверяем, что **ЕСЛИ** установленная **версия PHP** не ниже версии **8.2.0**, тогда выводим сообщение: Версия PHP: номер установленной версии и иконку **OK** из директории **/img** c заданным размером 18x18, **ИНАЧЕ** выводим сообщение об ошибке: Обновите версию PHP, иконку **ERROR** из директории **/img** c заданным размером и переменной **%%$install_error%%** присваиваем значение **true (истина)**. ==== Блок логики проверки модулей PHP ==== Мы рассмотрим принцип работы кода только для одного модуля **cURL**, остальные будет прописанны по этому шаблону. '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('curl'); echo 'good_green'; } ?> * **%%$extensions = get_loaded_extensions();%%** - присвоим переменной **%%$extensions%%** значение возвращения массива имён загруженных модулей. * **%%in_array('curl', $extensions)%%** - функция выполняет поиск значения **curl** в массиве, заданном переменной **%%$extensions%%** * **!** перед **%%in_array()%%** - означает отрицание, т.е, что не в массиве Проверяем: **ЕСЛИ** curl **не в массиве** заданном переменной **%%$extensions%%**, тогда выводим сообщение: Включите cURL Module:, отображается иконка **ERROR** из директории **/img** c заданным размером и переменной **%%$install_error%%** присваиваем значение **true (истина)**, **ИНАЧЕ** выводим сообщение: Установлено:, номер версии **curl** и иконку **OK**. ==== Блок логики проверки прав доступа ==== В этом блоке нам необходимо проверить, что директория, в которую приложение будет записывать данные, доступна для записи. К основным относятся: * **0600** - Доступ на запись и чтение для владельца, нет доступа для других * **0644** - Доступ на запись и чтение для владельца, доступ на чтение для других * **0750** - Полный доступ для владельца, доступ на чтение и выполнение для группы владельца * **0755** - Полный доступ для владельца, доступ на чтение и выполнение для других * **0777** - Полный доступ для всех :&11: **Пимечание:** \\ Права доступа для проверки кода можно изменить командой chmod("./includes/demo/", 0644); Рассмотрим блок проверки прав доступа '; } else { echo '/demo недоступна для записи' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?> * **%%$dir_includes%%** - переменная, которой присвоим значение: отображение прав доступа в виде восьмеричного числа * **%%substr()%%** - функция, которая вырезает и возвращает подстроку из строки * **%%sprintf()%%** - функция, которая возвращает отформатированную строку * **%%fileperms()%%** - возвращает информацию о правах доступа на файл Проверка: **ЕСЛИ** переменная **%%$dir_includes%%** ровняется **0775**, тогда выводим сообщение: /demo доступна для записи и отобразим иконку **OK**. **ИНАЧЕ** выводим сообщение: /demo недоступна для записи, отображаем иконку **ERROR** и переменной **%%$install_error%%** присваиваем значение **true (истина)**. ==== Блок логики переменной $install_error ==== Данный блок необходим для вывода справочной информации по необходимым приложению модулям и расширениям, отображения сообщения:Невозможно продолжить. Исправьте ошибки и Обновите страницу, а так-же в случае успеха отобразить кнопку "Продолжить". :&11: **Пимечание:** \\ В блоках кода проверки выше, мы в случае ошибки присваивали переменной **%%$install_error%%** значение **true** $install_error = true; странице требований'; echo '

Невозможно продолжить. Исправьте ошибки и ' . ' Обновите страницу' . '

' . '
'; } else { /* Если значение переменной $install_error значение не равно true */ /* тогда выведим кнопку Продолжить */ echo '
'; } ?>
Проверка: **ЕСЛИ** переменной **%%$install_error%%** присвоено значение **true**, тогда выводим сообщение: Более подробную информацию о необходимых модулях можно найти на, ссылка на страницу требований. **ИНАЧЕ** выводим блок кнопки "Продолжить" с активацией страницы конфигурации приложения. ===== Файл test_4.php ===== В директорию добавим тестовый файл **test_4.php** и записываем в него разобранный в этой главе код вывода запросов
Server OS:
Web server: '; ?>
PHP ver. > 8.2 = 0) { echo 'Версия PHP: ' . PHP_VERSION . 'good_green'; /* Иначе выводим просьбу обновить PHP*/ } else { echo 'Обновите версию PHP ' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?>
cURL Module: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('curl'); echo 'good_green'; } ?>
Folder Permissions: '; } else { echo "$dir_includes" . ' - /demo недоступна для записи' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?>
странице требований'; echo '

Невозможно продолжить. Исправьте ошибки и ' . ' Обновите страницу' . '

' . '
'; } else { /* Если значение переменной $install_error значение не равно true */ /* тогда выведим кнопку Продолжить */ echo '
'; } ?>
Веведим в веб-браузере наш файл: {{:software:development:demo:cms:ucms:ucms_creat_29.png?|}} Как мы можем видеть, версия PHP у нашего сервера установлена ниже требуемой и часть модулей отключена (не установлена). При этом для тестовой директории demo установены права - **0644**, что означает доступ на запись и чтение для владельца, доступ на чтение для других **curl** для проверки выключен для наглядности примера {{:software:development:demo:cms:ucms:ucms_creat_17.png?|}} Если **curl** был включен, то система выдала бы "Установлено:,версию и иконку OK" {{:software:development:demo:cms:ucms:ucms_creat_31.png?|}} ===== Файл server_check.php ===== Откроем в блокноте созданный ранее в директории /ucms/library/install/ файл server_check.php и запишем в него код из файла test_4.php, предварительно, убрав лишнее, а именно: * комментарий Добавим в начало файла следующий код PHP: * **%%include "tpl/tpl_install_header.php";%%** подключаем файл заголовка нашего окна :&11: **Пимечание:** \\ Файл **%%tpl_install_header.php%%** в директории **/tpl** будет создан позднее в главе [[software:development:demo:cms:ucms:creating_file_install_css|8.7. Файл install.css]] и сейчас подключается, чтобы в будущем не возвращаться к этой главе. * **%%include "../../includes/cons.php";%%** подключем файл с константами **cons.php** из директории **includes** * **%%$file_config = FOLDER . '/includes/config.php';%%** задаем переменной **%%$file_config%%** в значение файл **config.php** в директории **includes** * **%%header('Refresh: 5; URL = database_options.php');%%** с задержкой 5 сек перенаправляем пользователя на страницу выбора установки конфигурации **database_options.php** Проверка: **ЕСЛИ** файл **%%$file_config%%** тогда вызов header, с задержкой 5 сек перенаправит на страницу ./ucms/library/install/database_options.php с выводим сообщений: Обнаружена установленная версия приложения!\\ Можно установить дополненительную конфигурацию приложения! **ИНАЧЕ** будет выведена таблица проверки сервера. Далее для необходимых нам модулей по шаблону кода из файла test_4.php, прописываем логику проверки в талице, заменив путь к проверяемой директории с **/demo** на **../../includes**. Модули для проверки могут отличаться, в зависимости от цели создаваемого приложения, в нашем случае это: * **Bzip2 Function** - используются для прозрачного чтения и записи сжатых файлов bzip2 (.bz2). * **cURL Module** - позволяет подключаться и взаимодействовать со многими различными типами серверов с помощью многих различных типов протоколов (http, https, ftp, gopher, telnet, dict, file и ldap). * **GD Library** - позволяет использовать функции изображений, включая создание и обработку файлов изображений в различных форматах, включая GIF , PNG , JPEG , WBMP и XPM. * **DOM Extension** - позволяет выполнять операции с документами XML и HTML через API DOM с PHP. * **LDAP Protocol** - облегченный протокол доступа к каталогам, который используется для доступа к «серверам каталогов». * **MySQLi Extension** - позволяет получить доступ к функциональным возможностям MySQL 4.1 и выше. * **OpenSSL Extension** - используются для симметричного и асимметричного шифрования и дешифрования, PBKDF2, PKCS7, PKCS12, X509 и других криптоопераций. * **PDO Extension** - определяет легкий, последовательный интерфейс для доступа к базам данных в PHP. * **PDO_SQLITE Driver** - драйвер, реализующий интерфейс PHP Data Objects (PDO) для обеспечения доступа к базам данных SQLite 3. * **SimpleXML Extension** - предоставляет очень простой и удобный набор инструментов для преобразования XML в объект, который можно обрабатывать с помощью обычных селекторов свойств и итераторов массивов. * **SQLite3 Module** - поддержка баз данных SQLite версии 3. * **Zip Extension** - позволяет прозрачно читать или записывать сжатые ZIP-архивы и файлы внутри них. * **Zlib Module** - позволяет прозрачно читать и записывать сжатые gzip (.gz) файлы с помощью версий большинства функций файловой системы , которые работают с файлами, сжатыми gzip В конец нашего файла добавим следующий код "Прогресс-бара", чтобы пользователь знач, где он в данный момент находиться. :&11: **Пимечание:** \\ Код приведенный выше, это всего лишь обертка блока "Погресс-бара", который будет написан на чистом css и пока соответственно мы его не видим. Позже будут подключенны стили ранее созданного (пока пустого) файла [[software:development:demo:cms:ucms:creating_file_install_css|install.css]] в директории **css** и "Погресс-бар" отобразиться. И в заключение добавим "подвал" нашего окна * **%%include "tpl/tpl_install_footer.php";%%** подключаем файл "подвала" нашего окна :&11: **Пимечание:** \\ Файл **%%tpl_install_footer.php%%** в директории **/tpl** будет создан позднее в главе [[software:development:demo:cms:ucms:creating_file_install_css|8.7. Файл install.css]] и сейчас подключается, чтобы в будущем не возвращаться к этой главе. Оформив правки и собрав воедино все описанное в данной главе записываем в файл **server_check.php** готовый код
Server OS:
Web server: '; ?>
PHP ver. > 8.2 = 0) { echo 'Версия PHP: ' . PHP_VERSION . 'good_green'; /* Иначе выводим просьбу обновить PHP*/ } else { echo 'Обновите версию PHP ' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?>
cURL Module: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('curl'); echo 'good_green'; } ?>
GD Library: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('gd'); echo 'good_green'; } ?>
SQLite3 Module: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('sqlite3'); echo 'good_green'; } ?>
Zip Extension '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('zip'); echo 'good_green'; } ?>
PDO Extension '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('PDO'); echo 'good_green'; } ?>
SimpleXML Extension: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('SimpleXML'); echo 'good_green'; } ?>
Bzip2 Function: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('bz2'); echo 'good_green'; } ?>
Zlib Module: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('zlib'); echo 'good_green'; } ?>
MySQLi Extension: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('mysqli'); echo 'good_green'; } ?>
PDO_SQLITE Driver: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('pdo_sqlite'); echo 'good_green'; } ?>
LDAP Protocol: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('ldap'); echo 'good_green'; } ?>
OpenSSL Extension: '; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } else { echo 'Установлено: ' . phpversion('openssl'); echo 'good_green'; } ?>
Folder Permissions: '; } else { echo '/includes недоступна для записи' . 'close_red'; /* Присвоим переменной $install_error значение true */ /* т.е. ошибка установки - истина */ $install_error = true; } ?>
странице требований'; echo '

Невозможно продолжить. Исправьте ошибки и ' . ' Обновите страницу' . '

' . '
'; } else { /* Если значение переменной $install_error значение не равно true */ /* тогда выведим кнопку Продолжить */ echo '
'; } ?>
Создадим в директории /ucms/library/install новый каталог для картинок и назовем его, к примеру - img, в нем мы будем хранить файлы иконок нашего установщика. Поместим в директорию /img файлы иконок OK, ERROR и Refresh. * {{:software:development:demo:cms:ucms:good_green_ucms_creat_5.png?|}} * {{:software:development:demo:cms:ucms:close_red_ucms_creat_5.png?|}} * {{:software:development:demo:cms:ucms:refresh_blue_ucms_creat_5.png?|}} Переместим файл **config.php** в директорию **demo**. И откроем файл **server_check.php** в браузере {{:software:development:demo:cms:ucms:ucms_creat_32.png?|}} При нажатии на ссылку "Обновите страницу" у нас обновиться страница в этом же окне, а при нажатии на ссылку "странице требований" откроется страница файла module_help.php в новом окне (за это отвечает **%%target="_blank"%%**), которая будет создана нами в следующей главе [[software:development:demo:cms:ucms:creating_file_module_help|8.6. Файл module_help.php]] {{:software:development:demo:cms:ucms:ucms_creat_33.png?|}} Обновим PHP до версии => 8.2 на нашем сервере и установим (включим) недостоющие модули и библиотеки, и нажмем ссылку "Обновите страницу" {{:software:development:demo:cms:ucms:ucms_creat_34.png?|}} Переместим назад файл **config.php** из директории **demo**. И откроем файл **server_check.php** в браузере {{:software:development:demo:cms:ucms:ucms_creat_35.png?|}} И через 5 сек нас перенаправит на следющее окно файла создания пользователя базы данных, который будет создан позднее. {{:software:development:demo:cms:ucms:ucms_creat_35.png?|}} ← [[software:development:demo:cms:ucms:creating_file_lang_and_time_zone|8.4. Файл lang_and_time_zone.php]] [[software:development:demo:cms:ucms:creating_file_module_help|8.6. module_help.php]] →