5.07. Локальная среда разработки
Локальная среда разработки
Что такое локальная среда разработки?
Локальная среда разработки — это набор программных компонентов, установленных на персональном компьютере разработчика и предназначенный для создания, отладки и тестирования веб-приложений без подключения к удалённому хостингу или серверу. В такой среде разработчик полностью контролирует конфигурацию, версии используемых технологий и поведение приложения до его публикации в интернете.
Компоненты локальной среды
Язык программирования PHP
PHP используется для написания серверной логики веб-приложений. Скрипты на PHP обрабатывают HTTP-запросы, взаимодействуют с базами данных, формируют HTML-страницы и реализуют функционал авторизации, загрузки файлов, API и других возможностей динамического сайта. Для локальной разработки может использоваться любая из поддерживаемых версий PHP, включая устаревшие (для поддержки легаси-проектов) и актуальные (для новых решений).
Системы управления реляционными базами данных
Реляционные СУБД, такие как MySQL и PostgreSQL, хранят структурированные данные приложения: пользователей, заказы, товары, статьи и другую информацию. Они обеспечивают целостность данных через транзакции, внешние ключи и ограничения, а также предоставляют мощный язык запросов SQL для выборки, фильтрации и агрегации информации.
In-memory хранилища для кэширования
Системы вроде Redis и Memcached работают в оперативной памяти и используются для временного хранения часто запрашиваемых данных: сессий пользователей, результатов сложных запросов, фрагментов страниц. Это снижает нагрузку на основную базу данных и ускоряет отклик приложения.
Веб-сервер
Веб-сервер принимает HTTP- и HTTPS-запросы от браузера и направляет их на обработку скриптам (например, PHP). Он отдаёт статические файлы (изображения, CSS, JavaScript), управляет заголовками, обеспечивает маршрутизацию URL и может выступать в роли reverse proxy перед другими сервисами. Наиболее распространённые веб-серверы — Apache и Nginx.
Дополнительные инструменты
В зависимости от задач проекта могут подключаться:
- RabbitMQ — для организации асинхронной передачи сообщений между микросервисами;
- Mailpit или SMTP4dev — для перехвата и анализа исходящей почты без отправки реальным получателям;
- Vault — для безопасного хранения секретов: паролей, токенов, ключей шифрования;
- PocketBase — как лёгкий бэкенд с встроенной базой данных и REST API;
- Blackfire — для профилирования производительности PHP-кода.
Файл hosts и его роль
Файл hosts — это текстовый файл операционной системы, в котором задаются статические соответствия между доменными именами и IP-адресами. Он используется до обращения к DNS-серверам и позволяет переопределять разрешение имён локально.
Путь к файлу:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS:
/etc/hosts
Синтаксис прост: каждая строка содержит IP-адрес, один или несколько доменных имён, разделённых пробелами или табуляцией. Комментарии начинаются с символа #.
Пример содержимого:
127.0.0.1 localhost
127.0.0.1 mysite.loc
127.0.0.1 shop.test api.shop.test
# 192.168.1.10 old-server.local
В контексте локальной разработки записи вида 127.0.0.1 project.loc позволяют обращаться к локальному веб-серверу по удобочитаемому имени вместо localhost или IP-адреса. Это особенно важно при работе с несколькими проектами одновременно, так как каждый может иметь свой уникальный домен.
Записи в файл hosts добавляются либо вручную (требуются права администратора), либо автоматически средствами локальной среды разработки. После изменения файла может потребоваться очистка DNS-кэша командой ipconfig /flushdns (Windows) или sudo dscacheutil -flushcache (macOS).
Работа локального веб-сервера
Локальный веб-сервер запускается на машине разработчика и прослушивает стандартные порты: 80 для HTTP и 443 для HTTPS (или другие, если основные заняты). При получении запроса к домену, например http://shop.loc, сервер:
- Сопоставляет домен с настроенным виртуальным хостом;
- Определяет корневую директорию проекта;
- Если запрошен статический файл — отдаёт его напрямую;
- Если запрошен PHP-скрипт — передаёт его интерпретатору PHP через CGI, FastCGI или модуль;
- Возвращает сформированный ответ браузеру.
Такой подход даёт возможность:
- Тестировать маршрутизацию и правила
.htaccess; - Проверять работу сессий, кук и заголовков;
- Имитировать production-поведение приложения;
- Отлаживать ошибки без влияния на живой сайт.
Работа локального DNS-сервера
Локальный DNS-сервер (например, Bind или Unbound) расширяет возможности, предоставляемые файлом hosts. Вместо ручного добавления каждой записи можно настроить DNS-зону, например .test или .loc, и все домены в этой зоне автоматически будут разрешаться в указанный IP-адрес (обычно 127.0.0.1).
Принцип работы:
- Система настраивается на использование
127.0.0.1как основного DNS-резолвера; - При запросе
anyname.locсистема обращается к локальному DNS-серверу; - Сервер проверяет, принадлежит ли домен настроенной зоне;
- Если да — возвращает
127.0.0.1; если нет — перенаправляет запрос к публичным DNS (например,8.8.8.8).
Преимущества локального DNS-сервера:
- Не нужно редактировать файл
hostsпри создании нового проекта; - Поддержка wildcard-доменов:
*.project.loc→127.0.0.1; - Возможность настройки DNSSEC, кэширования и логирования;
- Изоляция локальных доменов от глобального DNS-пространства.
Это особенно удобно при разработке сложных систем с множеством поддоменов (например, admin.app.loc, api.app.loc, docs.app.loc) — достаточно один раз настроить зону, и все поддомены заработают автоматически.
Виды локальных сред
XAMPP — один из самых старых и известных наборов для локальной веб-разработки. Он включает Apache, MySQL, PHP и Perl. Отсюда название:
- X — кроссплатформенность,
- Apache,
- MySQL,
- PHP,
- Perl.
Работу с XAMPP мы разбираем в отдельной главе, так что здесь останавливаться не будем. Простая установка, запуск, минимальные требования к знаниям, доступна на любых платформах, а встроенный phpMyAdmin упрощает работу с БД. Разве что недостаток - привязка к Apache и MySQL — нет поддержки Nginx, PostgreSQL или других СУБД из коробки.
XAMPP подходит для:
- обучения основам PHP и MySQL;
- быстрого запуска простого проекта без сложной инфраструктуры;
- случаев, когда нужен только стек LAMP (Linux/Apache/MySQL/PHP), даже на Windows.
Laragon — современная альтернатива XAMPP, ориентированная на разработчиков PHP, но с расширенной поддержкой Node.js, Python, Go и других технологий.
Автоматическая настройка виртуальных хостов, поддержка нескольких веб-серверов (Apache и Nginx), управление версиями PHP, Node.js, Python и других языков через GUI. Интеграция с Composer, npm, Git и другими инструментами.
Но лучше всего, пожалуй, Docker - платформа для контейнеризации приложений. Она позволяет упаковать приложение и все его зависимости в изолированные контейнеры. Здесь полный контроль над окружением, ведь каждое приложение работает в своём контейнере с точной версией ОС, языка, СУБД и зависимостей. Поддержка любых технологий, работает одинаково на Windows, macOS и Linux. Только вот высокий порог входа: требуется понимание концепций контейнеризации, сетей, томов, Dockerfile и docker-compose.yml.
Docker мы разбираем в отдельной главе в разделе с инфраструктурой. Он не касается PHP, это больше DevOps-тема.
Docker подходит для:
- командной разработки, где важна воспроизводимость окружения;
- микросервисных архитектур;
- проектов, требующих нестандартных зависимостей или специфических версий ПО;
- подготовки к развёртыванию в облаке или на серверах с контейнерной инфраструктурой.
Но новичков также учат часто на Open Server Panel. Поскольку XAMPP уже уделено достаточно внимания, давайте разберём с работу OSP на практике.
Open Server Panel
Что такое Open Server Panel?
Open Server Panel — портативная программная среда для локальной веб-разработки под операционные системы Windows.
Программа объединяет в едином интерфейсе набор серверных компонентов: веб-серверы, системы управления базами данных, интерпретаторы языков программирования и вспомогательные инструменты.
Среда предназначена для разработки, отладки и тестирования веб-приложений без подключения к удалённым хостингам.
Сразу стоит отметить, что существует два варианта работы с Open Server Panel:
- до версии 6+;
- версия 6 и новее.
В версии 6 сильно изменили подход, и конфигурация сильно отличается. Если изначально был простой алгоритм - добавить модуль, включить его, закинуть в папку и запускать, то сейчас требуется конфигурация.
Лично у меня так и не удавалось полноценно "завести" сервер на Windows 11, и так у многих.
На старых версиях, к примеру, 5-й, директории проекта создаются в папке /domains, тогда как в новых версиях используется /home.
Пользователь запускает приложение без установки в системе. Все компоненты размещаются в одной директории на диске, и даже при переносе этой директории на другой компьютер или после переустановки операционной системы, среда будет сохранять свою работоспособность. И не приджётся повторно настраивать окружение разработки.
Архитектура Open Server Panel построена вокруг центрального управляющего приложения, написанного на языке Delphi.
Приложение выполняет функции оркестратора: запускает процессы модулей, управляет их взаимодействием, отслеживает состояние компонентов.
Каждый модуль — отдельный исполняемый файл или набор файлов с собственной конфигурацией. Модули не интегрируются в ядро приложения, а работают как независимые процессы под управлением панели.
Конфигурация среды хранится в текстовых файлах формата INI и JSON внутри директории программы. Эти файлы определяют версии модулей, пути к исполняемым файлам, параметры сетевого взаимодействия, правила маршрутизации доменов. Пользователь редактирует конфигурацию через графический интерфейс панели или напрямую в текстовых редакторах. При изменении настроек панель автоматически перезаписывает конфигурационные файлы соответствующих модулей.
Сетевое взаимодействие организовано через виртуальные домены.
Панель модифицирует системный файл hosts и при необходимости запускает локальный DNS-сервер (Bind или Unbound).
Запрос к домену example.loc направляется на 127.0.0.1, где его принимает веб-сервер. Для каждого домена задаётся отдельный корневой каталог, версия PHP, настройки сервера. Такая изоляция позволяет одновременно работать с несколькими проектами, требующими разных версий интерпретаторов или конфигураций.
Портативность достигается отказом от записи данных в системные реестры и глобальные переменные среды.
Все пути внутри конфигурации задаются относительно корневой директории панели с помощью макросов вида %OpenServer%. При перемещении директории панель автоматически пересчитывает пути при следующем запуске.
Для работы требуется только файловая система NTFS и установленные системные библиотеки Microsoft Visual C++ Redistributable, поставляемые в комплекте.
Панель предоставляет возможность одновременного запуска нескольких веб-серверов. Пользователь включает Apache и Nginx параллельно, назначая каждому собственный сетевой порт. Такая конфигурация полезна при тестировании поведения приложения под разными серверами или при организации цепочки reverse proxy.
Система профилей позволяет сохранять и переключать между различными конфигурациями среды. Профиль включает выбранные версии модулей, настройки доменов, параметры баз данных.
Разработчик создаёт профиль Учебный с PHP 8.1 и MySQL, профиль Производственный с PHP 8.4 и PostgreSQL. Переключение занимает несколько секунд без перезапуска приложения.
Консольная интеграция реализована через утилиту osconsole.exe. Эта программа запускает командную строку Windows с предустановленными переменными среды, указывающими на текущие версии модулей.
Веб-серверы представлены тремя реализациями:
- Apache поставляется с тринадцатью дополнительными модулями, включая
mod_rewriteиmod_ssl. - Nginx включает девятнадцать модулей, среди которых поддержка stream-проксирования и модуль для работы с изображениями.
- Caddy отличается автоматической генерацией конфигурации и встроенной поддержкой 144 расширений.
Системы управления базами данных охватывают реляционные и документоориентированные решения:
- MySQL и MariaDB предоставляют совместимые SQL-интерфейсы с различными оптимизациями движков хранения.
- PostgreSQL реализует расширенную типизацию данных и процедурные языки.
- MongoDB хранит документы в формате BSON с поддержкой индексации вложенных полей.
- Redis и Memcached работают как in-memory хранилища для кэширования и временного хранения сессий.
Интерпретатор PHP поставляется в восьми версиях от 7.2 до 8.5. Каждая версия включает сто пятнадцать расширений: от стандартных pdo_mysql и curl до специализированных xdebug и blackfire. Пользователь переключает версии глобально или назначает разные версии для отдельных доменов.
Вспомогательные компоненты расширяют возможности среды:
- RabbitMQ обеспечивает обмен сообщениями между микросервисами через очереди.
- Vault управляет секретами: паролями, ключами шифрования, токенами API.
- Mailpit и SMTP4dev перехватывают исходящую почту приложений для анализа содержимого без отправки реальным получателям.
- PocketBase предоставляет бэкенд-функциональность в виде единого исполняемого файла с встроенной базой данных.
Apache
Apache HTTP Server — веб-сервер с открытым исходным кодом, обрабатывающий HTTP- и HTTPS-запросы клиентов.
Сервер принимает запросы от браузеров, интерпретирует их согласно конфигурации виртуальных хостов и передаёт обработку динамическому контенту (PHP, Python) или возвращает статические файлы.
В составе Open Server Panel поставляется с тринадцатью дополнительными модулями: mod_rewrite для преобразования URL, mod_ssl для шифрования, mod_deflate для сжатия ответов, mod_headers для управления заголовками HTTP.
Веб-сервер необходим для локальной отладки сайтов перед развёртыванием на хостинге.
Apache поддерживает .htaccess-файлы, что критично для работы многих CMS (WordPress, Joomla, Bitrix).
Сервер корректно обрабатывает правила маршрутизации фреймворков на базе PHP. Разработчик проверяет поведение приложения в условиях, максимально приближенных к продакшен среде хостинг-провайдеров, где Apache остаётся распространённым решением.
Настройка начинается с выбора версии в меню Модули → Веб-сервер. Панель предоставляет несколько сборок Apache с разными наборами модулей. Для изменения конфигурации нажмите правой кнопкой мыши на иконке панели в трее, выберите Конфигурации → Apache.
Откроется файл httpd.conf в системном редакторе.
Основные параметры:
- Порт прослушивания: директива
Listen 8080меняет стандартный порт 80 - Корневой каталог:
DocumentRoot "C:/OpenServer/domains/example.loc" - Виртуальные хосты: секции
<VirtualHost *:80>в файлеextra/httpd-vhosts.conf
Для каждого домена в разделе Домены панели задаётся отдельный путь к проекту. Панель автоматически генерирует конфигурацию виртуального хоста при добавлении домена через интерфейс.
Активируйте Apache через главное окно панели: вкладка Модули → переключатель напротив нужной версии.
Сервер запускается вместе с панелью при старте системы, если в настройках включена опция автозагрузки. Состояние отображается цветовым индикатором: зелёный — работает, серый — остановлен.
Для перезапуска после изменения конфигурации используйте кнопку Перезапустить в трее или команду ospanel restart apache в консоли панели.
Bind
Bind (Berkeley Internet Name Domain) — DNS-сервер, преобразующий доменные имена в IP-адреса.
В локальной среде Bind перехватывает запросы к доменам вида *.loc, *.test и направляет их на 127.0.0.1.
Сервер обрабатывает рекурсивные запросы к публичным доменам через настроенные резолверы.
Bind включается в разделе Модули → DNS-сервер. После активации панель автоматически настраивает сетевые адаптеры Windows для использования 127.0.0.1 как основного DNS-резолвера.
Расширенная настройка доступна через файл конфигурации userdata/config/bind/named.conf. Здесь указываются:
- Зоны для локальных доменов:
zone "loc" { type master; file "loc.zone"; } - Форвардинг запросов к публичным доменам:
forwarders { 8.8.8.8; 1.1.1.1; }
Для добавления кастомной зоны создайте файл зоны в директории userdata/config/bind/zones/ и пропишите его в конфигурации.
Запуск происходит автоматически при активации модуля в интерфейсе панели. Состояние процесса отображается в трее рядом с иконкой панели. При первом запуске панель запросит права администратора для изменения сетевых настроек системы.
Если возникает конфликт с другими службами (например, dnsmasq в WSL2), измените порт Bind в конфигурации на 5353 и настройте форвардинг с основного порта 53 через утилиту netsh.
Blackfire
Blackfire — инструмент профилирования производительности PHP-приложений. Собирает данные о времени выполнения функций, количестве вызовов, потреблении памяти и взаимодействии с базами данных.
Результаты визуализируются в виде графов и временных диаграмм в веб-интерфейсе.
Активируйте модуль в разделе Модули → Blackfire.
Панель автоматически устанавливает PHP-расширение blackfire.so для всех версий PHP.
Для аутентификации требуется аккаунт на сайте blackfire.io. Получите идентификатор клиента и токен сервера в личном кабинете. Пропишите их в файле userdata/config/blackfire/blackfire.ini:
client-id=ваш_client_id
client-token=ваш_client_token
server-id=ваш_server_id
server-token=ваш_server_token
Для профилирования конкретного запроса установите браузерное расширение Blackfire и активируйте запись перед открытием страницы проекта.
Blackfire запускается автоматически при активации модуля. Расширение PHP подключается динамически при выборе версии PHP в панели.
Для проверки работоспособности выполните в консоли панели команду blackfire --version. Профилирование начинается после нажатия кнопки записи в браузерном расширении.
Результаты доступны в веб-интерфейсе blackfire.io/dashboard.
Caddy
Caddy — веб-сервер, написанный на языке Go. Отличается автоматической генерацией и обновлением SSL-сертификатов Let's Encrypt, минималистичной конфигурацией и встроенной поддержкой HTTP/3. В составе Open Server Panel поставляется с 144 модулями, включая поддержку reverse proxy, gzip-сжатия и обработки статики.
Выберите версию Caddy в разделе Модули → Веб-сервер. Конфигурация хранится в файле userdata/config/caddy/Caddyfile. Пример минимальной конфигурации для домена:
example.loc:80 {
root * C:/OpenServer/domains/example.loc
file_server
php_fastcgi 127.0.0.1:9000
}
Для включения HTTPS добавьте директиву tls internal — Caddy сгенерирует самоподписанный сертификат. Панель автоматически настраивает взаимодействие с PHP через FastCGI на порту 9000. Для кастомных модулей скопируйте их в директорию modules/caddy/ и перезапустите сервер.
Активируйте Caddy переключателем в интерфейсе панели.
Сервер запускается на порту 2015 по умолчанию, но панель автоматически перенаправляет запросы с порта 80 через внутренний прокси. Состояние процесса отображается в трее.
Для проверки работоспособности откройте в браузере http://localhost:2015. Логи записываются в userdata/logs/caddy/.
Mailpit
Mailpit — локальный SMTP-сервер для перехвата исходящей почты веб-приложений. Принимает сообщения по протоколу SMTP, сохраняет их в памяти и предоставляет веб-интерфейс для просмотра содержимого, заголовков и вложений без отправки реальным получателям.
Это нужно для тестирования функционала отправки писем (регистрация, восстановление пароля, уведомления) без риска спама реальных пользователей. Разработчик проверяет корректность шаблонов, кодировок, вложений и заголовков. Mailpit заменяет настройки почтового сервера в конфигурации приложения на локальный адрес 127.0.0.1:1025.
Включите модуль в разделе «Модули» → «Почтовый сервер». Mailpit автоматически запускает SMTP-сервер на порту 1025 и веб-интерфейс на порту 8025. Для интеграции с PHP укажите в php.ini:
[mail function]
SMTP = 127.0.0.1
smtp_port = 1025
Для фреймворков настройте драйвер почты на использование SMTP с хостом 127.0.0.1 и портом 1025.
Веб-интерфейс доступен по адресу http://127.0.0.1:8025.
Активируйте модуль переключателем в панели. Сервер запускается мгновенно без дополнительных зависимостей.
Для проверки отправьте тестовое письмо из приложения — оно появится в веб-интерфейсе Mailpit в реальном времени. Сообщения хранятся до перезапуска панели. Очистка выполняется кнопкой Delete all в интерфейсе.
MariaDB
MariaDB — реляционная система управления базами данных, ответвление от MySQL с открытым исходным кодом. Хранит структурированные данные в таблицах, обеспечивает целостность через транзакции ACID, поддерживает сложные запросы с использованием языка SQL. Включает движки хранения InnoDB (транзакционный) и Aria (для временных таблиц).
Выберите версию MariaDB в разделе Модули → Базы данных. Панель создаёт каталог данных в userdata/data/MariaDB/.
Основной конфигурационный файл my.ini расположен в userdata/config/MariaDB/.
Ключевые параметры:
- Порт:
port = 3306 - Кодировка:
character-set-server = utf8mb4 - Память:
innodb_buffer_pool_size = 256M
Для изменения порта отредактируйте параметр port в конфигурации и перезапустите сервер. Панель автоматически создаёт пользователя root без пароля для локального доступа.
Активируйте MariaDB переключателем в интерфейсе. Сервер запускается в фоновом режиме.
Для доступа используйте встроенную утилиту phpMyAdmin (доступна по адресу http://phpmyadmin.loc) или внешние клиенты (DBeaver, HeidiSQL) с параметрами: хост 127.0.0.1, порт 3306, пользователь root, пароль пустой. Логи записываются в userdata/logs/MariaDB/.
Memcached
Memcached — распределённая система кэширования данных в оперативной памяти. Хранит пары ключ-значение с ограниченным временем жизни. Работает по протоколу TCP, обеспечивает низкую задержку доступа к данным — микросекунды на операцию.
Включите модуль в разделе Модули → Кэширование. Memcached запускается с параметрами по умолчанию: порт 11211, объём кэша 64 МБ. Для изменения объёма памяти отредактируйте файл запуска modules/memcached/memcached.exe.config:
<add key="memory" value="256" />
Значение указывается в мегабайтах. Для доступа из PHP требуется расширение memcached, включённое по умолчанию во всех версиях PHP панели.
Активируйте модуль переключателем. Сервер запускается мгновенно. Проверьте работоспособность командой в консоли панели:
telnet 127.0.0.1 11211
stats
Для интеграции с приложением используйте клиентскую библиотеку (например, Memcached в PHP) с параметрами хост 127.0.0.1, порт 11211.
MongoDB
MongoDB — документоориентированная база данных, хранящая данные в формате BSON (бинарный JSON). Организует документы в коллекции без строгой схемы. Поддерживает индексацию вложенных полей, агрегационные запросы и горизонтальное масштабирование через шардинг.
Активируйте модуль в разделе Модули → Базы данных. Каталог данных создаётся в userdata/data/MongoDB/. Конфигурация хранится в userdata/config/MongoDB/mongod.cfg. Основные параметры:
- Порт:
net.port: 27017 - Каталог данных:
storage.dbPath: C:/OpenServer/userdata/data/MongoDB/ - Журналирование:
systemLog.destination: file
Для изменения порта отредактируйте параметр net.port и перезапустите сервер. Аутентификация отключена по умолчанию для локальной разработки.
Включите MongoDB переключателем в панели. Сервер запускается в фоновом режиме.
Для доступа используйте встроенную утилиту MongoDB Compass (требует отдельной установки) или консольный клиент mongosh, доступный через консоль панели командой mongosh. Подключение: mongodb://127.0.0.1:27017.
MySQL
MySQL — реляционная система управления базами данных с открытым исходным кодом. Организует данные в таблицы со строгой схемой, обеспечивает целостность через внешние ключи и транзакции. Поддерживает процедурные расширения (хранимые процедуры, триггеры) и репликацию.
Выберите версию MySQL в разделе Модули → Базы данных. Каталог данных формируется в userdata/data/MySQL/.
Конфигурационный файл my.ini расположен в userdata/config/MySQL/. Важные параметры:
- Порт:
port = 3306 - Кодировка:
character-set-server = utf8mb4 - Временная зона:
default-time-zone = '+03:00'
Для смены порта измените значение port в конфигурации. Панель создаёт пользователя root без пароля для локального подключения.
Активируйте модуль переключателем. Сервер запускается автоматически.
Доступ осуществляется через phpMyAdmin (http://phpmyadmin.loc) или внешние клиенты с параметрами: хост 127.0.0.1, порт 3306, пользователь root, пароль отсутствует. Логи записываются в userdata/logs/MySQL/.
Nginx
Nginx — веб-сервер и reverse proxy с асинхронной архитектурой обработки соединений. Эффективно обслуживает статический контент и распределяет запросы к бэкенд-приложениям. Включает девятнадцать модулей: обработка gzip, кэширование прокси, балансировка нагрузки, ограничение скорости.
Используется для высокопроизводительной отдачи статики (изображений, CSS, JS) и организации обратного проксирования для PHP-FPM, Node.js или других бэкендов. Nginx часто используется как фронтенд перед Apache для обработки медленных клиентов и защиты от DDoS-атак.
Выберите версию Nginx в разделе Модули → Веб-сервер.
Основной конфигурационный файл nginx.conf находится в userdata/config/nginx/.
Для каждого домена панель генерирует файл в userdata/config/nginx/domains/. Пример конфигурации:
server {
listen 80;
server_name example.loc;
root "C:/OpenServer/domains/example.loc";
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Панель автоматически настраивает взаимодействие с PHP через FastCGI на порту 9000.
Активируйте Nginx переключателем в интерфейсе. Сервер запускается на порту 80. Состояние отображается цветовым индикатором в трее.
Для проверки синтаксиса конфигурации используйте консоль панели: nginx -t. Перезапуск после изменений выполняется кнопкой «Перезапустить» в трее или командой ospanel restart nginx.
PHP
PHP в таком решении используется для создания динамических веб-приложений: CMS, интернет-магазины, корпоративные порталы. PHP обеспечивает логику обработки форм, авторизации, генерации страниц. Расширения добавляют функциональность: работа с изображениями (GD), кэширование (Redis), отладка (Xdebug).
В составе панели поставляется восемь версий от 7.2 до 8.5, каждая со 115 расширениями.
Выберите версию PHP в разделе Модули → Языки программирования. Глобальная конфигурация хранится в userdata/config/PHP/X.X/php.ini. Для каждого домена можно задать отдельную версию и кастомный php.ini в настройках домена (правой кнопкой на домене → Настройки).
Ключевые параметры в php.ini:
- Ограничение памяти:
memory_limit = 256M - Максимальный размер загрузки:
upload_max_filesize = 64M - Отображение ошибок:
display_errors = On(для разработки)
Для включения расширения раскомментируйте строку ;extension=redis → extension=redis.
PHP работает в режиме FastCGI под управлением веб-сервера (Apache или Nginx).
При активации версии в панели запускается процесс PHP-FPM на порту 9000. Для проверки создайте файл info.php с содержимым <?php phpinfo(); ?> в корне домена и откройте его в браузере.
Консольный режим доступен через утилиту osconsole: команда php -v покажет активную версию.
PocketBase
PocketBase — бэкенд-платформа в виде единого исполняемого файла на языке Go. Включает встроенный веб-сервер, базу данных SQLite, систему аутентификации и REST API. Предоставляет админ-панель для управления данными и пользователями.
Активируйте модуль в разделе Модули → Базы данных. PocketBase создаёт каталог данных в userdata/data/PocketBase/.
Конфигурация управляется через переменные окружения или файл pocketbase.json в каталоге данных.
Основные параметры:
- Порт:
--http=127.0.0.1:8090 - Каталог данных:
--dir=./pb_data
Для изменения порта отредактируйте файл запуска modules/pocketbase/start.bat, добавив параметр --http=127.0.0.1:8091.
Включите модуль переключателем. Сервер запускается на порту 8090.
Админ-панель доступна по адресу http://127.0.0.1:8090/_/. Первый запуск требует создания администратора — следуйте инструкциям в интерфейсе. API вызовы выполняются на эндпоинты вида http://127.0.0.1:8090/api/collections/posts/records.
PostgreSQL
PostgreSQL — объектно-реляционная система управления базами данных с расширенной типизацией. Поддерживает пользовательские типы данных, полнотекстовый поиск, геоданные (через расширение PostGIS), JSONB для хранения документов. Обеспечивает строгую целостность через многоверсионный контроль параллелизма (MVCC).
Активируйте модуль в разделе Модули → Базы данных. Каталог данных создаётся в userdata/data/PostgreSQL/.
Основной конфигурационный файл postgresql.conf расположен в userdata/config/PostgreSQL/.
Важные параметры:
- Порт:
port = 5432 - Кодировка:
encoding = UTF8 - Локаль:
lc_collate = Russian_Russia.1251
Для изменения порта отредактируйте параметр port и перезапустите сервер. Панель создаёт суперпользователя postgres без пароля.
Включите PostgreSQL переключателем. Сервер запускается в фоновом режиме.
Для доступа используйте pgAdmin (требует отдельной установки) или консольный клиент psql, доступный через консоль панели: psql -U postgres.
Подключение: хост 127.0.0.1, порт 5432, пользователь postgres. Логи записываются в userdata/logs/PostgreSQL/.
RabbitMQ
RabbitMQ — брокер сообщений, реализующий протокол AMQP. Организует асинхронный обмен данными между компонентами системы через очереди. Поддерживает маршрутизацию сообщений, подтверждение доставки, персистентность и кластеризацию.
Включите модуль в разделе Модули → Очереди. RabbitMQ требует предварительной установки Erlang — панель проверяет наличие среды при первом запуске и предложит скачать дистрибутив.
Конфигурация хранится в userdata/config/RabbitMQ/rabbitmq.conf.
Основные параметры:
- Порт AMQP:
listeners.tcp.default = 5672 - Порт управления:
management.listener.port = 15672
Для изменения портов отредактируйте соответствующие директивы. Панель создаёт пользователя guest с паролем guest для доступа к веб-интерфейсу.
Активируйте модуль переключателем. Сервер запускается после проверки наличия Erlang.
Веб-интерфейс управления доступен по адресу http://127.0.0.1:15672 с учётными данными guest/guest.
Для подключения приложения используйте клиентскую библиотеку (например, pika для Python) с параметрами: хост 127.0.0.1, порт 5672, виртуальный хост /.
Redis
Redis — система хранения данных в оперативной памяти с поддержкой различных структур: строки, хэши, списки, множества, сортированные множества. Обеспечивает операции атомарного обновления, публикации/подписки и персистентность через снапшоты или журнал транзакций.
Активируйте модуль в разделе Модули → Кэширование.
Конфигурационный файл redis.conf расположен в userdata/config/Redis/. Ключевые параметры:
- Порт:
port 6379 - Объём памяти:
maxmemory 256mb - Политика вытеснения:
maxmemory-policy allkeys-lru
Для ограничения памяти установите значение maxmemory и выберите политику вытеснения. Аутентификация отключена по умолчанию для локальной разработки.
Включите Redis переключателем. Сервер запускается мгновенно.
Для проверки подключитесь через консоль панели: redis-cli ping — ответ PONG подтверждает работоспособность.
Для интеграции с приложением используйте клиентскую библиотеку (например, phpredis для PHP) с параметрами: хост 127.0.0.1, порт 6379. Данные сохраняются на диск автоматически согласно настройкам save в конфигурации.
SFTPGo
SFTPGo — сервер передачи файлов, поддерживающий протоколы SFTP, FTP/S и WebDAV. Обеспечивает аутентификацию пользователей, управление квотами дискового пространства, виртуальные файловые системы и логирование операций.
Активируйте модуль в разделе «Модули» → «Сеть». Конфигурация хранится в файле userdata/config/SFTPGo/sftpgo.json. Основные параметры:
- Порт SFTP:
"sftpd": { "bindings": [{ "port": 2022 }] } - Каталог пользователей:
"data_provider": { "users_base_dir": "C:/OpenServer/domains" }
Для добавления пользователя используйте веб-интерфейс администрирования на порту 8085 или консольную утилиту sftpgo-cli.
Панель создаёт администратора с логином admin и паролем admin.
Активируйте модуль в разделе Модули → Сеть. Конфигурация хранится в файле userdata/config/SFTPGo/sftpgo.json. Основные параметры:
- Порт SFTP:
"sftpd": { "bindings": [{ "port": 2022 }] } - Каталог пользователей:
"data_provider": { "users_base_dir": "C:/OpenServer/domains" }
Для добавления пользователя используйте веб-интерфейс администрирования на порту 8085 или консольную утилиту sftpgo-cli. Панель создаёт администратора с логином admin и паролем admin.
Включите модуль переключателем. Сервер запускается на порту 2022 для SFTP и 8085 для веб-интерфейса.
Веб-админка доступна по адресу http://127.0.0.1:8085. Для подключения клиента используйте параметры: хост 127.0.0.1, порт 2022, протокол SFTP, учётные данные созданного пользователя. Файлы сохраняются в указанном базовом каталоге с изоляцией по пользователям.
SMTP4dev
SMTP4dev — локальный SMTP-сервер для перехвата и просмотра исходящей почты. Принимает сообщения по SMTP, сохраняет их в базе данных SQLite и предоставляет веб-интерфейс с возможностью просмотра HTML-версии, исходного кода и вложений.
Включите модуль в разделе Модули → Почтовый сервер. SMTP4dev запускает SMTP-сервер на порту 25 и веб-интерфейс на порту 5000. Для интеграции с PHP укажите в php.ini:
[mail function]
SMTP = 127.0.0.1
smtp_port = 25
Для фреймворков настройте драйвер почты на использование SMTP с хостом 127.0.0.1 и портом 25. Веб-интерфейс доступен по адресу http://127.0.0.1:5000.
Активируйте модуль переключателем. Сервер запускается мгновенно.
Отправьте тестовое письмо из приложения — оно появится в веб-интерфейсе. Сообщения сохраняются между перезапусками панели в файле userdata/data/SMTP4dev/smtp4dev.db. Очистка выполняется кнопкой Delete all в интерфейсе.
Unbound
Unbound — рекурсивный DNS-резолвер с фокусом на безопасности и производительности. Проверяет подлинность ответов через DNSSEC, кэширует результаты запросов, поддерживает IPv6 и разделение зон.
Активируйте модуль в разделе Модули → DNS-сервер. После включения панель настраивает сетевые адаптеры на использование 127.0.0.1 как основного резолвера.
Конфигурация хранится в userdata/config/Unbound/unbound.conf. Основные параметры:
- Порт:
port: 53 - Кэш:
msg-cache-size: 64m - DNSSEC:
val-permissive-mode: no
Для добавления форвардинга запросов к публичным резолверам используйте секцию forward-zone:
forward-zone:
name: "."
forward-addr: 8.8.8.8
forward-addr: 1.1.1.1
Включите Unbound переключателем. Сервер запускается с запросом прав администратора для изменения сетевых настроек. Состояние отображается в трее.
Для проверки выполните в командной строке Windows: nslookup example.loc 127.0.0.1. Ответ должен содержать адрес 127.0.0.1.
Vault
Vault — система управления секретами от компании HashiCorp. Хранит пароли, токены API, ключи шифрования и сертификаты в зашифрованном виде. Обеспечивает аудит доступа, динамическую генерацию учётных данных и временное предоставление прав.
Активируйте модуль в разделе Модули → Безопасность. Vault запускается в режиме dev с предварительно разблокированным хранилищем.
Конфигурация хранится в userdata/config/Vault/config.hcl. Основные параметры:
- Порт API:
listener "tcp" { address = "127.0.0.1:8200" } - Каталог данных:
storage "file" { path = "C:/OpenServer/userdata/data/Vault" }
Для постоянного режима работы (без автоматической разблокировки) отключите параметр dev_mode и настройте ключи разблокировки.
Включите модуль переключателем. Vault запускается на порту 8200. Для доступа через CLI используйте консоль панели:
set VAULT_ADDR=http://127.0.0.1:8200
vault status
В режиме разработки хранилище уже разблокировано, токен доступа root действителен.
Веб-интерфейс доступен по адресу http://127.0.0.1:8200/ui. Для сохранения секрета выполните: vault kv put secret/db password=supersecret.
Утилита командной строки
osp — консольная утилита, встроенная в состав Open Server Panel. Программа предоставляет текстовый интерфейс для управления компонентами локального сервера без использования графического окна панели.
Утилита запускается из командной строки Windows через файл osconsole.exe, расположенный в корневой директории панели. После запуска пользователь получает приглашение командной строки с предустановленными переменными среды, указывающими на активные версии модулей.
Команда osp use применяет среду указанного модуля к текущей сессии консоли. Пример:
osp use PHP-8.2
После выполнения этой команды вызов php -v покажет версию 8.2. Команда osp add объединяет среду модуля с текущей без полной замены — полезно при одновременной работе с несколькими компонентами:
osp add Node-20.11
osp add Composer-2.7
Команда osp project переключает среду на настройки конкретного домена и перемещает текущий каталог в корень проекта:
osp project example.loc
После выполнения текущая директория становится C:\OSPanel\domains\example.loc, а переменные среды настраиваются согласно параметрам домена (версия PHP, настройки базы данных).
Утилита позволяет управлять состоянием серверных компонентов напрямую из консоли. Команды osp on, osp off, osp restart включают, выключают и перезапускают модули:
osp on Apache-2.4
osp restart MySQL-8.0
osp off Nginx-1.25
Команда osp status показывает текущее состояние модуля — работает ли процесс, какой порт занят, есть ли ошибки в логах. Для перечитывания конфигурации без перезапуска сервера используется osp init:
osp init PHP-8.3
Эта команда пересоздаёт временные конфигурационные файлы на основе текущих настроек панели.
Команда osp log фильтрует и выводит содержимое лог-файлов. Фильтрация работает через регулярные выражения, указанные в первом аргументе. Примеры:
osp log php-8\.2
Выводит последние записи из лога ошибок PHP 8.2. Для просмотра логов доступа к домену:
osp log domains\\example_loc_access
Команда показывает последние 50 строк по умолчанию. Второй аргумент задаёт количество строк:
osp log . 100
Эта команда выводит последние 100 строк из всех доступных логов программы.
Консольная среда включает набор современных утилит для работы с файлами, сетью и данными:
bat— замена стандартной командыtypeс подсветкой синтаксиса и нумерацией строкfd— быстрый поиск файлов с поддержкой регулярных выраженийsd— инструмент поиска и замены текста с синтаксисом, похожим на Perljq— обработка JSON-данных в конвейере командxh— отправка HTTP-запросов с форматированным выводом ответаoha— нагрузочное тестирование веб-сервисов с выводом статистикиsqlite3— работа с локальными базами данных SQLite без установки дополнительного ПО
Эти утилиты доступны сразу после запуска osconsole.exe, не требуют отдельной установки и совместимы с командами стандартной командной строки Windows.
Разработчик запускает консоль через ярлык «Консоль» в директории панели или командой osconsole из любого терминала. Далее последовательно выполняет:
osp project shop.loc
composer install
npm install
php artisan migrate
Все команды используют версии инструментов, настроенные для домена shop.loc в графическом интерфейсе панели. При необходимости сменить версию PHP для текущей сессии:
osp use PHP-8.4
php artisan test
После завершения работы команда osp reset возвращает консоль к исходной системной среде, а exit закрывает окно терминала.
Создание сайта с авторизацией на PHP и MySQL
Подготовка среды в Open Server Panel
Установите Open Server Panel в корень диска, например C:\OSPanel. Такой путь упрощает работу с длинными путями к файлам конфигурации. При установке выберите компоненты, которые потребуются для ваших проектов: версии PHP, базы данных, веб-серверы.
После завершения установки запустите инструмент подготовки системы. Этот шаг обязателен для корректной работы панели. Инструмент настраивает сетевые параметры Windows и файл hosts.
Основные проблемы, кстати, как раз из-за файла hosts, если не будет возможности их менять, то будет много сложностей с настройкой системы.
Open Server Panel работает как фоновое приложение с управлением через системный трей.
Основное окно не появляется автоматически при запуске.
Для запуска потребуются права администратора. К примеру, в версии 5+ следует указать соответствующую галочку и перезапустить:

Ключевая особенность
При запуске, найдите иконку в трее, и можете увидеть основные элементы:

Сначала нужно будет активировать компоненты:
- Веб-сервер: Apache 2.4 или Nginx 1.25
- Язык программирования: PHP 8.2 или новее
- База данных: MySQL 8.0 или MariaDB 10.6
На старых версиях включаются модули прямо в окне настроек:

Создайте директорию для проекта:
C:\OSPanel\domains\auth.loc
Добавьте домен в панель управления. Укажите имя auth.loc и путь к созданной директории. Панель автоматически добавит запись в файл hosts и настроит виртуальный хост.
В старой версии есть ручное подключение доменов:

Под доменом подразумевается локальный сайт, как раз проект, который планируется использовать.
Откройте консоль панели через контекстное меню иконки в трее, и выполните команды:
osp on PHP-8.2
osp on MySQL-8.0
Эти команды активируют интерпретатор PHP с встроенным веб-сервером Apache и базу данных MySQL. Модули запускаются мгновенно.
Статус проверяется командой:
osp status
Зелёный индикатор напротив модуля означает успешный запуск.

Сгенерируйте корневой SSL-сертификат. Сертификат позволяет использовать защищённое соединение HTTPS для локальных доменов без предупреждений браузера. Выполните в консоли панели команду:
osp cacert init
Перезагрузите компьютер после завершения подготовки системы. Это обеспечивает применение всех сетевых настроек.
Создание структуры проекта
Перейдите в папку home внутри каталога установки. Создайте директорию для проекта, например auth.loc или auth-site. Имя проекта используйте латиницей, цифрами и дефисами.
Перейдите в каталог C:\OSPanel\home и создайте директорию проекта:
mkdir auth-site
cd auth-site
mkdir .osp
mkdir public
Каталог .osp (с точкой в начале имени) содержит конфигурацию проекта. Каталог public будет корневой директорией веб-сервера.
Конфигурация домена
Создайте файл C:\OSPanel\home\auth-site\.osp\project.ini с содержимым:
domain = auth.loc
php = PHP-8.2
public_dir = public
Параметр public_dir указывает каталог для размещения файлов сайта. Если файлы проекта находятся в корне директории, этот параметр можно опустить.
Эта конфигурация связывает домен auth.loc с проектом и указывает версию PHP. Перезапустите панель через контекстное меню → Перезапустить или выполните в консоли:
osp exit & ospanel
После перезапуска домен auth.loc автоматически разрешается в 127.0.0.1 и доступен по адресу http://auth.loc.
Настройка базы данных
По умолчанию, MySQL управляется через phpmyadmin.
Для авторизации, нужно перейти по ссылке http://127.0.0.1/openserver/phpmyadmin/ или http://127.0.0.1/phpmyadmin.
Активируйте модуль базы данных командой osp on MySQL-8.0.
Для подключения к базе данных из PHP-скрипта используйте IP-адрес: '127.0.0.1' как хост:
$host = '127.0.0.1';
$port = 3306;
$dbname = 'auth_system';
$username = 'root';
$password = '';
Создайте базу данных через phpMyAdmin.

Выполните SQL-запросы:
CREATE DATABASE auth_system CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE auth_system;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
Простой сайт с авторизацией
Нам нужно создать файлы php:
configдля параметров подключения;indexдля главной страницы;loginдля входа;logoutдля выхода;registerдля регистрации.
Создайте файл home/auth.loc/public/config.php:
<?php
session_start();
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'auth_system');
define('DB_USER', 'root');
define('DB_PASS', '');
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
} catch (PDOException $e) {
die('Ошибка подключения к базе данных');
}
session_start() инициализирует сессию PHP. Это необходимо для хранения данных между запросами (например, идентификатор авторизованного пользователя в $_SESSION['user_id']).
Константы подключения определяют параметры подключения к СУБД:
DB_HOST = '127.0.0.1'— локальный TCP/IP-адрес MySQL-сервера. Корректно для Open Server.DB_NAME = 'auth_system'— имя существующей базы данных.DB_USER = 'root'— учётная запись суперпользователя MySQL (по умолчанию в Open Server).DB_PASS = ''— пустой пароль, что соответствует настройкам Open Server по умолчанию.
Эти значения допустимы для локальной разработки. В production-среде использование root без пароля недопустимо.
$pdo = new PDO создаёт подключение через PDO. Это строка подключения:
mysql:— драйвер PDO для MySQL.host=127.0.0.1— адрес сервера.dbname=auth_system— целевая база данных.charset=utf8mb4— задаёт кодировку соединения.
Имя пользователя и пароль передаются отдельными аргументами — стандартная практика.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION гарантирует, что ошибки SQL будут выбрасываться как исключения (PDOException), а не молча игнорироваться.
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC - по умолчанию все выборки (fetch, fetchAll) возвращают ассоциативные массивы (ключи — имена столбцов), а не смешанные или индексированные.
catch...die... это обработка ошибок. При возникновении ошибки (например, неверный пароль, отсутствующая БД, недоступный сервер) выполнение прерывается с выводом обобщённого сообщения.
Для диагностики можно временно выводить $e->getMessage():
die('Ошибка БД: ' . $e->getMessage());
Создайте файл home/auth.loc/public/register.php:
<?php
require_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$password_confirm = $_POST['password_confirm'] ?? '';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error = 'Некорректный формат email';
} elseif (strlen($password) < 8) {
$error = 'Пароль должен содержать не менее 8 символов';
} elseif ($password !== $password_confirm) {
$error = 'Пароли не совпадают';
} else {
$stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
$stmt->execute([$email]);
if ($stmt->fetch()) {
$error = 'Пользователь с таким email уже существует';
} else {
$password_hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (email, password_hash) VALUES (?, ?)");
$stmt->execute([$email, $password_hash]);
$_SESSION['user_id'] = $pdo->lastInsertId();
header('Location: index.php');
exit;
}
}
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Регистрация</title>
<style>
body { font-family: Arial, sans-serif; max-width: 400px; margin: 50px auto; padding: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; }
input { width: 100%; padding: 8px; box-sizing: border-box; }
button { width: 100%; padding: 10px; background: #007bff; color: white; border: none; cursor: pointer; }
.error { color: #dc3545; margin-bottom: 15px; }
</style>
</head>
<body>
<h1>Регистрация</h1>
<?php if (isset($error)): ?>
<div class="error"><?php echo htmlspecialchars($error); ?></div>
<?php endif; ?>
<form method="post">
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="password">Пароль</label>
<input type="password" id="password" name="password" required>
</div>
<div class="form-group">
<label for="password_confirm">Подтверждение пароля</label>
<input type="password" id="password_confirm" name="password_confirm" required>
</div>
<button type="submit">Зарегистрироваться</button>
</form>
<a href="login.php" style="display: block; text-align: center; margin-top: 20px; color: #007bff; text-decoration: none;">
Уже есть аккаунт? Войти
</a>
</body>
</html>
register.php включает в себя логику обработки запроса, безопасность, взаимодействие с БД и вывод HTML.
require_once 'config.php'; - это подключение конфигурации. Подключает файл с настройками подключения к БД и запуском сессии. Гарантирует наличие переменной $pdo и активной сессии ($_SESSION).
if ($_SERVER['REQUEST_METHOD'] === 'POST') - это обработка POST-запроса. Блок выполняется только при отправке формы (метод POST). Это стандартная практика разделения логики и представления.
Далее - извлечение данных:
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$password_confirm = $_POST['password_confirm'] ?? '';
Оператор нулевого слияния (??) предотвращает Notice при отсутствии ключа. trim() удаляет пробелы по краям email — важно для корректной валидации.
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) отвечает за валидацию входных данных. Здесь используется встроенная функция PHP для проверки соответствия email RFC-стандарту.
elseif (strlen($password) < 8) отвечает за проверку длины пароля. Минимальная длина — 8 символов. Это базовое требование безопасности.
elseif ($password !== $password_confirm) является проверкой точного совпадения паролей, с учётом регистра и пробелов.
Блок кода с $stmt - это проверка уникальности email:
$stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
$stmt->execute([$email]);
if ($stmt->fetch()) {
$error = 'Пользователь с таким email уже существует';
}
Используется подготовленный запрос — защищает от SQL-инъекций. fetch() возвращает первую строку или false. Достаточно для проверки существования. Можно использовать SELECT 1 вместо SELECT id, но разница минимальна.
Регистрация нового пользователя:
$password_hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (email, password_hash) VALUES (?, ?)");
$stmt->execute([$email, $password_hash]);
$_SESSION['user_id'] = $pdo->lastInsertId();
header('Location: index.php');
exit;
Здесь выполняется SQL-запрос INSERT, вставляет данные в БД. lastInsertId() возвращает id новой записи. Устанавливается сессионный идентификатор и выполняется редирект на index.php с немедленным завершением скрипта (exit) — предотвращает повторную отправку формы.
Затем - HTML-форма.
Создайте файл home/auth.loc/public/login.php:
<?php
require_once 'config.php';
if (isset($_SESSION['user_id'])) {
header('Location: index.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password_hash'])) {
$_SESSION['user_id'] = $user['id'];
header('Location: index.php');
exit;
} else {
$error = 'Неверный email или пароль';
}
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Вход</title>
<style>
body { font-family: Arial, sans-serif; max-width: 400px; margin: 50px auto; padding: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; }
input { width: 100%; padding: 8px; box-sizing: border-box; }
button { width: 100%; padding: 10px; background: #28a745; color: white; border: none; cursor: pointer; }
.error { color: #dc3545; margin-bottom: 15px; }
</style>
</head>
<body>
<h1>Вход в систему</h1>
<?php if (isset($error)): ?>
<div class="error"><?php echo htmlspecialchars($error); ?></div>
<?php endif; ?>
<form method="post">
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="password">Пароль</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Войти</button>
</form>
<a href="register.php" style="display: block; text-align: center; margin-top: 20px; color: #007bff; text-decoration: none;">
Нет аккаунта? Регистрация
</a>
</body>
</html>
require_once 'config.php'; подключает файл с настройками подключения к БД ($pdo) и запуском сессии (session_start()). Обеспечивает доступ к сессионным данным и базе.
if (isset($_SESSION['user_id'])) проверяет уже авторизованного пользователя. Если пользователь уже вошёл в систему (в сессии есть user_id), происходит немедленный редирект на главную страницу. Это предотвращает повторный вход и улучшает UX. Использование exit после header() обязательно — оно гарантирует, что скрипт не продолжит выполнение.
if ($_SERVER['REQUEST_METHOD'] === 'POST') - обработка POST-запроса.
Затем - извлечение данных через trim(), и поиск пользователя в базе через PDO и SELECT с условием. fetch() возвращает одну строку или false. Даже если email не существует, система не раскрывает это явно — сообщение об ошибке одинаково для неверного email или пароля.
if ($user && password_verify($password, $user['password_hash'])) отвечает за верификацию пароля. Успешная проверка → установка $_SESSION['user_id'] и редирект.
Создайте файл home/auth.loc/public/index.php:
<?php
require_once 'config.php';
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$stmt = $pdo->prepare("SELECT email, created_at FROM users WHERE id = ?");
$stmt->execute([$_SESSION['user_id']]);
$user = $stmt->fetch();
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Личный кабинет</title>
<style>
body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
.user-info { background: #f8f9fa; padding: 20px; border-radius: 5px; margin-bottom: 20px; }
</style>
</head>
<body>
<h1>Личный кабинет</h1>
<div class="user-info">
<p><strong>Email:</strong> <?php echo htmlspecialchars($user['email']); ?></p>
<p><strong>Дата регистрации:</strong> <?php echo htmlspecialchars($user['created_at']); ?></p>
</div>
<form action="logout.php" method="post">
<button type="submit" style="background: #dc3545; color: white; border: none; padding: 10px 20px; cursor: pointer;">
Выйти из системы
</button>
</form>
</body>
</html>
require_once 'config.php'; подключает файл с настройками подключения к БД.
if (!isset($_SESSION['user_id'])) проверяет авторизацию. Если пользователь не авторизован (в сессии отсутствует user_id), происходит немедленный редирект на страницу входа. Это стандартная защита приватных страниц.
Далее используется подготовленный SQL-запрос с параметром id, взятым из сессии. Запрашиваются поля: email и created_at.
Далее - безопасный вывод данных и форма выхода из системы.
Создайте файл home/auth.loc/public/logout.php:
<?php
require_once 'config.php';
$_SESSION = [];
session_destroy();
header('Location: login.php');
exit;
Здесь выполняется очистка сессионных данных, когда глобальному массиву $_SESSION присваивается пустой массив. Это немедленно удаляет все сессионные переменные на стороне сервера в текущем запросе. Это рекомендуемая практика перед вызовом session_destroy(), так как гарантирует, что данные недоступны даже в рамках текущего скрипта после этой строки.
Ну и собственно session_destroy(); уничтожает сессию. Удаляет файл сессии на сервере, связанный с текущим идентификатором сессии (обычно хранится в файловой системе или в памяти). После этого старый session ID становится недействительным, и при следующем запросе без явного восстановления сессии будет создана новая.
header('Location: ...') отправляет HTTP-заголовок перенаправления на страницу входа.
exit немедленно завершает выполнение скрипта — обязательно, чтобы предотвратить дальнейшую обработку (например, вывод HTML или логику после logout).
Путь login.php — относительный. Работает корректно, если файлы находятся в одной директории.
Откройте в браузере адрес http://auth.loc/register.php для регистрации нового пользователя. После входа система перенаправит на главную страницу с отображением данных аккаунта.
Будьте внимательны - название папки в доменах будет началом ссылки. К примеру, если назвали site.test, то и ссылка будет http://site.test/register.php.
Типичные проблемы и решения
Ошибок может быть много. Здесь я постарался объединить две вариации, и объяснить как можно подробнее, но тем не менее, развернуть сервер может быть совсем не просто.
Домен не открывается в браузере
Проверьте статус модулей командой osp status. Убедитесь, что активирован модуль PHP, соответствующий версии из конфигурации проекта. Очистите кэш DNS в командной строке Windows:
ipconfig /flushdns
Ошибка подключения к базе данных
Используйте имя модуля как хост: MySQL-8.0, а не localhost. Проверьте, что модуль базы данных включён командой osp status.
Проблемы с русским текстом
Убедитесь, что файлы проекта сохранены в кодировке UTF-8 без BOM. В настройках консоли установите шрифт Consolas и кодовую страницу 65001:
chcp 65001
Конфликт с другими программами
Если панель не запускается, проверьте, не заняты ли порты 80 и 443 другими приложениями. Отключите службу «Веб-публикации» в компонентах Windows. Закройте другие локальные серверы (XAMPP, WAMP).
Советы для повседневной работы
Храните проекты внутри папки home. Такая структура позволяет панели автоматически обнаруживать проекты и управлять их конфигурацией.
Используйте разные версии PHP для разных проектов. Укажите версию в файле project.ini каждого проекта. Панель запускает несколько версий PHP одновременно без конфликтов.
Для работы с базами данных рекомендуется использовать DBeaver. Программа поддерживает все распространённые СУБД, включённые в состав панели: MySQL, MariaDB, PostgreSQL, SQLite.
Резервные копии баз данных хранятся в папке data каталога установки. Для переноса проекта на другой компьютер достаточно скопировать папку проекта из home и соответствующие данные из data.