Создание и запуск проекта Webman в ServBay
Что такое Webman?
Webman — это высокопроизводительный асинхронный PHP-фреймворк на базе Workerman, предназначенный для разработки веб-приложений с высокой нагрузкой и большим количеством одновременных соединений. В отличие от традиционных синхронных blocking-фреймворков, Webman реализует событийно-ориентированную и асинхронную модель неконкурирующего ввода-вывода, что обеспечивает отличную обработку большого числа запросов. Фреймворк предлагает лаконичный и удобный API и гибкие возможности для расширения, что идеально подходит для создания real-time приложений, API-сервисов, микросервисов и других современных решений.
Основные преимущества и особенности Webman
- Высокая производительность: Работа на Workerman, событийное и асинхронное взаимодействие позволяют обрабатывать тысячи соединений, при этом производительность намного выше стандартных синхронных решений.
- Простота использования: Ясный и интуитивный API, богатый функционал, быстрая и легкая разработка.
- Поддержка различных протоколов: Встроенная поддержка HTTP, WebSocket и других популярных протоколов приложений — удобно для создания сервисов разных типов.
- Гибкое расширение: Лёгкая интеграция новых функций благодаря пакетам Composer, плагинам и механизму middleware.
- Низкое потребление ресурсов: В отличие от связки Web-сервер + PHP-FPM, Webman работает в постоянной памяти, существенно экономя ресурсы.
- Активное сообщество: Большое количество специалистов и доступная документация.
Webman позволяет разработчикам быстро создавать надежные и масштабируемые веб-приложения и API, особенно полезные в сценариях с высокой конкуре́нтностью и минимальными задержками.
Быстрый старт: создание и запуск Webman-проекта в ServBay
В этом руководстве вы узнаете, как развернуть простой проект Webman в локальной среде ServBay. Мы рассмотрим этапы установки, покажем пример кода для роутинга и контроллеров, а также интеграцию баз данных (MySQL, PostgreSQL) и кеш-систем (Redis, Memcached), которые предоставляет ServBay.
TIP
ServBay рекомендует размещать все локальные сайты в папке /Applications/ServBay/www
— это упрощает централизованное управление и настройку проектов.
Предварительные требования
Перед началом убедитесь, что выполнены следующие условия:
- Установлен ServBay: На вашем MacOS доступна актуальная версия ServBay, которая включает всё необходимое ПО: PHP, Composer, MySQL, PostgreSQL, Redis, Memcached.
- Активированы нужные пакеты: Проверьте на панели ServBay, что установлены и запущены:
- Выбранная версия PHP (рекомендуется актуальная, например PHP 8.x)
- Composer (встроен в ServBay)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Включены требуемые PHP-расширения:
memcached
,redis
,pdo_mysql
,pdo_pgsql
. ServBay обычно включает их по умолчанию; проверить можно на странице конфигурации PHP.
- Работа с терминалом: Знакомство с терминалом macOS.
Установка Webman
Проверьте доступность Composer
Composer встроен в ServBay и готов к работе, просто откройте терминал и выполните команду:
bashcomposer --version
1Если отобразился номер версии Composer — всё готово.
Перейти в каталог сайтов ServBay
Откройте терминал и перейдите в корневую папку проектов:
bashcd /Applications/ServBay/www
1Создать Webman-проект через Composer
Воспользуйтесь командой
create-project
для установки Webman в отдельную директорию — допустим, назовём проектservbay-webman-app
:bashcomposer create-project workerman/webman servbay-webman-app
1Composer скачает Webman и все необходимые зависимости в папку
servbay-webman-app
.Войти в директорию проекта
После установки перейдите в каталог нового проекта:
bashcd servbay-webman-app
1Установить дополнительные компоненты
Для работы с базами данных и кешированием установим через Composer доп. пакеты:
illuminate/database
(ORM из Laravel),illuminate/redis
и другие. Флаг-W
(--with-dependencies
) решает возможные конфликты зависимостей и обеспечивает совместимость.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Эта команда установит ORM, клиент Redis, компонент пагинации, события и инструмент для дебага.
Создание базы данных и таблицы
Для корректной работы примера потребуется создать в MySQL и PostgreSQL базу данных и таблицу users
. По умолчанию пароль пользователя root
— password
.
Можно воспользоваться менеджерами БД (phpMyAdmin, pgAdmin — доступны с панели ServBay) или выполнить SQL через терминал.
Создать базу данных
webman_app
- MySQL:sql
CREATE DATABASE IF NOT EXISTS webman_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
1 - PostgreSQL:sql
CREATE DATABASE webman_app;
1
- MySQL:
Создать таблицу
users
в базеwebman_app
- MySQL:sql
USE webman_app; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
1
2
3
4
5
6
7 - PostgreSQL:sql
\c webman_app; -- подключение к новой базе CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
1
2
3
4
5
6
7
- MySQL:
Написание исходного кода проекта
Далее добавим логику роутинга, основные контроллеры и примеры работы с базой данных и кешем.
Настройка роутинга
Откройте файл
config/route.php
в корне проекта и добавьте следующий код:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Корневой маршрут, направляет на метод index контроллера IndexController Route::any('/', [IndexController::class, 'index']); // Маршруты для работы с кешем Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Маршруты для работы с базами данных Route::any('/mysql-add', [DatabaseController::class, 'mysqlAdd']); Route::any('/mysql', [DatabaseController::class, 'mysqlGet']); Route::any('/pgsql-add', [DatabaseController::class, 'pgsqlAdd']); Route::any('/pgsql', [DatabaseController::class, 'pgsqlGet']); // Можно добавить дополнительные маршруты...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Создать контроллеры
В папке
app/controller
создайте файлы:IndexController.php
,CacheController.php
иDatabaseController.php
, и скопируйте туда соответствующий код.app/controller/IndexController.php
: обработка главной страницы.php<?php namespace app\controller; use support\Request; use support\Response; // импорт класса Response class IndexController { /** * Пример обработки корневого запроса * @param Request $request текущий экземпляр запроса * @return Response возвращает объект Response */ public function index(Request $request): Response // явно указанный тип возвращаемого значения { // Возвращает простой текстовый ответ return response('Hello ServBay & Webman!'); // приветствие обновлено } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php
: пример использования Memcached и Redis.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // импорт класса Memcached use support\Redis; // импорт фасада Redis из Webman class CacheController { /** * Пример работы с Memcached * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Подключение к серверу Memcached; по умолчанию ServBay — 127.0.0.1:11211 $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // Сохраняем значение в кеш — срок годности 60 секунд $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // обновлённые key/value if (!$success) { return response('Failed to set Memcached key', 500); } // Читаем значение из кеша $value = $memcached->get('servbay_key'); // обновлённый key // Отправляем значение или сообщение о его отсутствии return response($value ?: 'Memcached key not found or expired'); // сообщение при отсутствии данных } /** * Пример работы с Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Через фасад Redis из Webman сохраняем значение Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // обновлённые key/value // Получаем значение из Redis $value = Redis::get('servbay_redis_key'); // обновлённый key // Отправляем значение или сообщение о его отсутствии return response($value ?: 'Redis key not found'); // сообщение при отсутствии данных } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52app/controller/DatabaseController.php
: примеры работы с MySQL и PostgreSQL.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // импорт фасада Db из Webman class DatabaseController { /** * Добавляет пользователя в базу MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Подключение к базе MySQL и вставка данных через фасад Db Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // обновлены данные 'email' => 'mysql_demo@servbay.test', // обновлена почта 'created_at' => date('Y-m-d H:i:s') // дата создания ]); return response('User added to MySQL'); // сообщение об успехе } catch (\Exception $e) { return response('Error adding user to MySQL: ' . $e->getMessage(), 500); // обработка ошибки } } /** * Получить список пользователей из MySQL * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Получение всех пользователей через фасад Db $users = Db::connection('mysql')->table('users')->get(); // Возврат списка пользователей в формате JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type явно указан } catch (\Exception $e) { return response('Error getting users from MySQL: ' . $e->getMessage(), 500); // обработка ошибки } } /** * Добавляет пользователя в PostgreSQL * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Вставка данных через фасад Db для PostgreSQL Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // обновлены данные 'email' => 'pgsql_demo@servbay.test', // обновлена почта 'created_at' => date('Y-m-d H:i:s') // дата создания ]); return response('User added to PostgreSQL'); // сообщение об успехе } catch (\Exception $e) { return response('Error adding user to PostgreSQL: ' . $e->getMessage(), 500); // обработка ошибки } } /** * Получить список пользователей из PostgreSQL * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Получение всех пользователей через фасад Db $users = Db::connection('pgsql')->table('users')->get(); // Возврат списка пользователей в формате JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type явно указан } catch (\Exception $e) { return response('Error getting users from PostgreSQL: ' . $e->getMessage(), 500); // обработка ошибки } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Настроить соединение с базами данных
Откройте файл
config/database.php
и задайте параметры для MySQL и PostgreSQL. В ServBay адрес базы по умолчанию —127.0.0.1
, порты:3306
(MySQL),5432
(PostgreSQL), логин —root
, пароль —password
.php<?php /** * Конфигурация базы данных */ return [ // Соединение по умолчанию 'default' => 'mysql', // Конфигурации подключений 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // MySQL — адрес и порт по умолчанию в ServBay 'host' => '127.0.0.1', 'port' => 3306, // Имя базы, которую вы создали 'database' => 'webman_app', // Логин MySQL 'username' => 'root', // Пароль MySQL 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // Адрес и порт PostgreSQL 'host' => '127.0.0.1', 'port' => 5432, // Имя базы, которую вы создали 'database' => 'webman_app', // Логин PostgreSQL 'username' => 'root', // Пароль PostgreSQL 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // можно использовать require, verify-ca, verify-full ], // Здесь можно добавить другие соединения... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46Внимание: В реальной среде не используйте стандартный пароль, а также избегайте хранения конфиденциальных данных в коде.
Запуск Webman-проекта
Webman запускается с помощью скрипта start.php
, который стартует процессы Workerman. В отличие от классической модели (Nginx/Apache + PHP-FPM), Webman работает как резидентное асинхронное приложение.
Находясь в корневой директории проекта (/Applications/ServBay/www/servbay-webman-app
), выполните команду запуска:
bash
php start.php start
1
После этого появится информация о запуске Webman, по умолчанию он слушает HTTP-соединения на 127.0.0.1:8787
.
- Важно: Команда
php
использует PHP, установленный в ServBay — терминал автоматически настроен для работы с нужной версией. - Для запуска Webman в фоновом режиме используйте:
php start.php start -d
. - Для остановки сервиса:
php start.php stop
. - Для перезапуска:
php start.php restart
. - Для плавного перезапуска (без прерывания текущих соединений):
php start.php reload
.
Тестирование проекта
После успешного запуска Webman на 127.0.0.1:8787
проверьте работу через браузер, используя следующие адреса:
http://localhost:8787/
— отображается страница с текстомHello ServBay & Webman!
http://localhost:8787/memcached
— выводится сообщениеHello Memcached from ServBay!
; это значит, что Webman корректно работает с Memcached через ServBay.http://localhost:8787/redis
— выводится сообщениеHello Redis from ServBay!
; это значит, что Webman корректно работает с Redis через ServBay.http://localhost:8787/mysql-add
— на странице выводитсяUser added to MySQL
; в базу данных MySQL добавлена запись.http://localhost:8787/mysql
— вы получите JSON со списком пользователей из MySQL.http://localhost:8787/pgsql-add
— выводитсяUser added to PostgreSQL
; происходит добавление записи в PostgreSQL.http://localhost:8787/pgsql
— вы получите JSON со списком пользователей из PostgreSQL.
Если при работе с этими маршрутами возникают ошибки, проверьте сообщения в терминале Webman, а также убедитесь, что пакеты MySQL, PostgreSQL, Redis, Memcached и нужные PHP-расширения в ServBay активны.
Часто задаваемые вопросы (FAQ)
- В: Команда
php start.php start
не найдена?- О: Проверьте, что вы находитесь в каталоге
servbay-webman-app
и что PHP из ServBay добавлен в PATH (обычно ServBay это делает автоматически).
- О: Проверьте, что вы находитесь в каталоге
- В: Нет подключения к
localhost:8787
?- О: Проверьте сообщения терминала при запуске Webman, убедитесь, что порт 8787 не занят другим процессом. Если нужно, смените порт в файле конфигурации (например, в
config/server.php
).
- О: Проверьте сообщения терминала при запуске Webman, убедитесь, что порт 8787 не занят другим процессом. Если нужно, смените порт в файле конфигурации (например, в
- В: Не удается подключиться к базе данных?
- О: Убедитесь, что пакеты MySQL и PostgreSQL в ServBay запущены. Проверьте параметры подключения в
config/database.php
(хост, порт, имя базы, логин, пароль) и что создана базаwebman_app
и таблицаusers
.
- О: Убедитесь, что пакеты MySQL и PostgreSQL в ServBay запущены. Проверьте параметры подключения в
- В: Ошибка подключения к Memcached или Redis?
- О: Проверьте, что пакеты Memcached и Redis в ServBay активны. Проверьте настройки подключения в
app/controller/CacheController.php
(стандартные порты —127.0.0.1:11211
и127.0.0.1:6379
). PHP-расширенияmemcached
иredis
должны быть включены.
- О: Проверьте, что пакеты Memcached и Redis в ServBay активны. Проверьте настройки подключения в
Итоги
Выполнив описанные шаги, вы сможете создать, настроить и запустить базовый проект Webman в локальной среде разработки ServBay. Вы освоите эффективную работу с сервисами ServBay, быстро развернете Webman для профессиональной разработки, а также интегрируете БД и кеширование. Уникальное сочетание высокой производительности Webman и удобства ServBay делает разработку асинхронных PHP-приложений легкой и эффективной. Пусть это руководство поможет вам создавать современные веб-проекты на основе ServBay и Webman!