Створення й запуск проєкту Webman у ServBay
Що таке Webman?
Webman — це високопродуктивний асинхронний PHP-фреймворк для веб-розробки, побудований на основі Workerman. Він створений для реалізації масштабованих веб-додатків з великою пропускною здатністю та низькою затримкою. На відміну від традиційних синхронних блокуючих фреймворків, Webman використовує подієво-орієнтовану модель асинхронного неблокуючого вводу/виводу, що забезпечує відмінну роботу при великій кількості одночасних запитів. Webman пропонує інтуїтивний API й гнучкий механізм розширення, чудово підходить для реального часу, API-сервісів, мікросервісів тощо.
Основні можливості та переваги Webman
- Висока продуктивність: На базі Workerman, з подієвою моделлю асинхронного IO, обробляє тисячі з’єднань одночасно та перевершує традиційні синхронні фреймворки за пропускною спроможністю.
- Простота використання: Продуманий і зрозумілий API, великий набір можливостей — розробка проєкту значно швидша й легша.
- Підтримка кількох протоколів: Вбудована підтримка найбільш популярних протоколів прикладного рівня: HTTP, WebSocket тощо.
- Гнучкі розширення: Легко інтегруються пакети Composer, плагіни та middleware.
- Мінімальний споживання ресурсів: Як постійно працюючий застосунок у пам’яті, Webman використовує менше ресурсів в порівнянні з класичною схемою Web-сервер + PHP-FPM.
- Сильна підтримка спільноти: Активна спільнота розробників та відмінна документація.
Webman дозволяє швидко створювати високопродуктивні й надійні web-додатки та API, особливо в умовах великих навантажень і низьких затримок.
Створення і запуск простого проєкту Webman у ServBay
У цьому посібнику ми деталізуємо процес створення й запуску простого веб-проєкту на Webman у локальному середовищі розробки ServBay. Ви дізнаєтеся, як встановити Webman, написати базові роути й контролери, а також інтегрувати можливості баз даних (MySQL, PostgreSQL) та кешування (Redis, Memcached), які надає ServBay.
TIP
ServBay рекомендує розміщувати всі локальні сайти у каталозі /Applications/ServBay/www
— це спрощує централізоване керування, наприклад для конфігурації локальних сайтів (раніше — «хости»).
Необхідні передумови
Перед початком роботи переконайтеся, що підготували таке:
- Встановлено ServBay: У вас вже встановлений 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 вже попередньо встановлений і готовий до використання з терміналу. Перевірте наявність Composer:
bashcomposer --version
1Якщо відобразиться номер версії Composer — все налаштовано.
Перехід до каталогу сайтів ServBay
Відкрийте термінал і перейдіть до рекомендованої директорії для сайтів 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Встановлення необхідних компонентів
Щоб використовувати базу даних і кеш, знадобляться додаткові пакети. Зазвичай це
illuminate/database
(від 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. За замовчуванням для користувача root
у ServBay пароль — password
.
Використовуйте інструменти для управління БД, які надає ServBay (phpMyAdmin, pgAdmin через панель керування) або звичний термінал, щоб виконати ці 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; // Визначити маршрут для кореня, веде до IndexController::index 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); // Оновлений ключ і значення 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 через фасад Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Оновлені ключ і значення // Дістати значення з Redis $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 від Webman class DatabaseController { /** * Додати користувача в MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Підключення до MySQL і вставка даних 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 { // Отримати всіх користувачів з MySQL $users = Db::connection('mysql')->table('users')->get(); // Повернути список у форматі JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); } 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 { // Вставка даних у PostgreSQL Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', 'email' => '[email protected]', '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 { $users = Db::connection('pgsql')->table('users')->get(); return response(json_encode($users), 200, ['Content-Type' => 'application/json']); } 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
Налаштування підключення до БД
У файлі
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 '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 запускається у вигляді постійного процесу Workerman за допомогою скрипта start.php
. На відміну від класичної схеми через Nginx/Apache + PHP-FPM, Webman — асинхронний застосунок, який постійно працює у пам’яті.
У кореневій папці проєкту (/Applications/ServBay/www/servbay-webman-app
) виконайте:
bash
php start.php start
1
Після цього у терміналі з’явиться інформація про запуск, а HTTP-сервер почне слухати 127.0.0.1:8787
.
- Зверніть увагу:
php
тут — це версія PHP з середовища ServBay. ServBay автоматично налаштовує ваш PATH. - Для запуску у фоновому режимі використовуйте прапорець
-d
: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!» — Memcached працює через Webman.http://localhost:8787/redis
: має з’явитись «Hello Redis from ServBay!» — Webman підключений до Redis.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 у терміналі, переконайтеся, що всі потрібні сервіси ServBay (MySQL, PostgreSQL, Redis, Memcached) працюють і розширення PHP активовано.
Поширені питання (FAQ)
- Q: Команда
php start.php start
недоступна?- A: Перевірте, що ви у каталозі
servbay-webman-app
. Також впевніться, що ServBay записав шлях до своєї версії PHP у PATH (зазвичай це робиться автоматично).
- A: Перевірте, що ви у каталозі
- Q: Не відкривається
localhost:8787
?- A: Перегляньте журнал виконання
php start.php start
у терміналі — чи є помилки. Впевніться, що порт8787
не зайнятий. За потребою, змініть порт у конфігурації Webman (наприклад, у файліconfig/server.php
).
- A: Перегляньте журнал виконання
- Q: Помилка підключення до бази даних?
- A: Переконайтеся, що сервіси MySQL і PostgreSQL активні в ServBay. Перевірте параметри у
config/database.php
(хост, порт, база, користувач, пароль), зіставивши їх із налаштуваннями ServBay (root
/password
за замовчуванням). Переконайтесь, що ви створили БДwebman_app
і таблицюusers
.
- A: Переконайтеся, що сервіси MySQL і PostgreSQL активні в ServBay. Перевірте параметри у
- Q: Проблеми підключення до Memcached або Redis?
- A: Впевніться, що Memcached та Redis працюють у ServBay. Перевірте адресу та порт у файлі
app/controller/CacheController.php
(типово —127.0.0.1:11211
і127.0.0.1:6379
). Також перевірте, що у вашій версії PHP увімкнено розширенняmemcached
іredis
.
- A: Впевніться, що Memcached та Redis працюють у ServBay. Перевірте адресу та порт у файлі
Підсумок
Ви щойно створили, налаштували й запустили базовий проєкт на Webman у локальному середовищі ServBay. Ви навчилися використовувати комплексний сервіс ServBay для швидкого старту Webman, інтеграції баз даних і кешування. Поєднання високої продуктивності Webman і простоти ServBay забезпечує потужну платформу для асинхронної PHP-розробки. Бажаємо вам вдалих проєктів на базі ServBay і Webman!