Создание и запуск проекта Webman в ServBay
Что такое Webman?
Webman — это высокопроизводительный асинхронный веб-фреймворк на PHP, построенный на основе Workerman и предназначенный для создания масштабируемых и эффективных веб-приложений. В отличие от традиционных синхронных фреймворков с блокирующими операциями, Webman использует событийно-ориентированную и асинхронную модель I/O, благодаря чему прекрасно справляется с большим количеством одновременных запросов. Webman предлагает простой и удобный API, гибкую систему расширений — идеален для разработки realtime-приложений, API-сервисов, микросервисов и прочих систем.
Основные преимущества и возможности Webman
- Высокая производительность: использует Workerman, события и асинхронный I/O для обработки огромного количества одновременных соединений — значительно опережая классические фреймворки по пропускной способности.
- Простота освоения: интуитивно понятный, лаконичный API и обилие встроенных функций ускоряют старт разработки.
- Поддержка множества протоколов: из коробки поддерживает HTTP, WebSocket и другие популярные протоколы, что удобно для создания сервисов разного типа.
- Гибкое расширение: легко расширяется через Composer-пакеты, плагины и промежуточное ПО.
- Экономия ресурсов: работает как резидентное приложение в памяти — требует меньше ресурсов по сравнению с традиционной связкой веб-сервер + PHP-FPM.
- Мощное коммьюнити: активное сообщество разработчиков, обширная документация.
С помощью Webman разработчики могут быстро создавать высокопроизводительные, отказоустойчивые веб-приложения и API, идеально подходящие для сценариев с высокой нагрузкой и минимальными задержками.
Создание и запуск простого проекта Webman в ServBay
В этой инструкции подробно разобрано, как в локальной среде разработки ServBay создать и запустить веб-проект на Webman. Вы узнаете, как установить Webman, написать основные маршруты и контроллеры, подключить базы данных (MySQL, PostgreSQL) и кэш (Redis, Memcached), предоставляемые ServBay.
TIP
Рекомендуется хранить все локальные сайты и проекты в директории /Applications/ServBay/www
. Это позволяет ServBay автоматически и удобно управлять сайтами (в прошлом называлось "хостами").
Предварительные требования
Перед началом убедитесь, что выполнены следующие условия:
- Установлен ServBay: Вы успешно установили ServBay на macOS. Эта платформа предоставляет полный стек для локальной разработки — PHP, Composer, MySQL, PostgreSQL, Redis, Memcached и другие необходимые компоненты уже включены.
- Запущены необходимые пакеты: Через панель управления ServBay убедитесь, что установлены и работают следующие компоненты:
- Выбранная версия PHP (рекомендуется использовать актуальную, например, PHP 8.x)
- Composer (идет в комплекте с ServBay)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Проверьте, что для вашей версии PHP активированы необходимые расширения:
memcached
,redis
,pdo_mysql
,pdo_pgsql
и пр. Обычно эти расширения включены по умолчанию, но это можно уточнить в настройках PHP через интерфейс ServBay.
- Доступ к терминалу: Вы умеете пользоваться терминалом в macOS.
Установка Webman
Проверьте доступность Composer
В комплекте с ServBay уже установлен Composer и настроен для прямого использования в терминале. Для проверки введите команду:
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. Webman обычно использует компонентов
illuminate/database
(Eloquent ORM от Laravel),illuminate/redis
и др. Флаг-W
(--with-dependencies
) нужен для корректного разрешения и установки зависимостей.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Эта команда добавит ORM, Redis-клиент, пагинацию, менеджер событий и отладчик VarDumper.
Создание базы данных и таблицы
Прежде чем писать код, создайте БД и таблицу users
в MySQL и PostgreSQL. По умолчанию в ServBay для пользователя root
установлен пароль password
.
Воспользуйтесь инструментами управления БД от ServBay (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 Facade от 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); // Ключ и значение обновлены if (!$success) { return response('Failed to set Memcached key', 500); } // Получение значения из кэша $value = $memcached->get('servbay_key'); // Ключ // Возвращаем значение return response($value ?: 'Memcached key not found or expired'); // Уточнение для случая неудачи } /** * Пример работы с Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Сохраняем значение с помощью Redis Facade Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Ключ и значение обновлены // Получаем значение с помощью Redis Facade $value = Redis::get('servbay_redis_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 Facade Webman class DatabaseController { /** * Добавляет пользователя в БД MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Добавить запись в таблицу users MySQL через Db Facade Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Примерные данные 'email' => '[email protected]', // Пример email 'created_at' => date('Y-m-d H:i:s') // Добавлено created_at ]); 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 { // Получаем все записи из таблицы users MySQL $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 { // Добавить запись в таблицу users PostgreSQL через Db Facade Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // Примерные данные 'email' => '[email protected]', // Пример email 'created_at' => date('Y-m-d H:i:s') // Добавлено created_at ]); 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 { // Получаем все записи из таблицы users PostgreSQL $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 в ServBay '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 выполняется как резидентное асинхронное приложение.
Чтобы запустить проект Webman, находясь в директории /Applications/ServBay/www/servbay-webman-app
, выполните:
bash
php start.php start
1
После этого в терминале появится информация о запуске Webman. По умолчанию HTTP-сервер слушает порт 127.0.0.1:8787
.
- Примечание: Команда
php
использует PHP, установленный ServBay. Платформа автоматически настроит среду, чтобы в командной строке была доступна эта версия PHP. - Для фона запустите с параметром
-d
:php start.php start -d
. - Для остановки сервиса:
php start.php stop
. - Для перезапуска:
php start.php restart
. - Для мягкой перезагрузки (без обрыва соединений):
php start.php reload
.
Тестирование проекта
После запуска Webman и прослушивания 127.0.0.1:8787
— проверьте работу проекта, открыв в браузере следующие URL:
http://localhost:8787/
— должен появиться текстHello ServBay & Webman!
.http://localhost:8787/memcached
— результатом будетHello Memcached from ServBay!
— значит кэш Memcached успешно работает через Webman.http://localhost:8787/redis
— увидитеHello Redis from ServBay!
— соединение с Redis проверено.http://localhost:8787/mysql-add
— ожидайтеUser added to MySQL
— происходит добавление записи в таблицуusers
MySQL.http://localhost:8787/mysql
— в браузере отобразится список пользователей из MySQL (users
) в формате JSON.http://localhost:8787/pgsql-add
— сообщениеUser added to PostgreSQL
подтвердит вставку в таблицуusers
PostgreSQL.http://localhost:8787/pgsql
— получите JSON-список пользователей изusers
PostgreSQL.
При возникновении ошибок проверьте вывод терминала с процессом Webman на наличие сообщений об ошибках, а также убедитесь, что MySQL, PostgreSQL, Redis, Memcached запущены, а нужные PHP-расширения активны.
Часто задаваемые вопросы (FAQ)
- В: Получаю ошибку "php start.php start" не найден?
- О: Проверьте, что вы находитесь в папке проекта
servbay-webman-app
(cd servbay-webman-app
). Проверьте также, добавлен ли путь к PHP-интерпретатору ServBay в PATH — как правило, это происходит автоматически.
- О: Проверьте, что вы находитесь в папке проекта
- В: Не удается подключиться к
localhost:8787
?- О: Проверьте вывод команды
php start.php start
— нет ли ошибок. Убедитесь, что порт8787
не занят другим процессом. При необходимости смените порт в настройках Webman (например, файлconfig/server.php
).
- О: Проверьте вывод команды
- В: Не получается подключиться к базе данных?
- О: Проверьте, что MySQL и PostgreSQL запущены. Проверьте параметры подключения в
config/database.php
: хост, порт, БД, логин, пароль (по умолчанию userroot
, passwordpassword
). Убедитесь, что базаwebman_app
и таблицаusers
существуют.
- О: Проверьте, что MySQL и PostgreSQL запущены. Проверьте параметры подключения в
- В: Не работает Memcached или Redis?
- О: Убедитесь, что эти сервисы запущены в ServBay. Проверьте адреса и порты в контроллере (
app/controller/CacheController.php
), по умолчанию это127.0.0.1:11211
(Memcached) и127.0.0.1:6379
(Redis). Проверьте, что установлены и активированы расширенияmemcached
иredis
для PHP.
- О: Убедитесь, что эти сервисы запущены в ServBay. Проверьте адреса и порты в контроллере (
Заключение
Следуя этим шагам, вы сможете создать, настроить и запустить базовый проект Webman в локальной среде ServBay. Вы освоите эффективное развертывание Webman на базе сервиса ServBay и его интеграцию с базой данных и кэшем. Высокая производительность Webman в сочетании с удобством платформы ServBay — отличное решение для быстрой разработки современных асинхронных PHP-приложений. Пусть это руководство поможет вам эффективнее строить современные веб-сервисы с использованием ServBay и Webman!