Создание и запуск проекта 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 --version1Если отобразился номер версии Composer — всё готово.
Перейти в каталог сайтов ServBay
Откройте терминал и перейдите в корневую папку проектов:
bashcd /Applications/ServBay/www1Создать Webman-проект через Composer
Воспользуйтесь командой
create-projectдля установки Webman в отдельную директорию — допустим, назовём проектservbay-webman-app:bashcomposer create-project workerman/webman servbay-webman-app1Composer скачает Webman и все необходимые зависимости в папку
servbay-webman-app.Войти в директорию проекта
После установки перейдите в каталог нового проекта:
bashcd servbay-webman-app1Установить дополнительные компоненты
Для работы с базами данных и кешированием установим через Composer доп. пакеты:
illuminate/database(ORM из Laravel),illuminate/redisи другие. Флаг-W(--with-dependencies) решает возможные конфликты зависимостей и обеспечивает совместимость.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper1Эта команда установит 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 start1
После этого появится информация о запуске 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!
