การติดตั้งและรัน Workerman บน ServBay
ภาพรวม
เอกสารฉบับนี้จัดทำขึ้นเพื่อแนะนำผู้ใช้ ServBay ในการตั้งค่าสภาพแวดล้อมการพัฒนา macOS ของตน โดยใช้ PHP และ Composer ที่รวมมาใน ServBay เพื่อสร้างและเรียกใช้แอปพลิเคชันเครือข่ายประสิทธิภาพสูงซึ่งพัฒนาโดยใช้ Workerman อย่างรวดเร็ว Workerman เป็นไลบรารี PHP ทรงพลังที่ออกแบบมาสำหรับงานที่ต้องการการจัดการการเชื่อมต่อแบบพร้อมกันสูง เช่น เซิร์ฟเวอร์เว็บ เซิร์ฟเวอร์แชทแบบเรียลไทม์ รวมถึงเซิร์ฟเวอร์เกม เป็นต้น ServBay มอบแพลตฟอร์มที่ใช้งานได้ทันที ช่วยลดขั้นตอนการติดตั้ง Workerman ให้ง่ายดายยิ่งขึ้น
Workerman คืออะไร?
Workerman คือ เฟรมเวิร์กโอเพ่นซอร์สสำหรับการสื่อสารเครือข่ายแบบอะซิงโครนัสประสิทธิภาพสูงที่พัฒนาด้วยภาษา PHP ทั้งหมด มันเป็นระบบที่ใช้ EventLoop สำหรับจัดการ I/O แบบไม่บล็อก ช่วยให้รองรับการเชื่อมต่อจำนวนมากในเวลาเดียวกันได้ โดยต่างจากโมเดล PHP เดิม (เช่น Apache/Nginx + PHP-FPM) แอป Workerman ทำงานแบบ process resident ในหน่วยความจำและรับฟังการเชื่อมต่อที่พอร์ตที่ระบุโดยตรง ช่วยลดค่าดำเนินการที่เกิดจากการสร้างและทำลาย process ตลอดเวลา จึงให้ทั้งประสิทธิภาพและปริมาณงานที่สูงกว่าอย่างชัดเจน
ด้วย Workerman คุณสามารถสร้าง:
- เซิร์ฟเวอร์ HTTP ประสิทธิภาพสูง (แทนเซิร์ฟเวอร์ Apache/Nginx สำหรับงานง่ายๆ ได้)
- เซิร์ฟเวอร์ WebSocket แบบเรียลไทม์ เหมาะสำหรับแชท การ push data ฯลฯ
- เซิร์ฟเวอร์ TCP/UDP ตามโปรโตคอลที่ปรับแต่งเองได้
- CLI tools, งาน schedule, หรือ microservices
คุณสมบัติหลักและข้อดีของ Workerman
- ประสิทธิภาพสูง: ใช้งาน event-driven และ I/O ไม่บล็อก รองรับการเชื่อมต่อจำนวนมากพร้อมกันอย่างดีเยี่ยม
- รองรับหลายโปรโตคอล: มีโปรโตคอล HTTP, WebSocket, TCP, UDP ในตัว และกำหนดโปรโตคอลเองได้ตามต้องการ
- ใช้งานง่าย: API ที่กระชับ เข้าใจง่าย ลดความซับซ้อนในการพัฒนา network asynchronous นักพัฒนา PHP เริ่มต้นได้รวดเร็ว
- ขยายได้ยืดหยุ่น: สนับสนุนโมเดล multi-process รองรับ CPU แบบหลายแกน, ไฮบริดกับ Composer และไลบรารี PHP อื่นๆ ได้สบาย
- บูรณาการใน PHP ecosystem: ใช้ร่วมกับ Composer และแพ็กเกจ PHP มาตรฐานได้ดีเยี่ยม
- โหมด daemon (เบื้องหลัง): รันแบบ background เหมาะสำหรับการ deploy ใน production รับประกันความเสถียรและต่อเนื่องของบริการ
Workerman เปิดขอบเขตให้กับนักพัฒนา PHP สำหรับแอปเรียลไทม์ รองรับการเชื่อมต่อสูง และระบบขนาดใหญ่ได้อย่างแท้จริง
การเตรียมสภาพแวดล้อม Workerman บน ServBay
ServBay คือเครื่องมือสำหรับนักพัฒนาเว็บโดยเฉพาะ รวบรวม runtime ของภาษายอดนิยม เช่น PHP, Node.js, Python, Go, Java พร้อมฐานข้อมูลและซอฟต์แวร์เซิร์ฟเวอร์ชื่อดัง ได้แก่ Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached จุดแข็งสำคัญคือใช้งานได้ทันทีโดยไม่ต้อง config อะไรมาก Composer ติดตั้งไว้แล้ว ทำให้การเริ่มต้นโปรเจกต์ Workerman ทำได้รวดเร็วมาก
คู่มือนี้จะสาธิตโดยใช้โปรเจกต์ตัวอย่างพื้นฐาน 3 ตัว ได้แก่ HTTP server, WebSocket server และ TCP server ด้วย Workerman บน ServBay
TIP
เพื่อให้จัดการง่ายและเหมาะสมกับมาตรฐาน ขอแนะนำให้เก็บไฟล์โปรเจกต์ทั้งหมดในเครื่องไว้ที่ไดเรคทอรี /Applications/ServBay/www
ตัวอย่างในเอกสารนี้ทุกที่อยู่ไฟล์จะยึดตามนี้
ข้อกำหนดก่อนเริ่มต้น
โปรดตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้ครบถ้วน:
- ติดตั้งและเปิดใช้งาน ServBay เรียบร้อยแล้ว: ดาวน์โหลดและติดตั้ง ServBay เวอร์ชันล่าสุดได้ที่ ServBay เว็บไซต์ทางการ
- เปิดใช้งาน PHP บน ServBay แล้ว: ตรวจสอบจากหน้าควบคุม ServBay ว่า PHP เวอร์ชันที่ต้องการใช้งานเปิดอยู่ Workerman ต้องการ PHP 5.4 ขึ้นไป (ขอแนะนำ PHP 7.x หรือ 8.x เพื่อประสิทธิภาพสูงสุด)
- มีพื้นฐาน PHP และ command line: ควรเข้าใจไวยากรณ์พื้นฐานของ PHP และใช้งานคำสั่งบน terminal ได้
ติดตั้ง Workerman
1. ตรวจสอบ Composer
ServBay รวม Composer ไว้ให้แล้ว ไม่ต้องติดตั้งเพิ่ม เพียงตรวจสอบว่าได้เปิดใช้งาน PHP ที่ต้องการ และ ServBay ได้ปรับแต่ง composer สำหรับ PHP version นั้นๆ ให้เรียบร้อยแล้ว คุณสามารถใช้ Terminal ใน ServBay หรือ terminal ภายนอก (หากได้ตั้งค่า PATH แล้ว) เพื่อเข้า environment ของ PHP
ทดสอบว่า composer ใช้งานได้โดยรัน:
bash
composer -v
1
หาก composer ติดตั้งถูกต้อง จะเห็นหมายเลขเวอร์ชัน หากไม่พบคำสั่ง ให้ตรวจสอบว่า ServBay ทำงานอยู่และเปิด PHP รุ่นที่ต้องการหรือไม่
2. สร้างโฟลเดอร์โปรเจกต์ใหม่
ไปที่ไดเรคทอรีแนะนำของ ServBay จากนั้นสร้างและเข้าไปยังโฟลเดอร์ใหม่:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
ตัวอย่างนี้ตั้งชื่อโปรเจกต์ว่า servbay-workerman-demo
3. ติดตั้ง Workerman ด้วย Composer
ในไดเรคทอรีโปรเจกต์ (/Applications/ServBay/www/servbay-workerman-demo
) ให้ติดตั้งไลบรารี Workerman ด้วย Composer
bash
composer require workerman/workerman
1
Composer จะดาวน์โหลด workerman และ dependencies ไปไว้ในโฟลเดอร์ vendor
โดยอัตโนมัติ
เขียนโค้ดเซิร์ฟเวอร์ HTTP ด้วย Workerman
เซิร์ฟเวอร์ HTTP เป็นสถานการณ์ใช้งานที่พบได้บ่อย ทำงานได้ทั้งรับโหลดเว็บไซต์หรือ API ประสิทธิภาพสูง
สร้างไฟล์ชื่อ http_server.php
(หรือชื่ออื่นที่ต้องการ เช่น server.php
) แล้วใส่โค้ดต่อไปนี้:
php
<?php
// ดึง autoload ของ Composer เพื่อใช้งานคลาส Workerman
require __DIR__ . '/vendor/autoload.php';
// นำเข้า Worker และคลาสที่จำเป็น
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// สร้าง Worker สำหรับ HTTP ระบุโปรโตคอล+พอร์ต
// 'http://0.0.0.0:8080' จะฟังทุก IP ในเครื่องและพอร์ต 8080
$http_worker = new Worker('http://0.0.0.0:8080');
// กำหนดจำนวน process ที่จะรัน
// 4 หมายถึงจะรัน PHP 4 process แยกเพื่อรองรับโหลด (ปรับตามจำนวน core CPU)
$http_worker->count = 4;
// ระบุ logic เวลารับ message (HTTP request) จาก client
// $connection คืออ็อบเจ็กต์เชื่อมต่อ, $request คือข้อมูลที่ client ส่งมา
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// ตอบกลับ plain text ให้ client (HTTP response)
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// สั่งรัน Worker ทั้งหมด
Worker::runAll();
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
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
อธิบายโค้ด:
require __DIR__ . '/vendor/autoload.php';
: โหลดไฟล์ autoloader ของ Composer สำหรับใช้คลาสต่าง ๆ ใน workermanuse Workerman\...;
: นำเข้า class ที่จำเป็นnew Worker('http://0.0.0.0:8080')
: สร้างอินสแตนซ์ listener บนพอร์ต 8080 ทุกอินเตอร์เฟส (เหมาะสำหรับ dev หรือบน LAN)$http_worker->count = 4;
: ตั้งจำนวน process เพื่อรองรับโหลดมากขึ้น$http_worker->onMessage = function(...) {...};
: callback เมื่อมี HTTP request เข้ามา, ใช้ $connection ส่ง response, ใช้ $request ตรวจสอบข้อมูลลูกค้าWorker::runAll();
: เริ่มต้น main event loop สำหรับทุก Worker ที่สร้างไว้
การรันเซิร์ฟเวอร์ HTTP ด้วย Workerman
ในโฟลเดอร์โปรเจกต์ (/Applications/ServBay/www/servbay-workerman-demo
), รันคำสั่ง:
bash
php http_server.php start
1
โหมดการรัน:
- โหมด foreground: จะเห็น log บนหน้าจอ หยุดได้ด้วย
Ctrl+C
เหมาะสำหรับ dev และ debug - โหมด daemon (เบื้องหลัง): ใช้
-d
เพื่อรันเป็น background processbashlog จะถูกส่งไปยังไฟล์ log อัตโนมัติphp http_server.php start -d
1
การจัดการ process:
Workerman มีคำสั่งควบคุม process ดังนี้:
- เริ่ม:
php http_server.php start
(หน้า terminal) หรือphp http_server.php start -d
(background) - หยุด:
php http_server.php stop
(หยุดแบบ graceful) - รีสตาร์ท:
php http_server.php restart
(หยุดแล้วเริ่มใหม่) - รีโหลด:
php http_server.php reload
(เหมาะสำหรับอัปเดตโค้ด, จะ restart process ทีละตัว) - ดูสถานะ:
php http_server.php status
(ดู memory, connection, ฯลฯ)
เปิดเบราว์เซอร์ แล้วเข้า http://localhost:8080
หรือ http://127.0.0.1:8080
จะเห็นข้อความว่า Hello ServBay Workerman HTTP Server!
สร้าง WebSocket Server ด้วย Workerman
WebSocket เหมาะกับงานเรียลไทม์ (chat, market, game ฯลฯ) Workerman รองรับ WebSocket ได้ดี
สร้างไฟล์ WebSocket server
สร้างไฟล์
websocket_server.php
ใส่โค้ดต่อไปนี้:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // สร้าง WebSocket server ฟังพอร์ต 8081 // Workerman จะจัดการ handshake ให้อัตโนมัติ $ws_worker = new Worker('websocket://0.0.0.0:8081'); // ตั้ง process 4 ตัว $ws_worker->count = 4; // logic เมื่อเชื่อมต่อใหม่ $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // logic รับข้อความ $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // ส่งคืน client $connection->send('ServBay Workerman received: ' . $data); }; // logic เมื่อถูกตัดการเชื่อมต่อ $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // logic เมื่อเกิดข้อผิดพลาด (option) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; Worker::runAll();
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รัน WebSocket server
ในไดเรคทอรีโปรเจกต์ รัน:
bashphp websocket_server.php start
1ใช้
-d
ถ้าต้องการรันเบื้องหลัง หลังเริ่มแล้วทดสอบเชื่อมต่อที่ws://localhost:8081
ทดสอบใน browser console ด้วย JavaScript:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket connection opened"); ws.send("Hello from Browser!"); // ส่งข้อความ }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // รับข้อความ }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket connection closed cleanly, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket connection died"); } }; ws.onerror = function(error) { console.error("WebSocket error:", error); }; // ปิดการเชื่อมต่อ (ถ้าต้องการ) // ws.close();
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เมื่อเชื่อมต่อสำเร็จ terminal จะโชว์ข้อความสถานะ, ข้อความที่ส่งจะ echo กลับมาทันที
สร้าง TCP Server ด้วย Workerman
Workerman ยังเหมาะสำหรับ server TCP ทั่วไป เช่น เกม, IoT, ระบบสื่อสารพิเศษ ฯลฯ
สร้างไฟล์ TCP server
สร้างไฟล์
tcp_server.php
:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // สร้าง TCP server ฟังพอร์ต 8082 (protocol text โดยค่าเริ่มต้น) $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // ตั้ง process 4 ตัว $tcp_worker->count = 4; // logic เมื่อเชื่อมต่อใหม่ $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // ส่งข้อความต้อนรับ $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // logic รับข้อมูล (message) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // echo กลับหา client $connection->send('ServBay Workerman received: ' . $data); }; // logic เมื่อเชื่อมต่อหลุด $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; Worker::runAll();
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รัน TCP server
ในไดเรคทอรีโปรเจกต์ รัน:
bashphp tcp_server.php start
1ใช้
-d
ถ้าต้องการรัน background หลังรันใช้ TCP client เช่น telnet หรือ nc เพื่อเชื่อมต่อไปที่localhost:8082
ตัวอย่าง (บน macOS/Linux):
bash# ใช้ telnet telnet localhost 8082 # หรือ nc (netcat) nc localhost 8082
1
2
3
4
5เมื่อเชื่อมต่อสำเร็จจะเห็นข้อความต้อนรับ server, พิมพ์อะไรเข้าไป (แล้ว enter) server จะ echo กลับทันที
หมายเหตุและข้อควรระวัง
- พอร์ตถูกใช้งานอยู่: ตรวจสอบว่าพอร์ต (ในตัวอย่าง 8080, 8081, 8082) ไม่ถูกโปรแกรมอื่นของ macOS หรือ ServBay ใช้อยู่ ถ้ามีการชน Workerman จะขึ้น error ตรวจสอบด้วยคำสั่ง
lsof -i :พอร์ต
- ไฟร์วอลล์: ปกติ macOS firewall ไม่บล็อก localhost แต่หากเชื่อมต่อจากอุปกรณ์อื่นใน LAN อาจต้องตั้งค่ารับ incoming port เพิ่มเติม
- ความสัมพันธ์กับเว็บเซิร์ฟเวอร์ ServBay: Workerman จะฟังพอร์ตของตนเองต่างหาก ไม่เกี่ยวกับ Caddy/Nginx ใน ServBay เป็นกระบวนการอิสระ ใช้สำหรับแอปโหลดสูงหรืองาน long connection (WebSocket) web server ปกติจะเหมาะกับงาน HTTP request ธรรมดา
- เวอร์ชัน PHP: ตรวจสอบว่าเวอร์ชัน PHP บน ServBay ตรงตามที่ Workerman รองรับ (5.4 ขึ้นไป); เลือกเวอร์ชันใน ServBay panel ได้ตามโครงการ
- การขยาย/extension: Workerman จะทำงานได้ดีที่สุดเมื่อ PHP ติดตั้ง extension สำคัญ (
event
,posix
,pcntl
) ซึ่ง ServBay ติดตั้งมาเกือบหมดแล้ว หากพบปัญหาโปรดตรวจสอบการเปิดใช้งาน extension ในแผงควบคุม - log: ถ้ารันแบบ daemon ผลลัพธ์จะไปเก็บในไฟล์ log ควรตรวจสอบ log เป็นระยะเพื่อติดตามปัญหา
คำถามที่พบบ่อย (FAQ)
- Q: จะหยุดเซิร์ฟเวอร์ Workerman ได้อย่างไร?
- A: ถ้ารัน foreground (ไม่ใส่ -d) ให้กด
Ctrl+C
ที่ terminal ได้เลย ถ้ารันเป็น daemon (ใส่ -d) ให้ใช้งานphp your_server_file.php stop
จากไดเรคทอรีโปรเจกต์
- A: ถ้ารัน foreground (ไม่ใส่ -d) ให้กด
- Q: Workerman ไม่สามารถเริ่มติดตั้งได้?
- A: ส่วนใหญ่เกิดจากพอร์ตถูกใช้งานอยู่ ตรวจสอบ log หรือ error ที่แสดง ถ้าติดปัญหา port ให้เปลี่ยนพอร์ตหรือหยุดโปรแกรมเจ้าของพอร์ตนั้น ใช้
lsof -i :พอร์ต
ตรวจสอบได้
- A: ส่วนใหญ่เกิดจากพอร์ตถูกใช้งานอยู่ ตรวจสอบ log หรือ error ที่แสดง ถ้าติดปัญหา port ให้เปลี่ยนพอร์ตหรือหยุดโปรแกรมเจ้าของพอร์ตนั้น ใช้
- Q: Caddy/Nginx ของ ServBay กับ Workerman ต่างกันอย่างไร? ควรใช้อะไร?
- A: Caddy/Nginx เป็นเว็บเซิร์ฟเวอร์แบบดั้งเดิม ทำงานกับ PHP-FPM ทุก request จะจบเป็นรอบๆ เหมาะสำหรับเว็บหรือ API ทั่วไป Workerman เป็นเฟรมเวิร์ก PHP ที่รองรับ long connection, async, โปรโตคอลหลายแบบ (HTTP, WebSocket, TCP) เหมาะกับงานที่ต้องรองรับโหลดสูงหรือการเชื่อมต่อแบบต่อเนื่อง แนะนำใช้ตามวัตถุประสงค์ เช่น ถ้าเป็นเว็บปกติหรือ REST API ใช้ Caddy/Nginx ถ้าเป็น chat, game, IoT ใช้ Workerman (สามารถใช้ร่วมกัน/proxy ได้)
- Q: สามารถรันหลาย Workerman app พร้อมกันใน ServBay ได้หรือไม่?
- A: ได้ ทุก Workerman app ใช้ process แยกและพอร์ตแยก ขอแค่ไม่ชนพอร์ตกัน ใช้งานได้พร้อมกันเลย
สรุป
จากคู่มือฉบับนี้ คุณเรียนรู้วิธีการติดตั้ง สร้าง และรันโปรเจกต์ Workerman ด้วย ServBay ได้อย่างง่ายดาย Workerman ให้ศักยภาพกับนักพัฒนา PHP ในการสร้างระบบเครือข่ายประสิทธิภาพสูงที่รองรับการเชื่อมต่อมากมายแบบเรียลไทม์ บวกกับความสะดวกของสภาพแวดล้อมที่ ServBay มอบให้ (Composer, PHP, ฯลฯ) คุณจะโฟกัสกับพัฒนา logic หลักของแอปได้เต็มที่โดยไม่ต้องเสียเวลาปรับแต่ง environment ไม่ว่าจะเป็นเซิร์ฟเวอร์เว็บ โหลดสูง หรือแอป WebSocket, ServBay คือคู่หูสำหรับนักพัฒนา Workerman ที่ยอดเยี่ยม ขอให้สนุกกับโลกของ Workerman!