Membuat dan Menjalankan Proyek Webman di ServBay
Apa Itu Webman?
Webman adalah framework web PHP asynchronous berkinerja tinggi yang dibangun di atas Workerman, dirancang khusus untuk membangun aplikasi web dengan trafik tinggi dan performa unggul. Berbeda dengan framework tradisional yang sinkron dan blocking, Webman menerapkan model I/O asynchronous non-blocking berbasis event-driven, sehingga sangat efisien ketika menangani permintaan bersamaan dalam jumlah besar. Webman juga menawarkan API yang sederhana dan ekstensibel, sangat cocok untuk membangun aplikasi real-time, layanan API, microservices, dan sebagainya.
Fitur & Keunggulan Utama Webman
- Performa Tinggi: Berbasis Workerman, menggunakan event-driven dan non-blocking asynchronous I/O, dapat menangani ribuan koneksi secara bersamaan dengan throughput jauh melampaui framework sinkron tradisional.
- Mudah Digunakan: API intuitif dan kaya fungsionalitas, sehingga developer dapat dengan cepat membangun aplikasi.
- Dukungan Multi-Protocol: Mendukung HTTP, WebSocket, dan berbagai protokol aplikasi tingkat atas secara built-in, memudahkan pengembangan berbagai layanan.
- Ekstensibel dan Fleksibel: Bisa diperluas melalui paket Composer, plugin, dan mekanisme middleware.
- Hemat Resource: Sebagai aplikasi yang berjalan di memori (resident memory), kebutuhan resource lebih rendah dibandingkan pola server web tradisional (Web Server + PHP-FPM).
- Komunitas dan Dokumentasi Kuat: Didukung komunitas developer yang aktif dan dokumentasi yang melimpah.
Webman membantu developer membangun aplikasi web dan layanan API yang berkinerja tinggi dan highly available, terutama untuk kasus penggunaan dengan kebutuhan concurrency tinggi dan latensi rendah.
Membuat & Menjalankan Proyek Webman Sederhana di ServBay
Panduan ini akan menjelaskan secara detail bagaimana membuat dan menjalankan proyek web sederhana menggunakan Webman di lingkungan pengembangan lokal ServBay. Kita akan bahas instalasi Webman, penulisan kode dasar routing dan controller, hingga integrasi database (MySQL, PostgreSQL) dan layanan cache (Redis, Memcached) yang disediakan ServBay.
TIP
ServBay menyarankan Anda untuk menempatkan semua proyek website lokal di direktori /Applications/ServBay/www
agar mudah dikelola secara terpusat, seperti dalam pengaturan situs lokal (sebelumnya dikenal sebagai "host").
Prasyarat
Pastikan Anda telah memenuhi hal berikut sebelum memulai:
- Instalasi ServBay: ServBay sudah terinstal di macOS Anda. ServBay menyediakan lingkungan pengembangan one-stop, termasuk PHP, Composer, MySQL, PostgreSQL, Redis, Memcached, dan semua komponen yang dibutuhkan dalam tutorial ini.
- Mengaktifkan Paket yang Diperlukan: Melalui panel kontrol ServBay, pastikan paket berikut sudah diinstal dan berjalan:
- Versi PHP pilihan Anda (direkomendasikan PHP 8.x atau yang lebih baru)
- Composer (sudah terintegrasi di ServBay)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Pastikan ekstensi PHP terkait — seperti
memcached
,redis
,pdo_mysql
,pdo_pgsql
— telah aktif untuk versi PHP Anda. Umumnya ServBay mengaktifkan ekstensi-ektensi ini secara default, namun Anda bisa periksa kembali melalui konfigurasi PHP di ServBay.
- Akses Terminal: Kenali penggunaan aplikasi Terminal di macOS.
Instalasi Webman
Pastikan Composer Aktif
ServBay sudah menyediakan Composer secara built-in dan dapat langsung digunakan di Terminal. Anda dapat memeriksanya dengan menjalankan perintah berikut:
bashcomposer --version
1Jika versi Composer ditampilkan, maka Composer sudah siap digunakan.
Masuk ke Direktori Website ServBay
Buka Terminal dan masuk ke direktori root proyek yang direkomendasikan ServBay:
bashcd /Applications/ServBay/www
1Buat Proyek Webman dengan Composer
Jalankan perintah
create-project
Composer untuk menginstal Webman ke dalam direktori tertentu, misal dengan nama proyekservbay-webman-app
:bashcomposer create-project workerman/webman servbay-webman-app
1Composer akan mengunduh Webman dan dependensi intinya ke folder
servbay-webman-app
.Masuk ke Direktori Proyek
Setelah instalasi selesai, masuk ke folder proyek baru:
bashcd servbay-webman-app
1Install Komponen Tambahan yang Dibutuhkan
Untuk mendemonstrasikan penggunaan database dan cache, instal beberapa dependency tambahan via Composer. Biasanya Webman menggunakan
illuminate/database
(ORM Laravel),illuminate/redis
, dan lainnya. Parameter-W
(--with-dependencies
) memastikan kompatibilitas dependensi.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Perintah ini akan menginstal ORM database, client Redis, komponen pagination, event dispatcher, termasuk VarDumper untuk debugging.
Membuat Database dan Tabel
Agar contoh kode berjalan, Anda perlu membuat database dan tabel users
pada MySQL dan PostgreSQL ServBay. Secara default, password user root
database ServBay adalah password
.
Gunakan tool manajemen database ServBay (misal phpMyAdmin atau pgAdmin, bisa diakses dari panel kontrol ServBay) atau terminal untuk menjalankan SQL berikut.
Buat Database
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:
Buat Tabel
users
di Databasewebman_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; -- Koneksi ke database yang baru dibuat 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:
Menulis Kode Proyek Web
Selanjutnya, tambahkan kode untuk mendefinisikan routing, membuat controller, serta mengimplementasikan interaksi dengan database dan cache.
Konfigurasi Routing
Edit file
config/route.php
di root proyek dan tambahkan kode berikut untuk mendefinisikan routing:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Definisikan route root, mengarah ke method index IndexController Route::any('/', [IndexController::class, 'index']); // Route untuk cache Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Route untuk database 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']); // Tambahkan route lain di sini jika perlu...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Buat File Controller
Di folder
app/controller
, buat fileIndexController.php
,CacheController.php
, danDatabaseController.php
, lalu tambahkan kode berikut.app/controller/IndexController.php
: Menangani permintaan ke root.php<?php namespace app\controller; use support\Request; use support\Response; // Import class Response class IndexController { /** * Contoh method untuk menangani request ke root * @param Request $request Objek permintaan saat ini * @return Response Mengembalikan objek Response */ public function index(Request $request): Response // Spesifikasi tipe kembali { // Return response teks sederhana return response('Hello ServBay & Webman!'); // Pesan sambutan } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php
: Untuk mendemonstrasikan penggunaan Memcached dan Redis.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Import class Memcached use support\Redis; // Import Redis Facade dari Webman class CacheController { /** * Contoh penggunaan Memcached * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Koneksi ke server Memcached, default ServBay di 127.0.0.1:11211 $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // Set cache dengan masa berlaku 60 detik $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // Perbarui key dan value if (!$success) { return response('Failed to set Memcached key', 500); } // Ambil cache yang sudah disimpan $value = $memcached->get('servbay_key'); // Ambil key // Return value cache return response($value ?: 'Memcached key not found or expired'); // Pesan jika tidak ditemukan } /** * Contoh penggunaan Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Set cache menggunakan Redis Facade Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Set key dan value // Ambil cache dari Redis $value = Redis::get('servbay_redis_key'); // Ambil key // Return value cache return response($value ?: 'Redis key not found'); // Pesan jika tidak ditemukan } }
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
: Untuk mendemonstrasikan operasi database MySQL dan PostgreSQL.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // Import Db Facade dari Webman class DatabaseController { /** * Menambah user ke MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Insert data ke MySQL melalui Db Facade Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Data contoh 'email' => '[email protected]', // Email contoh 'created_at' => date('Y-m-d H:i:s') // Tanggal dibuat ]); return response('User added to MySQL'); // Pesan sukses } catch (\Exception $e) { return response('Error adding user to MySQL: ' . $e->getMessage(), 500); // Penanganan error } } /** * Mendapatkan daftar user dari MySQL * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Ambil semua user dari MySQL $users = Db::connection('mysql')->table('users')->get(); // Return daftar user dalam format JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); } catch (\Exception $e) { return response('Error getting users from MySQL: ' . $e->getMessage(), 500); } } /** * Menambah user ke PostgreSQL * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Insert data ke PostgreSQL melalui Db Facade Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // Data contoh 'email' => '[email protected]', // Email contoh 'created_at' => date('Y-m-d H:i:s') // Tanggal dibuat ]); return response('User added to PostgreSQL'); // Pesan sukses } catch (\Exception $e) { return response('Error adding user to PostgreSQL: ' . $e->getMessage(), 500); } } /** * Mendapatkan daftar user dari PostgreSQL * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Ambil semua user dari PostgreSQL $users = Db::connection('pgsql')->table('users')->get(); // Return daftar user dalam format JSON 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
83
84
Konfigurasi Koneksi Database
Edit file
config/database.php
di root proyek dan atur konfigurasi koneksi MySQL serta PostgreSQL. Host database ServBay default adalah127.0.0.1
, port3306
(MySQL), port5432
(PostgreSQL), userroot
passwordpassword
.php<?php /** * Konfigurasi Database */ return [ // Driver database default yang digunakan 'default' => 'mysql', // Daftar koneksi database 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // Host dan port MySQL ServBay 'host' => '127.0.0.1', 'port' => 3306, // Nama database yang sudah dibuat 'database' => 'webman_app', // Username MySQL ServBay 'username' => 'root', // Password MySQL ServBay 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // Host dan port PostgreSQL ServBay 'host' => '127.0.0.1', 'port' => 5432, // Nama database 'database' => 'webman_app', // Username PostgreSQL ServBay 'username' => 'root', // Password PostgreSQL ServBay 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // atau require, verify-ca, verify-full ], // Tambahkan koneksi database lain jika perlu... ], ];
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
46Catatan Penting: Di lingkungan production, selalu ubah password database default Anda dan hindari hardcode informasi sensitif dalam kode.
Menjalankan Proyek Webman
Proyek Webman biasanya dijalankan dengan skrip start.php
bawaan untuk memulai proses Workerman. Berbeda dari cara tradisional (Nginx/Apache + PHP-FPM), Webman berjalan sebagai aplikasi asynchronous resident memory.
Pada root proyek (/Applications/ServBay/www/servbay-webman-app
), jalankan perintah berikut untuk memulai Webman:
bash
php start.php start
1
Setelah dijalankan, Anda akan melihat info startup Webman dan, secara default, Webman akan mendengarkan HTTP di 127.0.0.1:8787
.
- Catatan: Perintah
php
di sini menggunakan executable PHP dari ServBay. ServBay secara otomatis mengonfigurasi environment Terminal agar Anda dapat langsung menggunakan PHP yang terinstal oleh ServBay. - Untuk menjalankan Webman di background, tambahkan parameter
-d
:php start.php start -d
. - Untuk menghentikan layanan Webman, jalankan:
php start.php stop
. - Untuk restart layanan Webman, jalankan:
php start.php restart
. - Untuk reload/kulir ulang secara halus (tanpa menghentikan request aktif), jalankan:
php start.php reload
.
Menguji Proyek
Setelah Webman berhasil berjalan dan mendengarkan 127.0.0.1:8787
, Anda dapat mengakses beberapa URL berikut di browser untuk menguji fitur:
http://localhost:8787/
: Akan menampilkan teksHello ServBay & Webman!
.http://localhost:8787/memcached
: Akan menampilkanHello Memcached from ServBay!
, menandakan koneksi ke layanan Memcached ServBay sukses.http://localhost:8787/redis
: Akan menampilkanHello Redis from ServBay!
, menandakan koneksi ke Redis ServBay sukses.http://localhost:8787/mysql-add
: Akan menampilkanUser added to MySQL
dan menambah record ke tabelusers
di database MySQL yang telah dibuat sebelumnya.http://localhost:8787/mysql
: Akan menampilkan daftar user dari tabelusers
MySQL dalam format JSON.http://localhost:8787/pgsql-add
: Akan menampilkanUser added to PostgreSQL
dan menambah record ke tabelusers
database PostgreSQL.http://localhost:8787/pgsql
: Akan menampilkan daftar user dari tabelusers
PostgreSQL dalam format JSON.
Jika menemui error saat mengakses URL tersebut, cek log error di output terminal Webman dan pastikan paket MySQL, PostgreSQL, Redis, serta Memcached ServBay berjalan dan ekstensi PHP terkait aktif.
FAQ (Pertanyaan yang Sering Diajukan)
- Q: Kenapa perintah
php start.php start
tidak ditemukan?- A: Pastikan Anda sudah berada di direktori proyek
servbay-webman-app
di terminal. Juga pastikan PHP dari ServBay sudah dimasukkan ke PATH sistem (biasanya dikonfigurasi otomatis oleh ServBay).
- A: Pastikan Anda sudah berada di direktori proyek
- Q: Kenapa akses ke
localhost:8787
gagal?- A: Periksa output terminal dari
php start.php start
untuk pesan error. Pastikan port8787
tidak dipakai aplikasi lain. Jika perlu, ubah port di konfigurasi Webman (misal diconfig/server.php
).
- A: Periksa output terminal dari
- Q: Kenapa gagal koneksi ke database?
- A: Pastikan MySQL dan PostgreSQL ServBay berjalan. Cek konfigurasi di
config/database.php
(host, port, nama database, user, password) sudah sesuai dengan pengaturan ServBay (default userroot
, passwordpassword
). Pastikan databasewebman_app
dan tabelusers
sudah dibuat.
- A: Pastikan MySQL dan PostgreSQL ServBay berjalan. Cek konfigurasi di
- Q: Gagal terhubung ke Memcached atau Redis?
- A: Pastikan layanan Memcached dan Redis ServBay aktif. Cek host dan port di controller cache (
app/controller/CacheController.php
) (default127.0.0.1:11211
dan127.0.0.1:6379
). Pastikan ekstensi PHPmemcached
danredis
sudah aktif.
- A: Pastikan layanan Memcached dan Redis ServBay aktif. Cek host dan port di controller cache (
Ringkasan
Dengan mengikuti langkah-langkah di atas, Anda telah berhasil membuat, mengonfigurasi, dan menjalankan proyek Webman dasar di lingkungan pengembangan lokal ServBay. Anda telah memahami pemanfaatan ServBay sebagai platform all-in-one untuk membangun dan menguji aplikasi Webman, beserta integrasi database dan cache-nya. Gabungan antara performa tinggi Webman dan kemudahan ServBay memberikan fondasi kuat bagi pengembangan aplikasi PHP asynchronous Anda. Semoga panduan ini membantu Anda memaksimalkan ServBay dan Webman untuk membangun aplikasi web yang tangguh!