Mencipta dan Menjalankan Projek Webman dalam ServBay
Apa itu Webman?
Webman ialah rangka kerja web PHP asinkron yang berprestasi tinggi berdasarkan Workerman, direka khusus untuk membina aplikasi web yang sangat serentak dan berprestasi tinggi. Berbeza dengan rangka kerja tradisional yang bersifat sinkron dan menghalang, Webman menggunakan model pemacu kejadian dan I/O asinkron tanpa halangan, memberikan prestasi cemerlang apabila menangani banyak permintaan serentak. Webman menawarkan API yang mudah digunakan serta mekanisme sambungan yang fleksibel, sesuai untuk membangunkan aplikasi masa nyata, servis API, mikroservis, dan banyak lagi.
Ciri Utama & Keunggulan Webman
- Prestasi tinggi: Berdasarkan Workerman, memanfaatkan I/O asinkron dan pemacu kejadian membolehkan pengurusan ribuan sambungan serentak dengan throughput jauh lebih tinggi berbanding rangka kerja sinkron tradisional.
- Mudah digunakan: API yang intuitif dan pelbagai fungsi memudahkan pemaju memulakan pembangunan serta membina aplikasi dengan cepat.
- Sokongan pelbagai protokol: Menyokong HTTP, WebSocket dan pelbagai protokol aplikasi lain yang biasa digunakan, memudahkan pembangunan pelbagai jenis servis.
- Pengembangan fleksibel: Sambungan fungsi rangka kerja mudah dilakukan melalui pakej Composer, plugin dan middleware.
- Penggunaan sumber rendah: Berbanding model pelayan web tradisional + PHP-FPM, Webman dijalankan sebagai aplikasi residen memori yang meminimumkan penggunaan sumber.
- Komuniti kuat: Komuniti pemaju yang aktif dan dokumentasi yang kaya.
Webman membantu anda membina aplikasi web dan servis API yang berkualiti tinggi, sangat tersedia dan sesuai untuk senario trafik tinggi serta latensi rendah.
Mencipta & Menjalankan Projek Webman Mudah dalam ServBay
Panduan ini menerangkan secara terperinci cara membina dan menjalankan projek web ringkas menggunakan Webman dalam persekitaran pembangunan tempatan ServBay. Anda akan belajar cara memasang Webman, menulis kode asas untuk laluan dan pengawal, serta integrasi pangkalan data (MySQL, PostgreSQL) dan perkhidmatan cache (Redis, Memcached) yang disediakan oleh ServBay.
TIP
ServBay mencadangkan supaya anda menyimpan semua projek laman web tempatan di direktori /Applications/ServBay/www
supaya pengurusan lebih mudah, seperti konfigurasi laman tempatan (disebut "Host" sebelum ini).
Prasyarat
Pastikan perkara berikut telah disediakan sebelum memulakan:
- ServBay telah dipasang: Anda sudah berjaya memasang ServBay di macOS. ServBay menyediakan persekitaran pembangunan tempatan lengkap dengan PHP, Composer, MySQL, PostgreSQL, Redis, Memcached dan lain-lain yang diperlukan untuk tutorial ini.
- Pakej diperlukan telah diaktifkan: Pastikan melalui panel kawalan ServBay pakej berikut telah dipasang dan berjalan:
- Versi PHP pilihan anda (disarankan versi terbaru seperti PHP 8.x)
- Composer (sudah sedia ada dalam ServBay)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Pastikan PHP yang dipilih telah mengaktifkan sambungan yang diperlukan seperti
memcached
,redis
,pdo_mysql
,pdo_pgsql
dan lain-lain. ServBay biasanya mengaktifkan sambungan biasa ini secara lalai. Anda boleh semak di tetapan PHP ServBay.
- Akses Terminal: Anda tahu cara menggunakan aplikasi Terminal di macOS.
Pemasangan Webman
Sahkan Composer Sedia Digunakan
ServBay menyediakan Composer secara built-in yang telah dikonfigurasi untuk digunakan terus melalui Terminal. Sahkan dengan arahan berikut:
bashcomposer --version
1Jika versi Composer dipaparkan, Composer sudah boleh digunakan.
Masuk ke Direktori Laman ServBay
Buka Terminal dan masuk ke direktori root laman ServBay:
bashcd /Applications/ServBay/www
1Cipta Projek Webman menggunakan Composer
Gunakan arahan
create-project
Composer untuk memasang Webman ke direktori tertentu. Projek ini dinamakanservbay-webman-app
:bashcomposer create-project workerman/webman servbay-webman-app
1Composer akan memuat turun Webman dan keperluan terasnya ke dalam direktori
servbay-webman-app
.Masuk ke direktori projek
Selepas selesai pemasangan, masuk ke direktori projek baru:
bashcd servbay-webman-app
1Pasang Komponen Diperlukan
Untuk demo pangkalan data dan cache, beberapa pakej Composer tambahan perlu dipasang, antaranya
illuminate/database
(komponen pangkalan data dari Laravel),illuminate/redis
, dan lain-lain. Pilihan-W
(--with-dependencies
) memastikan penyelesaian konflik dependensi.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Arahan ini akan memasang ORM pangkalan data, klien Redis, komponen pagination, dispatcher event, dan alat debug VarDumper.
Mencipta Pangkalan Data & Jadual
Supaya kod contoh berjalan lancar, cipta pangkalan data dan jadual users
dalam MySQL dan PostgreSQL di ServBay. Kata laluan lalai untuk pengguna root dalam ServBay ialah password
.
Anda boleh menggunakan alat pengurusan pangkalan data yang disediakan ServBay (seperti phpMyAdmin atau pgAdmin melalui panel kawalan ServBay) atau arahan CLI SQL berikut.
Cipta pangkalan data
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:
Cipta jadual
users
dalam pangkalan datawebman_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; -- sambung ke pangkalan data yang baru dicipta 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 Kod Projek Web
Seterusnya, tambah kod bagi mendefinisikan laluan, cipta pengawal, serta logik interaksi pangkalan data dan cache.
Konfigurasi Laluan
Edit fail
config/route.php
di root projek, tambah kod berikut:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Definisi laluan root, dihubungkan ke kaedah index IndexController Route::any('/', [IndexController::class, 'index']); // Laluan berkaitan cache Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Laluan berkaitan pangkalan data 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']); // Tambahan laluan lain boleh dibuat di sini...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Cipta Fail Pengawal
Dalam direktori
app/controller
, cipta failIndexController.php
,CacheController.php
danDatabaseController.php
lalu masukkan kod berikut:app/controller/IndexController.php
: Untuk permintaan root.php<?php namespace app\controller; use support\Request; use support\Response; // Import kelas Response class IndexController { /** * Kaedah contoh bagi permintaan root * @param Request $request objek permintaan semasa * @return Response pulangkan objek Response */ public function index(Request $request): Response // Jenis pulangan yang jelas { // Pulangkan respons teks ringkas return response('Hello ServBay & Webman!'); // Ucapan selamat datang dikemas kini } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php
: Demo penggunaan Memcached & Redis.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Import kelas Memcached use support\Redis; // Import Redis Facade dari Webman class CacheController { /** * Demo penggunaan Memcached * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Sambung ke pelayan Memcached, ServBay secara lalai di 127.0.0.1:11211 $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // Set item cache, tempoh sah 60 saat $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // Kemaskini key dan value if (!$success) { return response('Gagal menetapkan kunci Memcached', 500); } // Dapatkan item cache $value = $memcached->get('servbay_key'); // Kemaskini key // Pulangkan nilai yang diperoleh return response($value ?: 'Kunci Memcached tiada atau tamat tempoh'); // Tambah notis jika tiada } /** * Demo penggunaan Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Set item cache dengan Redis Facade Webman Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Kemaskini key dan value // Dapatkan item cache menggunakan Redis Facade $value = Redis::get('servbay_redis_key'); // Kemaskini key // Pulangkan nilai yang diperoleh return response($value ?: 'Kunci Redis tiada'); // Tambah notis jika tiada } }
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
: Demo operasi MySQL & PostgreSQL.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // Import Db Facade dari Webman class DatabaseController { /** * Tambah pengguna ke pangkalan data MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Sambungan ke pangkalan data 'mysql' dan masukkan data Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Kemaskini data contoh 'email' => 'mysql_demo@servbay.test', // Kemaskini email contoh 'created_at' => date('Y-m-d H:i:s') // Tambah waktu ciptaan ]); return response('Pengguna berjaya ditambah ke MySQL'); // Ucapan kemaskini } catch (\Exception $e) { return response('Ralat menambah pengguna ke MySQL: ' . $e->getMessage(), 500); // Tambah pengendalian ralat } } /** * Dapatkan senarai pengguna dari MySQL * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Dapatkan semua pengguna dari pangkalan data 'mysql' $users = Db::connection('mysql')->table('users')->get(); // Pulangkan senarai pengguna dalam format JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Set Content-Type dengan jelas } catch (\Exception $e) { return response('Ralat mendapatkan pengguna dari MySQL: ' . $e->getMessage(), 500); // Pengendalian ralat } } /** * Tambah pengguna ke pangkalan data PostgreSQL * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Sambung ke pangkalan data 'pgsql' dan masukkan data Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // Kemaskini data contoh 'email' => 'pgsql_demo@servbay.test', // Kemaskini email contoh 'created_at' => date('Y-m-d H:i:s') // Tambah waktu ciptaan ]); return response('Pengguna berjaya ditambah ke PostgreSQL'); // Ucapan kemaskini } catch (\Exception $e) { return response('Ralat menambah pengguna ke PostgreSQL: ' . $e->getMessage(), 500); // Pengendalian ralat } } /** * Dapatkan senarai pengguna dari PostgreSQL * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Dapatkan semua pengguna dari pangkalan data 'pgsql' $users = Db::connection('pgsql')->table('users')->get(); // Pulangkan senarai pengguna dalam format JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Set Content-Type dengan jelas } catch (\Exception $e) { return response('Ralat mendapatkan pengguna dari PostgreSQL: ' . $e->getMessage(), 500); // Pengendalian ralat } } }
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 Sambungan Pangkalan Data
Edit fail
config/database.php
di root projek dan tetapkan maklumat sambungan MySQL dan PostgreSQL. Hos lalai ServBay ialah127.0.0.1
, port3306
(MySQL) dan5432
(PostgreSQL), serta kata laluan root ialahpassword
.php<?php /** * Konfigurasi pangkalan data */ return [ // Sambungan pangkalan data lalai 'default' => 'mysql', // Senarai konfigurasi sambungan pangkalan data 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // Hos dan port MySQL lalai ServBay 'host' => '127.0.0.1', 'port' => 3306, // Nama pangkalan data hasil ciptaan terdahulu 'database' => 'webman_app', // Nama pengguna MySQL lalai ServBay 'username' => 'root', // Kata laluan MySQL lalai ServBay 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // Hos dan port PostgreSQL lalai ServBay 'host' => '127.0.0.1', 'port' => 5432, // Nama pangkalan data hasil ciptaan terdahulu 'database' => 'webman_app', // Nama pengguna PostgreSQL lalai ServBay 'username' => 'root', // Kata laluan PostgreSQL lalai ServBay 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // atau require, verify-ca, verify-full ], // Anda boleh menambah sambungan pangkalan data lain di sini... ], ];
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
46Nota Penting: Untuk persekitaran produksi, pastikan anda mengubah kata laluan pangkalan data lalai, dan elakkan pendaman maklumat sensitif dalam kod.
Menjalankan Projek Webman
Projek Webman dihidupkan melalui skrip start.php
yang menjalankan proses Workerman. Ini berbeza daripada mod PHP-FPM + Nginx/Apache tradisional, kerana Webman merupakan aplikasi asinkron residen memori.
Di root projek (/Applications/ServBay/www/servbay-webman-app
), jalankan arahan berikut untuk memulakan Webman:
bash
php start.php start
1
Selepas ini, info permulaan Webman akan dipaparkan; secara lalai, Webman mendengar permintaan HTTP di 127.0.0.1:8787
.
- Nota: Arahan
php
di sini ialah executables PHP persekitaran ServBay. ServBay mengkonfigurasi terminal anda supaya menggunakan versi PHP yang telah dipasang. - Untuk jalankan Webman di background, tambah parameter
-d
:php start.php start -d
. - Untuk hentikan servis Webman, jalankan:
php start.php stop
. - Untuk mulakan semula servis Webman, jalankan:
php start.php restart
. - Untuk reload dengan lancar (tanpa ganggu permintaan semasa), jalankan:
php start.php reload
.
Uji Projek
Selepas Webman berjaya bermula dan mendengar di 127.0.0.1:8787
, anda boleh uji fungsi berikut dalam pelayar web:
http://localhost:8787/
:Akan memaparkanHello ServBay & Webman!
.http://localhost:8787/memcached
:Akan memaparkanHello Memcached from ServBay!
, membuktikan ServBay Memcached berjaya digunakan melalui Webman.http://localhost:8787/redis
:DipaparkanHello Redis from ServBay!
, membuktikan anda telah berjaya menghubungkan Webman dengan Redis ServBay.http://localhost:8787/mysql-add
:Akan memaparkanPengguna berjaya ditambah ke MySQL
dan akan menambah rekod dalam jadualusers
pangkalan data MySQL.http://localhost:8787/mysql
:Memaparkan senarai pengguna dalam format JSON dari jadualusers
MySQL.http://localhost:8787/pgsql-add
:MemaparkanPengguna berjaya ditambah ke PostgreSQL
, menambah rekod untuk jadualusers
PostgreSQL.http://localhost:8787/pgsql
:Memaparkan senarai pengguna dalam format JSON dari jadualusers
PostgreSQL.
Jika menemui isu pada URL di atas, semak output terminal Webman untuk ralat serta pastikan MySQL, PostgreSQL, Redis dan Memcached ServBay sedang berjalan dan sambungan PHP telah diaktifkan.
Soalan Lazim (FAQ)
- S: Tidak ketemu perintah
php start.php start
?- J: Pastikan anda telah
cd
ke direktori projekservbay-webman-app
dalam terminal. Juga, pastikan PHP dari ServBay telah diambil dalam PATH sistem anda (ServBay biasanya mengurus ini secara automatik).
- J: Pastikan anda telah
- S: Tidak boleh akses
localhost:8787
?- J: Semak output terminal selepas menjalankan
php start.php start
. Pastikan tiada ralat dan port8787
tidak digunakan aplikasi lain. Jika digunakan, anda boleh ubah fail konfigurasi Webman (config/server.php
).
- J: Semak output terminal selepas menjalankan
- S: Gagal sambungan ke pangkalan data?
- J: Pastikan pakej MySQL serta PostgreSQL ServBay berjalan dengan baik. Semak sambungan dalam
config/database.php
(host, port, nama pangkalan data, pengguna, kata laluan) selaras dengan konfigurasi ServBay (lalai penggunaroot
, kata laluanpassword
). Pastikan anda telah mencipta pangkalan datawebman_app
dan jadualusers
.
- J: Pastikan pakej MySQL serta PostgreSQL ServBay berjalan dengan baik. Semak sambungan dalam
- S: Gagal sambungan ke Memcached atau Redis?
- J: Pastikan pakej Memcached atau Redis ServBay berjalan. Semak alamat dan port dalam
app/controller/CacheController.php
(lalai127.0.0.1:11211
dan127.0.0.1:6379
). Sahkan sambungan PHP sepertimemcached
danredis
telah diaktifkan.
- J: Pastikan pakej Memcached atau Redis ServBay berjalan. Semak alamat dan port dalam
Kesimpulan
Melalui langkah di atas, anda telah berjaya mencipta, mengkonfigurasi dan menjalankan projek Webman asas dengan persekitaran pembangunan tempatan ServBay. Anda telah belajar menggunakan servis satu-henti ServBay untuk menyediakan persekitaran pembangunan Webman dengan pantas serta integrasi pangkalan data dan cache. Gandingan prestasi tinggi Webman dan kemudahan ServBay memberikan sokongan mantap untuk pembangunan aplikasi PHP asinkron anda. Semoga panduan ini dapat membantu anda menggunakan ServBay dan Webman dengan lebih cekap untuk membina aplikasi web cemerlang.