Створення та запуск проекту Zend Framework (Laminas) у ServBay
Огляд
Zend Framework (тепер частина Laminas Project) — це потужний open-source PHP-фреймворк, що надає велику кількість якісних об’єктно-орієнтованих компонентів для розробки сучасних веб-додатків і сервісів. Відомий своєю гнучкістю, модульністю й високою продуктивністю, він ідеально підходить як для простих сайтів, так і для складних корпоративних проектів.
ServBay — це локальне середовище веб-розробки, розроблене спеціально для macOS. Воно об’єднує PHP, різні веб-сервери (Caddy або Nginx), бази даних (MySQL, PostgreSQL, MongoDB), сервіси кешування (Redis, Memcached) та інші інструменти розробника. ServBay дає змогу швидко налаштовувати й керувати цими пакетами, спрощуючи запуск і локальне тестування проектів PHP-фреймворків.
У цьому документі ви дізнаєтесь, як створити і запустити проект на Zend Framework (Laminas) у середовищі ServBay та інтегрувати доступні сервіси баз даних і кешування.
Передумови
Перед початком роботи переконайтеся, що виконані такі умови:
- Встановлений ServBay: ServBay успішно встановлено та запущено на вашій системі macOS. Якщо ще ні — завітайте на офіційний сайт ServBay для завантаження та інструкцій.
- Потрібні пакети: У ServBay увімкнено та налаштовано необхідні компоненти:
- Не менше однієї версії PHP (рекомендується PHP 8.x або новіше, оскільки сучасний Laminas потребує останніх версій).
- Веб-сервер (Caddy або Nginx).
- Composer (як правило, вже входить до ServBay).
- Обрані сервіси баз даних (наприклад, MySQL, PostgreSQL) і сервіси кешування (Memcached, Redis). Запустити їх можна з панелі управління ServBay.
Створення проекту Zend Framework
Рекомендується зберігати всі сайт-проекти в папці /Applications/ServBay/www
— це полегшує керування та автоналаштування сайтів у ServBay.
Перейдіть до кореневої директорії сайтів
Відкрийте термінал і перейдіть до вказаної директорії:
bashcd /Applications/ServBay/www
1Створіть проект через Composer
Composer вже встановлений у складі ServBay. Для створення нового Zend Framework (Laminas skeleton application) проекту скористайтеся командою:
bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1Це завантажить каркас додатку Zend Framework (Laminas) у каталог
servbay-zend-app
та встановить усі залежності.Перейдіть у директорію проекту
Перейдіть до створеного проекту:
bashcd servbay-zend-app
1
Налаштування веб-сервера
Щоб отримати доступ до вашого проекту через браузер, потрібно налаштувати сайт у ServBay.
- Відкрийте панель ServBay: Запустіть програму ServBay.
- Перейдіть у розділ сайтів: В меню ServBay знайдіть і натисніть вкладку Сайти (Websites).
- Додайте новий сайт: Клацніть кнопку
+
у нижньому лівому куті для створення нової конфігурації сайту. - Заповніть дані сайту:
- Name (Назва): Введіть описову назву, наприклад
My Zend Dev Site
. - Domain (Домен): Задайте домен для проекту. Щоб уникнути конфліктів із реальними доменами, радимо використати закінчення
.local
або.test
, наприкладservbay-zend-test.local
. ServBay автоматично налаштує локальний DNS. - Website Type (Тип сайту): Виберіть
PHP
. - PHP Version (Версія PHP): Виберіть відповідну версію PHP (наприклад,
8.3
), переконайтесь що вона встановлена і активна у ServBay. - Document Root (Корінь сайту): Файл входу Zend Framework (
index.php
) розташований у папціpublic
вашого проекту. Тому вкажіть шлях/Applications/ServBay/www/servbay-zend-app/public
.
- Name (Назва): Введіть описову назву, наприклад
- Збережіть і перезавантажте: Натисніть Зберегти (Save). ServBay запропонує застосувати зміни — підтвердьте і дочекайтесь перезапуску веб-сервера, після чого сайт стане доступний.
Детальніше про налаштування сайту читайте у розділі Додавання першого сайту документації ServBay.
Базовий приклад "Hello ServBay!"
Налаштуємо ваш проект так, щоб при переході на головну сторінку (/
) у браузері з’являлося повідомлення "Hello ServBay!".
Налаштування роута і контролера (module.config.php)
Відредагуйте файл
module/Application/config/module.config.php
, додайте чи переконайтесь у наявності такої конфігурації маршрутизації і контролерів:php<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], // ... інші налаштування маршрутів ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], ], // ... інші налаштування ];
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Примітка: це лише частина файлу module.config.php — переконайтеся, що ці масиви інтегровані у поточну структуру, а маршрут
'home'
та фабрика дляIndexController
наявні.Створення або редагування контролера (IndexController.php)
Створіть або відредагуйте файл
module/Application/src/Controller/IndexController.php
так, щоб методindexAction
повертав ViewModel із вашим текстом:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * Дія за замовчуванням для відображення привітальної сторінки. */ public function indexAction() { // Повертає ViewModel і передає змінну 'message' у шаблон return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... інші action-методи }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Створення/редагування шаблону (index.phtml)
Створіть або відредагуйте файл
module/Application/view/application/index/index.phtml
. Він просто виведе змінну message, яку передає контролер:php<h1><?php echo $this->message; ?></h1>
1Тут використовується
$this->message
як View Helper для передачі даних із контролера у вигляд.
Перевірка роботи сайту
Відкрийте браузер і перейдіть на вказаний при налаштуванні домен, наприклад: https://servbay-zend-test.local
.
Якщо все підключено вірно, ви побачите "Hello ServBay!" — ваш проект успішно працює під управлінням ServBay.
Приклади інтеграції баз даних та кеш-сервісів
ServBay підтримує різні сервіси баз даних і кешування. Далі наведено приклади підключення і використання Memcached, Redis, MySQL та PostgreSQL у Zend Framework.
Важливо: ці приклади — окремі демо. На практиці для кожного проекту обирайте відповідні сервіси й використовуйте DI (ін’єкцію залежностей) для організації доступу. Перед запуском переконайтесь, що у ServBay увімкнено потрібні служби (MySQL, PostgreSQL, Memcached, Redis).
Приклад роботи з БД — створення таблиці
Почнемо з роботи з базою даних через Laminas DB-компонент: створимо просту таблицю (без використання міграцій).
Встановіть компонент Laminas DB
У корені проекту виконайте:
bashcomposer require laminas/laminas-db
1Створіть базу даних вручну
Створіть базу даних
servbay_zend_app
через інтерфейс керування у ServBay (наприклад, phpMyAdmin, pgAdmin, MongoDB Compass тощо). Для MySQL/MariaDB логін —root
, пароль —password
(за замовчуванням). У PostgreSQL — такожroot
/password
.Скрипт для створення таблиці (приклад)
Створіть файл, наприклад,
create_users_table.php
з наступним вмістом:php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // Приклад для MySQL або MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // або 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // Пароль за замовчуванням ServBay 'hostname' => '127.0.0.1', // 'port' => 3306, // MySQL порт // 'port' => 5432, // PostgreSQL порт ]); $sql = new Sql($adapter); // SQL для створення таблиці users $create = $sql->createTable('users') ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Integer('id', false, null, ['AUTO_INCREMENT' => true])) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('name', 255)) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('email', 255, ['UNIQUE' => true])) ->addConstraint(new \Laminas\Db\Sql\Ddl\Constraint\PrimaryKey('id')); echo "Executing SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // Виконати SQL $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "Table 'users' created successfully.\n"; } catch (\Exception $e) { echo "Error creating table: " . $e->getMessage() . "\n"; }
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Примітка: Це допоміжний скрипт для ручного запуску (звичайно для schema-міграції застосовують інші інструменти).
Запустіть скрипт у терміналі:
bashphp create_users_table.php
1
Інтеграція з MySQL — приклад
Приклад підключення до MySQL та роботи з таблицею users у контролері.
Налаштуйте підключення до БД
Відредагуйте
config/autoload/global.php
, вкажіть параметри MySQL:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 3306, 'charset' => 'utf8mb4', ], // ... інші налаштування ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14Налаштуйте фабрику контролера (module.config.php)
Щоб інжектити
Laminas\Db\Adapter\Adapter
, визначте кастомну фабрику:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; // Якщо використовується ще use Laminas\Db\Adapter\AdapterInterface; return [ // ... 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { $adapter = $container->get(AdapterInterface::class); return new Controller\IndexController($adapter); }, ], ], 'service_manager' => [ 'aliases' => [ AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... ];
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Примітка: Об'єднайте ці частини з існуючими настройками module.config.php.
Налаштуйте маршрути (module.config.php)
Додайте маршрути для прикладу MySQL:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... return [ 'router' => [ 'routes' => [ // ... інші маршрути (наприклад, 'home') 'mysql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysql', ], ], ], ], ], // ... ];
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Методи контролера (IndexController.php)
Додайте підтримку DI та дії для MySQL:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * Дія для додавання користувача у таблицю 'users' (MySQL). */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'MySQL User added successfully.' : 'Failed to add MySQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Дія для отримання всіх користувачів із таблиці 'users' (MySQL). */ public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } // ... інші методи }
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Шаблони вигляду
Створіть файли для відображення результату:
module/Application/view/application/index/mysql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1module/Application/view/application/index/mysql.phtml
:php<h1>MySQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2Перевірка MySQL-інтеграції
Переконайтеся, що MySQL у ServBay запущено. Спочатку відкрийте
https://servbay-zend-test.local/mysql-add
— додасться новий користувач. Потім перейдіть наhttps://servbay-zend-test.local/mysql
— побачите JSON-вивід таблиці users.
Інтеграція з PostgreSQL — приклад
Показує підключення до PostgreSQL (аналогічно MySQL).
Параметри підключення до БД
Відредагуйте
config/autoload/global.php
для PostgreSQL:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, ], // ... ];
1
2
3
4
5
6
7
8
9
10
11
12
13Фабрика контролера DI (module.config.php)
(аналогічно до MySQL) — якщо вже додано, нічого міняти не потрібно.
Маршрути для PostgreSQL
Додайте маршрути:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... return [ 'router' => [ 'routes' => [ // ... 'pgsql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsql', ], ], ], ], ], // ... ];
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Методи контролера для PostgreSQL
Додайте відповідні action-методи:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * Додати користувача у 'users' через PostgreSQL. */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'PostgreSQL User added successfully.' : 'Failed to add PostgreSQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Вивід усіх користувачів із 'users' (PostgreSQL). */ public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } }
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Шаблони для PostgreSQL
module/Application/view/application/index/pgsql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1module/Application/view/application/index/pgsql.phtml
:php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2Тестування інтеграції PostgreSQL
Запустіть PostgreSQL у ServBay. Перейдіть за адресою
https://servbay-zend-test.local/pgsql-add
— додасться користувач. Потімhttps://servbay-zend-test.local/pgsql
— ви побачите актуальні дані у JSON.
Memcached — приклад інтеграції
Використання Memcached для кешування у Laminas.
Встановіть адаптер Memcached
Через composer додайте пакет:
json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" // ... }, // ... }
1
2
3
4
5
6
7
8
9Виконайте:
bashcomposer update
1PHP-розширення
memcached
вже встановлено в ServBay.Маршрут для Memcached (module.config.php)
Додайте маршрут:
php<?php namespace Application; use Laminas\Router\Http\Literal; // ... return [ 'router' => [ 'routes' => [ // ... 'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ], ], ], // ... ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Метод контролера (IndexController.php)
Додайте демонстраційний action:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... Конструктор та інші action /** * Демонстрація роботи з Memcached. */ public function memcachedAction() { // Memcached за замовчуванням працює на 127.0.0.1:11211 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_memcached_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached! (Дані з джерела, закешовані ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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Шаблон для Memcached
module/Application/view/application/index/memcached.phtml
:php<h1>Memcached Example</h1> <p><?php echo $this->message; ?></p>
1
2Тестування Memcached
Переконайтесь, що Memcached активний у ServBay. Перейдіть на
https://servbay-zend-test.local/memcached
— побачите повідомлення з "CACHE MISS"/"CACHE HIT" в залежності від стану кешу.
Redis — приклад інтеграції
Використання Redis у Laminas для кешування чи зберігання даних.
Встановіть Redis-адаптер
Додайте залежності у composer.json:
json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" // ... }, // ... }
1
2
3
4
5
6
7
8
9
10Після цього:
bashcomposer update
1PHP-розширення
redis
вже є у складі ServBay.Маршрут (module.config.php)
Додайте маршрут для Redis:
php<?php namespace Application; use Laminas\Router\Http\Literal; // ... return [ 'router' => [ 'routes' => [ // ... 'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => '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Метод контролера (IndexController.php)
Додайте action для Redis:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... Конструктор та інші action /** * Приклад використання Redis. */ public function redisAction() { // Redis, за замовчуванням, на 127.0.0.1:6379 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Дані з джерела, закешовані ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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Шаблон для Redis
module/Application/view/application/index/redis.phtml
:php<h1>Redis Example</h1> <p><?php echo $this->message; ?></p>
1
2Перевірка Redis
Активуйте Redis у ServBay. Зайдіть на
https://servbay-zend-test.local/redis
— побачите відповідне повідомлення від кешу.
Висновки
Виконавши ці кроки, ви успішно створили, налаштували й запустили проект на Zend Framework (Laminas) у локальному середовищі ServBay. Ви навчились керувати налаштуванням сайту, підключати MySQL і PostgreSQL, а також використовувати сервіси Memcached та Redis у проекті.
ServBay значно спрощує організацію й підтримку локального середовища розробки, дозволяючи зосередитися саме на роботі з кодом. Використовуйте гнучкі можливості ServBay для імітації production-оточення й підвищення продуктивності розробки.