Створення та запуск Webman проекту у ServBay
Що таке Webman?
Webman — це високопродуктивний асинхронний веб-фреймворк PHP на основі Workerman, спеціально розроблений для створення веб-додатків з великою кількістю одночасних підключень. На відміну від традиційних блокуючих фреймворків, Webman реалізує модель подій та асинхронного неблокуючого I/O, що дозволяє обробляти велику кількість одночасних запитів з мінімальною затримкою. Webman пропонує інтуїтивний API та гнучку систему розширень, ідеально підходить для реалізації real-time сервісів, API, мікросервісів та інших сучасних web-рішень.
Основні переваги та особливості Webman
- Висока продуктивність: Заснований на Workerman, використовує подієву модель та неблокуючий I/O для обробки численних одночасних підключень; істотно перевершує традиційні фреймворки за швидкістю.
- Простота використання: Чистий, зручний API, широкий набір функціоналу — розробник швидко стартує і створює нові додатки.
- Підтримка різних протоколів: Вбудована підтримка HTTP, WebSocket та інших поширених протоколів; легко будувати сервіси різного типу.
- Гнучке розширення: Легко додавати нові можливості через Composer-пакети, плагіни та middleware.
- Мінімальне споживання ресурсів: На відміну від традиційної схеми Web-сервер + PHP-FPM, Webman працює у пам’яті та споживає мало ресурсів.
- Потужна ком’юніті: Активна спільнота розробників та велика база корисної документації.
Webman допомагає швидко створювати продуктивні, стабільні web-додатки та API, особливо коли потрібно обробляти багато одночасних запитів із низькою затримкою.
Створення та запуск простого Webman проекту в ServBay
У цьому гайді покроково показано, як у локальному середовищі ServBay створити й запустити простий Webman-проект: встановлення, базовий routing, створення контролера, підключення до бази даних (MySQL, PostgreSQL) і кешу (Redis, Memcached).
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
ServBay постачається із Composer і вже додає його до PATH. Перевірте у терміналі:
bashcomposer --version
1Якщо відображається версія Composer — готово.
Перейдіть до каталогу сайтів ServBay
Відкрийте термінал та перейдіть до рекомендованого директорію:
bashcd /Applications/ServBay/www
1Створіть Webman проект через Composer
Використайте команду
create-project
Composer для встановлення Webman. Назвемо проектservbay-webman-app
:bashcomposer create-project workerman/webman servbay-webman-app
1Composer завантажить Webman та потрібні залежності у відповідну папку.
Перейдіть до каталогу проекту
Після інсталяції зайдіть у нову директорію:
bashcd servbay-webman-app
1Встановіть необхідні компоненти
Для роботи з БД та кешем додайте потрібні пакети через Composer. Webman часто використовує
illuminate/database
,illuminate/redis
і інші. Параметр-W
(--with-dependencies
) допоможе уникнути конфліктів.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Це поставить ORM для БД, Redis-клієнт, пагінацію, диспетчер подій та інструмент для дебагу.
Створення бази даних і таблиці
Для коректної роботи прикладу необхідно створити в ServBay MySQL та PostgreSQL базу webman_app
і таблицю 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
всередині БД- 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:
Написання коду Web-проекту
Тепер додамо код для routing, контролера та логіки роботи з базою даних і кешем.
Налаштування роутів
Відкрийте файл
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 на 127.0.0.1:11211 (ServBay) $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('Не вдалося записати ключ у Memcached', 500); } // Читаємо елемент кешу $value = $memcached->get('servbay_key'); // Оновлено key // Повертаємо значення return response($value ?: 'Ключ Memcached не знайдено або закінчився термін дії'); // Пояснення для відсутнього ключа } /** * Демонстрація роботи Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Через Redis facade зберігаємо ключ Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Оновлено key, value // Читаємо значення із Redis $value = Redis::get('servbay_redis_key'); // Оновлено key // Повертаємо значення return response($value ?: 'Ключ Redis не знайдено'); // Пояснення для відсутнього ключа } }
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 { // Вставка даних через Db facade у 'mysql' Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Приклад даних 'email' => 'mysql_demo@servbay.test', // Приклад email 'created_at' => date('Y-m-d H:i:s') // Дата створення ]); return response('Користувача додано до MySQL'); // Оновлено повідомлення } catch (\Exception $e) { return response('Помилка при додаванні користувача до MySQL: ' . $e->getMessage(), 500); // Обробка помилок } } /** * Витягує список користувачів із MySQL * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Отримуємо всіх користувачів з 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('Помилка отримання користувачів із MySQL: ' . $e->getMessage(), 500); // Обробка помилок } } /** * Додає користувача у PostgreSQL * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Вставка даних у 'pgsql' 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('Користувача додано до PostgreSQL'); } catch (\Exception $e) { return response('Помилка при додаванні користувача до PostgreSQL: ' . $e->getMessage(), 500); } } /** * Витягує список користувачів із PostgreSQL * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Отримуємо всіх користувачів з PostgreSQL $users = Db::connection('pgsql')->table('users')->get(); // Повертаємо список у JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); } catch (\Exception $e) { return response('Помилка отримання користувачів із 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 (хост —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 у ServBay '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. ServBay автоматично прописує PATH. - Щоб запустити Webman у фоні — використайте параметр
-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
— побачитеКористувача додано до MySQL
. Додавання запису у таблицю.http://localhost:8787/mysql
— JSON c користувачами з таблиці MySQL.http://localhost:8787/pgsql-add
— побачитеКористувача додано до PostgreSQL
.http://localhost:8787/pgsql
— JSON з користувачами з таблиці PostgreSQL.
Якщо виникнуть проблеми — перевірте чи є помилки у терміналі Webman, чи запущені пакети MySQL, PostgreSQL, Redis, Memcached, і чи активні розширення PHP.
Поширені питання (FAQ)
- Q: Команда
php start.php start
не знайдена?- A: Переконайтесь, що ви у каталозі
servbay-webman-app
. Також перевірте, чи PHP із ServBay додано у PATH (зазвичай ServBay робить це самостійно).
- A: Переконайтесь, що ви у каталозі
- Q: Запит до
localhost:8787
не проходить?- A: Перевірте термінал — чи немає помилок. Переконайтесь, що порт
8787
відкритий і не зайнятий іншим додатком. За необхідності — змініть порт у налаштуваннях Webman (config/server.php
).
- A: Перевірте термінал — чи немає помилок. Переконайтесь, що порт
- Q: З’єднання з БД не встановлюється?
- A: Переконайтесь, що MySQL і PostgreSQL активні у ServBay. Перевірте дані для підключення у
config/database.php
(хост, порт, БД, користувач, пароль). Переконайтесь, що створені база та таблиця.
- A: Переконайтесь, що MySQL і PostgreSQL активні у ServBay. Перевірте дані для підключення у
- Q: Не працює підключення Memcached чи Redis?
- A: Переконайтесь, що пакети Memcached і Redis активні у ServBay. Перевірте адресу та порт у контролері кешу (
app/controller/CacheController.php
). Переконайтесь, що розширенняmemcached
таredis
для PHP активні.
- A: Переконайтесь, що пакети Memcached і Redis активні у ServBay. Перевірте адресу та порт у контролері кешу (
Підсумок
Виконавши ці кроки, ви створили, налаштували і запустили базовий Webman-проект у локальному середовищі ServBay. Ви навчилися використовувати ServBay як комплексний майданчик для роботи з Webman, робити інтеграцію з базою даних і кеш-сервісами. Потужність Webman у поєднанні з простотою ServBay — ідеальна комбінація для розробки сучасних асинхронних PHP-додатків. Сподіваємось, цей гайд допоможе вам швидко і якісно створювати свої web-рішення!