การสร้างและรันโปรเจกต์ Webman ใน ServBay
Webman คืออะไร?
Webman คือ PHP Web Framework แบบอะซิงโครนัสประสิทธิภาพสูง พัฒนาบนพื้นฐานของ Workerman โดยออกแบบมาเพื่อสร้างแอปพลิเคชันเว็บที่รองรับการใช้งานแบบ concurrent สูง รองรับภาระงานจำนวนมากได้อย่างมีประสิทธิภาพ แตกต่างจากเฟรมเวิร์คแบบ synchronous ทั่วไป Webman ใช้สถาปัตยกรรมแบบ event-driven และ I/O แบบอะซิงโครนัสไม่บล็อก ทำให้สามารถรับมือกับคำขอพร้อมกันจำนวนมากได้ยอดเยี่ยม Webman มาพร้อม API ที่ใช้งานง่ายและระบบขยายที่ยืดหยุ่น เหมาะกับแอปพลิเคชันแบบเรียลไทม์, บริการ API, microservices ฯลฯ
จุดเด่นและข้อได้เปรียบสำคัญของ Webman
- ประสิทธิภาพสูง: สร้างบน Workerman ใช้ event-driven และ I/O แบบอะซิงโครนัสไม่บล็อก รองรับการเชื่อมต่อพร้อมกันจำนวนมากให้ throughput สูงกว่ากรอบงาน synchronous แบบดั้งเดิมมาก
- ใช้งานง่าย: มี API กระชับเข้าใจง่าย และฟีเจอร์หลากหลาย ทำให้นักพัฒนามือใหม่สามารถเริ่มต้นและสร้างแอปได้รวดเร็ว
- รองรับหลายโปรโตคอล: สนับสนุน HTTP, WebSocket และโปรโตคอลระดับแอปพลิเคชันอื่นๆ ในตัว เหมาะกับงานหลายชนิด
- ขยายระบบได้ยืดหยุ่น: สามารถขยายผ่าน Composer package, plugins, middleware ได้ง่าย
- ใช้ทรัพยากรต่ำ: ต่างจากรูปแบบเว็บเซิร์ฟเวอร์ + PHP-FPM เดิม Webman พักอยู่ในหน่วยความจำ ใช้ทรัพยากรระบบน้อยกว่า
- ชุมชนสนับสนุนแข็งแกร่ง: มีชุมชนนักพัฒนาที่คล่องแคล่ว เอกสารช่วยเหลือมากมาย
Webman ช่วยให้นักพัฒนาเขียนเว็บแอปและ API ที่มีประสิทธิภาพสูง เชื่อถือได้ เหมาะกับงานที่ต้องการรองรับ concurrent สูงและ latency ต่ำอย่างยิ่ง
การสร้างและรันโปรเจกต์ Webman อย่างง่ายใน ServBay
ในคู่มือนี้ คุณจะได้เห็นวิธีใช้ Webman ในสภาพแวดล้อมพัฒนาโลคอลด้วย ServBay อย่างละเอียด ตั้งแต่การติดตั้ง การเขียนโค้ดเบื้องต้น ไปจนถึงการเชื่อมต่อฐานข้อมูล (MySQL, PostgreSQL) และการใช้แคช (Redis, Memcached) ที่มาพร้อม ServBay
TIP
ServBay แนะนำให้คุณจัดเก็บโปรเจกต์เว็บไซต์โลคอลทั้งหมดไว้ที่ไดเรกทอรี /Applications/ServBay/www
เพื่อให้ง่ายต่อการจัดการโดย ServBay เช่น การตั้งค่าเว็บไซต์ (หรือที่เรียกว่า "host") ได้รวดเร็ว
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้นใช้งาน กรุณาตรวจสอบว่าคุณมีสิ่งต่อไปนี้พร้อมแล้ว:
- ติดตั้ง ServBay แล้ว: คุณได้ติดตั้ง ServBay สำเร็จบน macOS ซึ่ง ServBay มาพร้อมทุกเครื่องมือที่จำเป็นต่อคู่มือนี้ ได้แก่ PHP, Composer, MySQL, PostgreSQL, Redis, Memcached เป็นต้น
- เปิดใช้งานแต่ละแพ็กเกจแล้ว: เข้าสู่แผงควบคุม ServBay ตรวจสอบให้แน่ใจว่าได้ติดตั้งและรัน software package เหล่านี้แล้ว:
- PHP version ที่ต้องการ (แนะนำเวอร์ชันใหม่ เช่น PHP 8.x)
- Composer (มากับ ServBay แล้ว)
- MySQL
- PostgreSQL
- Redis
- Memcached
- ตรวจสอบว่า PHP ที่เลือกได้เปิด
memcached
,redis
,pdo_mysql
,pdo_pgsql
extension ที่จำเป็นไว้แล้ว ServBay โดยปกติจะเปิด extension เหล่านี้อัตโนมัติ คุณยังสามารถเช็คที่หน้าตั้งค่า PHP ของ ServBay ได้อีกทางหนึ่ง
- ใช้งาน Terminal เป็น: มีทักษะการใช้โปรแกรมเทอร์มินัลของ macOS อยู่แล้ว
การติดตั้ง Webman
ตรวจสอบว่า Composer ใช้งานได้
ServBay ติดตั้ง Composer มาให้แล้ว และตั้งค่าให้สามารถใช้จากเทอร์มินัลได้โดยตรง ตรวจสอบได้ด้วยคำสั่ง:
bashcomposer --version
1หากขึ้นข้อมูลเวอร์ชันของ Composer แสดงว่าใช้งานได้พร้อมแล้ว
เข้าสู่ไดเรกทอรีเว็บไซต์ใน ServBay
เปิดเทอร์มินัล ไปยังไดเรกทอรีเว็บไซต์ที่ ServBay แนะนำ
bashcd /Applications/ServBay/www
1ใช้ Composer สร้างโปรเจกต์ Webman
ใช้คำสั่ง
create-project
ของ Composer ติดตั้ง Webman ไปยังไดเรกทอรีใหม่ที่ชื่อว่าservbay-webman-app
:bashcomposer create-project workerman/webman servbay-webman-app
1Composer จะดาวน์โหลด Webman และ dependency จาก Packagist ไปยังไดเรกทอรี
servbay-webman-app
เข้าสู่ไดเรกทอรีโปรเจกต์
เมื่อเสร็จสมบูรณ์ เข้าสู่โฟลเดอร์โปรเจกต์
bashcd servbay-webman-app
1ติดตั้ง Composer packages ที่ต้องใช้
เพื่อแสดงการใช้งานฐานข้อมูลและแคช ให้ติดตั้ง Composer package เพิ่มเติม เช่น
illuminate/database
(Database ของ Laravel),illuminate/redis
ฯลฯ ตัวเลือก-W
(--with-dependencies
) ช่วยแก้ปัญหา dependency ได้bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1คำสั่งนี้จะติดตั้ง ORM สำหรับฐานข้อมูล, Redis client, pagination, event dispatcher และตัวแสดงดีบัก VarDumper
การสร้างฐานข้อมูลและตาราง
เพื่อให้โค้ดตัวอย่างต่อไปนี้ทำงาน กรุณาสร้าง database และ table users
ทั้งใน MySQL และ PostgreSQL บน ServBay โดยค่าผู้ใช้ root
และรหัสผ่านเริ่มต้นคือ password
คุณสามารถใช้เครื่องมือจัดการฐานข้อมูลที่ ServBay มีให้ (เช่น phpMyAdmin หรือ pgAdmin ผ่านแผงควบคุม ServBay) หรือรัน SQL ผ่าน command line ได้โดยตรง
สร้าง 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:
สร้างตาราง
users
ใน 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; -- เชื่อมต่อไปยัง database ที่สร้างใหม่ 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, สร้าง controller และเขียน logic การใช้งานฐานข้อมูล/แคช
กำหนดเส้นทาง (Route)
แก้ไขไฟล์
config/route.php
ใน root ของโปรเจกต์ โดยเพิ่มโค้ดต่อไปนี้เพื่อกำหนด route ที่ต้องใช้php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // กำหนด route สำหรับ root path โดยเรียก index method ของ IndexController Route::any('/', [IndexController::class, 'index']); // Route สำหรับการใช้งาน cache Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Route สำหรับการใช้งานฐานข้อมูล 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สร้างไฟล์ Controller
ภายใต้โฟลเดอร์
app/controller
สร้างไฟล์IndexController.php
,CacheController.php
และDatabaseController.php
ตามรายละเอียดต่อไปนี้app/controller/IndexController.php
: สำหรับการจัดการ root pathphp<?php namespace app\controller; use support\Request; use support\Response; // นำเข้า Response class class IndexController { /** * เมธอดตัวอย่างสำหรับตอบกลับ root path * @param Request $request อ็อบเจ็กต์ request ปัจจุบัน * @return Response คืนค่า response กลับ */ public function index(Request $request): Response // กำหนดชนิดข้อมูลคืนค่า { // คืนค่า 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 และ Redisphp<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // นำเข้า Memcached class use support\Redis; // นำเข้า Redis Facade จาก 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); // อัปเดต key และ value if (!$success) { return response('Failed to set Memcached key', 500); } // ดึงค่าแคช $value = $memcached->get('servbay_key'); // อัปเดต key // คืนค่าที่ได้ return response($value ?: 'Memcached key not found or expired'); // เพิ่มข้อความแจ้งหากไม่พบค่าหรือหมดอายุ } /** * ตัวอย่างใช้งาน Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // ใช้ Redis Facade ของ Webman ตั้งค่าแคช Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // อัปเดต key และ value // ดึงค่าแคช $value = Redis::get('servbay_redis_key'); // อัปเดต 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 และ PostgreSQLphp<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // นำเข้า Db Facade ของ Webman class DatabaseController { /** * เพิ่มผู้ใช้ไปยัง MySQL Database * @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]', // อัปเดตอีเมลตัวอย่าง '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 Database * @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 Database * @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' => '[email protected]', // อัปเดตอีเมลตัวอย่าง 'created_at' => date('Y-m-d H:i:s') // เพิ่ม created_at ]); return response('User added to PostgreSQL'); // อัปเดตข้อความตอบกลับ } catch (\Exception $e) { return response('Error adding user to PostgreSQL: ' . $e->getMessage(), 500); } } /** * ดึงรายชื่อผู้ใช้จาก PostgreSQL Database * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // ขอข้อมูลผู้ใช้จาก pgsql $users = Db::connection('pgsql')->table('users')->get(); // คืนค่าเป็น 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
ตั้งค่าการเชื่อมต่อฐานข้อมูล
แก้ไขไฟล์
config/database.php
ใน root ของโปรเจกต์ กำหนดข้อมูลเชื่อมต่อ MySQL และ PostgreSQL โดยค่าปริยาย host ใช้127.0.0.1
port คือ3306
(MySQL) และ5432
(PostgreSQL) user:root
, password:password
php<?php /** * คอนฟิกฐานข้อมูล */ return [ // การเชื่อมต่อฐานข้อมูลเริ่มต้น 'default' => 'mysql', // รายการการเชื่อมต่อฐานข้อมูล 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // Host และ port ของ MySQL ใน ServBay 'host' => '127.0.0.1', 'port' => 3306, // ชื่อ database ที่สร้างไว้ก่อนหน้านี้ 'database' => 'webman_app', // ชื่อผู้ใช้ MySQL ใน ServBay 'username' => 'root', // รหัสผ่าน MySQL ใน ServBay 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // Host และ port ของ PostgreSQL ใน ServBay 'host' => '127.0.0.1', 'port' => 5432, // ชื่อ database ที่สร้างไว้ก่อนหน้านี้ 'database' => 'webman_app', // ชื่อผู้ใช้ PostgreSQL ใน ServBay 'username' => 'root', // รหัสผ่าน PostgreSQL ใน ServBay '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ข้อควรระวัง: สำหรับ production ห้ามใช้รหัสผ่านคงที่ และอย่า hardcode ข้อมูลสำคัญลงในโค้ด
การรันโปรเจกต์ Webman
ปกติแล้ว Webman จะรัน Workerman process โดยใช้สคริปต์ start.php
ต่างจากการใช้ Nginx/Apache + PHP-FPM เพราะ Webman คือแอปอะซิงโครนัสที่อยู่ในหน่วยความจำตลอด
ใน root directory ของโปรเจกต์ (/Applications/ServBay/www/servbay-webman-app
) ให้รันคำสั่งต่อไปนี้:
bash
php start.php start
1
หลังรันแล้วจะเห็นข้อมูลการสตาร์ท Webman โดยจะรับฟัง HTTP ที่ 127.0.0.1:8787
ตามค่าเริ่มต้น
- หมายเหตุ: คำสั่ง php ที่ใช้ที่นี่เป็น PHP ของ ServBay ซึ่ง ServBay จะตั้งค่า environment อัตโนมัติให้เทอร์มินัล
- หากต้องการรัน Webman แบบ background ใช้พารามิเตอร์
-d
:php start.php start -d
- เพื่อหยุดบริการ ใช้:
php start.php stop
- รีสตาร์ท:
php start.php restart
- รีโหลดแบบสมูท (ไม่รบกวนการให้บริการปัจจุบัน):
php start.php reload
การทดสอบโปรเจกต์
เมื่อ Webman start สำเร็จและรอฟังที่ 127.0.0.1:8787
สามารถทดสอบแต่ละฟีเจอร์ผ่านเบราว์เซอร์ได้ที่:
http://localhost:8787/
: จะแสดงHello ServBay & Webman!
http://localhost:8787/memcached
: จะแสดงHello Memcached from ServBay!
หมายถึงการเชื่อมต่อ Memcached ใน ServBay สำเร็จhttp://localhost:8787/redis
: จะแสดงHello Redis from ServBay!
หมายถึงการเชื่อมต่อ Redis ใน ServBay สำเร็จhttp://localhost:8787/mysql-add
: จะแสดงUser added to MySQL
พร้อมบันทึกข้อมูลผู้ใช้ตัวอย่างลงusers
table ของ MySQLhttp://localhost:8787/mysql
: แสดงข้อมูลผู้ใช้ (ในusers
ของ MySQL) เป็น JSONhttp://localhost:8787/pgsql-add
: จะแสดงUser added to PostgreSQL
พร้อมบันทึกข้อมูลผู้ใช้ตัวอย่างลงusers
table ของ PostgreSQLhttp://localhost:8787/pgsql
: แสดงข้อมูลผู้ใช้ (ในusers
ของ PostgreSQL) เป็น JSON
หากพบปัญหาใดๆ ในการเข้าถึง URL เหล่านี้ กรุณาเช็คที่ output ของ Webman ใน terminal ตรวจสอบซอฟต์แวร์แต่ละตัว (MySQL, PostgreSQL, Redis, Memcached) และการเปิด PHP extension ที่กล่าวไว้ข้างต้น
คำถามที่พบบ่อย (FAQ)
- Q: รัน
php start.php start
แล้วไม่เจอสคริปต์?- A: ตรวจสอบว่าได้ย้ายไปยังโฟลเดอร์
servbay-webman-app
แล้ว และ PHP ของ ServBay ถูกตั้งไว้ใน PATH ของระบบ (โดยปกติ ServBay จะตั้งอัตโนมัติ)
- A: ตรวจสอบว่าได้ย้ายไปยังโฟลเดอร์
- Q: เข้าถึง
localhost:8787
ไม่ได้ / เชื่อมต่อไม่สำเร็จ?- A: ตรวจสอบ output ใน terminal ขณะรัน
php start.php start
และดูว่ามี error หรือไม่ ดูว่า port 8787 ถูกโปรแกรมอื่นใช้หรือเปล่า หากถูกใช้ ให้แก้ไข config เช่นในconfig/server.php
เพื่อเปลี่ยน port
- A: ตรวจสอบ output ใน terminal ขณะรัน
- Q: เชื่อมต่อฐานข้อมูลไม่ได้?
- A: ตรวจเช็คว่าแพ็กเกจ MySQL และ PostgreSQL ใน ServBay กำลังรันอยู่ ข้อมูลใน
config/database.php
(host, port, db, user, password) ต้องตรงกับใน ServBay (เริ่มต้น user: root, password: password) และสร้าง databasewebman_app
กับ tableusers
เรียบร้อยแล้ว
- A: ตรวจเช็คว่าแพ็กเกจ MySQL และ PostgreSQL ใน ServBay กำลังรันอยู่ ข้อมูลใน
- Q: เชื่อมต่อ Memcached หรือ Redis ไม่ได้?
- A: เช็คว่าซอฟต์แวร์ทั้งสองรันใน ServBay แล้ว ตำแหน่งและ port ใน
app/controller/CacheController.php
ต้องถูกต้อง (127.0.0.1:11211
และ127.0.0.1:6379
) รวมทั้งเปิด extensionmemcached
และredis
ใน PHP ที่ใช้งาน
- A: เช็คว่าซอฟต์แวร์ทั้งสองรันใน ServBay แล้ว ตำแหน่งและ port ใน
สรุป
เมื่อดำเนินการตามขั้นตอนข้างต้นแล้ว คุณจะสามารถสร้าง ตั้งค่า และรันโปรเจกต์ Webman เบื้องต้นบนสภาพแวดล้อมพัฒนาโลคอลของ ServBay ได้สำเร็จ คุณได้เรียนรู้การใช้ระบบแบบ all-in-one ของ ServBay เพื่อเร่งพัฒนาแอปฯ PHP อะซิงโครนัส รวมถึงการเชื่อมต่อฐานข้อมูลและ cache การผสานประสิทธิภาพของ Webman กับความสะดวกของ ServBay จะช่วยให้การสร้างแอป PHP อะซิงโครนัสมีศักยภาพเต็มที่ หวังว่าคู่มือนี้จะเป็นประโยชน์และสร้างแรงบันดาลใจให้คุณใช้งาน ServBay และ Webman ได้อย่างมั่นใจ!