การติดตั้งและรันแอปพลิเคชัน Workerman ใน ServBay
ภาพรวม
เอกสารนี้มีเป้าหมายเพื่อแนะนำผู้ใช้ ServBay ในการติดตั้งและรันแอปพลิเคชันเครือข่าย PHP ประสิทธิภาพสูงโดยใช้ Workerman ภายใน macOS และ Windows ด้วยสภาพแวดล้อม PHP และ Composer ที่ติดตั้งมาแล้วใน ServBay คุณสามารถสร้างและใช้งานแอป Workerman สำหรับงานที่ต้องการการเชื่อมต่อพร้อมกันจำนวนมาก เช่น เซิร์ฟเวอร์เว็บ เซิร์ฟเวอร์แชทแบบเรียลไทม์ เซิร์ฟเวอร์เกม ฯลฯ ServBay คือตัวเลือกที่สมบูรณ์สำหรับนักพัฒนา PHP ลดภาระในการตั้งค่าสิ่งแวดล้อม Workerman ได้อย่างมาก
Workerman คืออะไร?
Workerman เป็นเฟรมเวิร์กเครือข่ายแบบอะซิงโครนัสสำหรับ PHP ที่ใช้โครงสร้างอีเวนท์ลูป (EventLoop) ทำให้รองรับการเชื่อมต่อพร้อมกันจำนวนมากด้วยการ I/O แบบไม่บล็อก แตกต่างจากแนวทาง PHP web ทั่วไป (เช่น Apache/Nginx + PHP-FPM) Workerman ทำงานแบบประจำอยู่ในหน่วยความจำโดยตรง ฟังพอร์ตที่กำหนด และควบคุมการเชื่อมต่อโดยตรง ลดค่าใช้จ่ายของการสร้างและทำลาย process ใหม่ในแต่ละครั้ง ทำให้มีประสิทธิภาพและ throughput สูง
คุณสามารถใช้ Workerman สร้างแอปพลิเคชันประเภทต่อไปนี้ได้อย่างมีประสิทธิภาพ:
- เซิร์ฟเวอร์ HTTP ประสิทธิภาพสูง (สามารถใช้แทน Apache/Nginx สำหรับงานง่าย ๆ ได้)
- เซิร์ฟเวอร์ WebSocket สำหรับการสร้างแอปแบบเรียลไทม์ เช่น ห้องสนทนา หรือระบบแจ้งเตือนข้อมูลสด
- เซิร์ฟเวอร์ TCP/UDP ที่ใช้โปรโตคอลแบบกำหนดเอง
- เครื่องมือ command-line, งานตามเวลาที่ตั้ง หรือระบบ microservices
จุดเด่นและข้อได้เปรียบของ Workerman
- ประสิทธิภาพสูง: โครงสร้างแบบ event-driven และ I/O แบบไม่บล็อก ช่วยรองรับการเชื่อมต่อครั้งละมาก ๆ ได้อย่างมีประสิทธิภาพ
- รองรับหลายโปรโตคอล: HTTP, WebSocket, TCP, UDP และรองรับโปรโตคอลกำหนดเอง
- ใช้งานง่าย: API เข้าใจง่าย ลดความซับซ้อนของโปรแกรมเครือข่าย PHP อะซิงโครนัส
- รองรับการขยาย: มีระบบ process หลายตัว รองรับ CPU แบบหลายคอร์ และรองรับ Composer ในการบริหารแพ็คเกจ
- ผสาน PHP ecosystem: ทำงานเป็น PHP library ใช้ร่วมกับไลบรารีอื่นหรือ Composer ได้ง่าย
- โหมด Daemon: รองรับการทำงานแบบเบื้องหลัง (daemon) สำหรับ production
Workerman เปิดโอกาสให้นักพัฒนา PHP สร้างแอปเครือข่ายที่ประสิทธิภาพสูงและให้บริการแบบเรียลไทม์
การติดตั้งสภาพแวดล้อม Workerman บน ServBay
ServBay เป็นเครื่องมือสภาพแวดล้อมสำหรับนักพัฒนาเว็บแบบโลคอล ติดตั้งมาให้พร้อมใช้กับภาษาและเครื่องมือสำคัญมากมาย เช่น PHP, Node.js, Python, Go, Java, Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached เป็นต้น จุดเด่นหลักคือ “เปิดกล่องพร้อมใช้” โดยเฉพาะ Composer ที่ตั้งค่าไว้แล้ว ทำให้สร้างและรันโปรเจค Workerman ได้ทันที
คู่มือนี้สาธิตวิธีสร้างและรันตัวอย่าง Workerman ใน ServBay เช่น เซิร์ฟเวอร์ HTTP แบบง่าย เซิร์ฟเวอร์ WebSocket และเซิร์ฟเวอร์ TCP
TIP
เพื่อความเป็นระเบียบและง่ายต่อการจัดการ ServBay แนะนำให้เก็บไฟล์โปรเจคเว็บไซต์ในโฟลเดอร์ต่อไปนี้:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
ตัวอย่าง path ในเอกสารนี้จะใช้งานจาก directory ดังกล่าว
ข้อกำหนดเบื้องต้น
ก่อนเริ่มใช้งาน ต้องแน่ใจว่ามีสิ่งเหล่านี้:
- ติดตั้งและรัน ServBay แล้ว: ดาวน์โหลดจาก ServBay เว็บไซต์ทางการ และติดตั้งเวอร์ชันล่าสุด
- PHP ถูกเปิดใช้งานใน ServBay: เปิดใช้งาน PHP เวอร์ชันที่ต้องการในแผงควบคุม ServBay Workerman ต้องการ PHP 5.4 ขึ้นไป (แนะนำ PHP 7.x หรือ 8.x)
- พื้นฐาน PHP และ command line: ควรเข้าใจภาษา PHP และวิธีใช้งานเครื่องมือบน terminal
ติดตั้ง Workerman
1. ตรวจสอบ Composer
ServBay ติดตั้ง Composer ไว้แล้ว ไม่ต้องติดตั้งเพิ่ม เพียงเปิด ServBay และ PHP เวอร์ชันที่ต้องการ Composer จะทำงานโดยอัตโนมัติ สามารถใช้ terminal ของ ServBay หรือจากภายนอก (ถ้า PATH ถูกเพิ่มแล้ว) เพื่อใช้ Composer
ตรวจสอบ Composer ด้วยคำสั่ง:
bash
composer -v
1
หากตั้งค่าถูกต้องจะเห็นข้อมูลเวอร์ชัน Composer หากไม่พบคำสั่ง ให้ตรวจสอบว่า ServBay รันอยู่และ PHP เปิดใช้งานแล้ว
2. สร้างโฟลเดอร์โปรเจค
เข้าไปในโฟลเดอร์ที่แนะนำโดย ServBay สร้าง directory ใหม่ของโปรเจค และเข้าไปใน directory นั้น:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
เราจะใช้ directory servbay-workerman-demo
สำหรับไฟล์โปรเจค Workerman ของเรา
3. ติดตั้ง Workerman ด้วย Composer
ใน directory โปรเจค ใช้ Composer ติดตั้งไลบรารี Workerman (Composer จัดการ dependency อัตโนมัติ):
ตัวอย่าง path โปรเจค:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
Composer จะดาวน์โหลด Workerman พร้อม dependency ไว้ในโฟลเดอร์ vendor
ของโปรเจค
เขียนโค้ดเซิร์ฟเวอร์ HTTP ด้วย Workerman
เซิร์ฟเวอร์ HTTP เป็นหนึ่งในกรณีใช้งานยอดนิยมของ Workerman สำหรับสร้างเว็บแอปหรือ API แบบประสิทธิภาพสูง
สร้างไฟล์ชื่อ http_server.php
(หรือชื่ออื่นที่คุณต้องการ) แล้วใส่โค้ด PHP ดังนี้
php
<?php
// นำเข้าไฟล์ autoload ของ Composer เพื่อใช้คลาส Workerman
require __DIR__ . '/vendor/autoload.php';
// นำเข้า Worker ของ Workerman
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// สร้างอินสแตนซ์ Worker ระบุ protocol กับ address ที่จะ listen
// 'http://0.0.0.0:8080' หมายถึงเซิร์ฟเวอร์ HTTP listen ที่พอร์ต 8080 ทุก network interface
// 0.0.0.0 เปิดให้เข้าถึงทั้งเครื่องตัวเองและเครื่องใน LAN; 8080 คือพอร์ตที่ใช้ listen
$http_worker = new Worker('http://0.0.0.0:8080');
// ตั้งจำนวน worker process
// ตรงนี้ตั้งเป็น 4 คือรัน 4 process PHP สามารถปรับตามจำนวนคอร์ในเครื่อง
$http_worker->count = 4;
// กำหนด logic เมื่อรับข้อความ (HTTP request) จาก client
// $connection คืออ็อบเจ็กต์สำหรับส่ง response กลับ
// $request คืออ็อบเจ็กต์ request ซึ่งมีรายละเอียด URL, headers, body ฯลฯ
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// ส่ง response กลับแบบง่าย
// Workerman จะจัดการ HTTP header อัตโนมัติ
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// รัน worker ทั้งหมด
// เป็นอีเวนท์ลูปหลักของ Workerman เมื่อสั่งรันแล้ว worker จะ listen port และจัดการ event ต่าง ๆ
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
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
คำอธิบายโค้ด:
require __DIR__ . '/vendor/autoload.php';
: โหลดไฟล์ autoloader ของ Composer เพื่อใช้งานคลาส Workermanuse Workerman\...;
: นำเข้า class ที่ต้องใช้new Worker('http://0.0.0.0:8080')
: สร้าง instance เซิร์ฟเวอร์ใหม่ ระบุ protocol และ address$http_worker->count = 4;
: กำหนดจำนวน process ที่จะรัน สามารถตั้งมากหรือน้อยตามจำนวนคอร์เครื่อง$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... }
: ระบุ callback เมื่อรับ HTTP requestWorker::runAll();
: รันอีเวนท์ลูปของ Workerman ให้ worker ทั้งหมดเริ่ม listen และตอบกลับ
การรันเซิร์ฟเวอร์ HTTP ด้วย Workerman
เข้าไปในโฟลเดอร์โปรเจคแล้วรันคำสั่งเริ่มเซิร์ฟเวอร์ HTTP:
ตัวอย่าง path โปรเจค:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
php http_server.php start
1
คำอธิบายโหมดการรัน:
- โหมด foreground: รัน
php http_server.php start
Workerman จะแสดงข้อมูลการรันและ log บนเทอร์มินอล สามารถหยุดด้วยCtrl+C
เหมาะสำหรับพัฒนาและ debug - โหมด daemon: สำหรับ production ให้ใช้เพิ่ม
-d
เช่นbashWorkerman จะรัน background พร้อมบันทึก log ลงไฟล์โดยอัตโนมัติphp http_server.php start -d
1
การจัดการโปรเซส:
Workerman รองรับคำสั่งสำหรับบริหารโปรเซสหลายรูปแบบ:
- เริ่มต้น:
php http_server.php start
(หน้าจอ) หรือphp http_server.php start -d
(เบื้องหลัง) - หยุด:
php http_server.php stop
- รีสตาร์ท:
php http_server.php restart
- รีโหลดโค้ด (Reload):
php http_server.php reload
(รีโหลดโดยไม่หยุดบริการ เหมาะกับอัปเดตโค้ด) - ดูสถานะ:
php http_server.php status
หลังรันเซิร์ฟเวอร์แล้ว ให้เปิดเบราว์เซอร์ไปที่ http://localhost:8080
หรือ http://127.0.0.1:8080
คุณจะเห็นข้อความแสดงว่า Hello ServBay Workerman HTTP Server!
สร้างเซิร์ฟเวอร์ WebSocket ด้วย Workerman
WebSocket เป็นโปรโตคอลสำหรับการเชื่อมต่อสองทางแบบถาวร เหมาะสำหรับแอปแบบ real-time เช่น แชท, สถานะหุ้น, เกม Workerman รองรับ WebSocket อย่างดี
โค้ดเซิร์ฟเวอร์ WebSocket
สร้างไฟล์
websocket_server.php
ในโปรเจค แล้วใส่โค้ดนี้:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // สร้างเซิร์ฟเวอร์ WebSocket ฟังที่พอร์ต 8081 // 'websocket://0.0.0.0:8081' คือเซิร์ฟเวอร์ WebSocket ที่ฟังทุก interface // Workerman จะจัดการ handshake ให้ $ws_worker = new Worker('websocket://0.0.0.0:8081'); // รัน 4 process $ws_worker->count = 4; // เมื่อมีการเชื่อมต่อใหม่ $ws_worker->onConnect = function(TcpConnection $connection) { echo "เชื่อมต่อใหม่ WebSocket จาก " . $connection->getRemoteIp() . "\n"; }; // เมื่อได้รับข้อความจาก client // $data คือข้อความที่รับมา $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "ได้รับข้อความ: " . $data . "\n"; // ส่งข้อความเดียวกันกลับ client $connection->send('ServBay Workerman received: ' . $data); }; // เมื่อปิดการเชื่อมต่อ $ws_worker->onClose = function(TcpConnection $connection) { echo "ปิดการเชื่อมต่อ WebSocket\n"; }; // เมื่อมี error (สามารถเพิ่มได้) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // รัน 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
28
29
30
31
32
33
34
35
36
37
38
39รันเซิร์ฟเวอร์ WebSocket
ในโปรเจค ให้รัน:
bashphp websocket_server.php start
1สามารถใช้
-d
เพื่อรันเบื้องหลัง. จากนั้นใช้ client เชื่อมต่อws://localhost:8081
ตัวอย่างทดสอบในเบราว์เซอร์ (Console):
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket เชื่อมต่อแล้ว"); ws.send("Hello from Browser!"); // ส่งข้อความ }; ws.onmessage = function(event) { console.log("ข้อความจากเซิร์ฟเวอร์:", event.data); }; ws.onclose = function(event) { if (event.wasClean) { console.log("ปิดการเชื่อมต่อ WebSocket แล้ว code=" + event.code + " reason=" + event.reason); } else { console.error("การเชื่อมต่อ WebSocket ถูกขัดจังหวะ"); } }; 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 ด้วย Workerman
Workerman สามารถสร้างเซิร์ฟเวอร์ TCP สำหรับงานเฉพาะ เช่น backend เกม, IoT, หรือ communication custom
โค้ดเซิร์ฟเวอร์ TCP
สร้างไฟล์
tcp_server.php
ในโปรเจค แล้วใส่โค้ดด้านล่าง:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // สร้างเซิร์ฟเวอร์ TCP ฟังที่พอร์ต 8082 // 'tcp://0.0.0.0:8082' คือ TCP server ทุก interface // Workerman ใช้ protocol ข้อความ (จบด้วย \n) โดย default $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // รัน 4 process $tcp_worker->count = 4; // เมื่อมีการเชื่อมต่อใหม่ $tcp_worker->onConnect = function(TcpConnection $connection) { echo "เชื่อมต่อใหม่ TCP จาก " . $connection->getRemoteIp() . "\n"; // ส่งข้อความต้อนรับเมื่อเชื่อมต่อ $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // เมื่อรับข้อความ // $data คือข้อความที่ decode แล้วจาก client $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "ได้รับข้อมูล: " . $data; // ส่ง echo กลับ $connection->send('ServBay Workerman received: ' . $data); }; // เมื่อปิดการเชื่อมต่อ $tcp_worker->onClose = function(TcpConnection $connection) { echo "ปิดการเชื่อมต่อ TCP\n"; }; // รัน 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
28
29
30
31
32
33
34
35
36รันเซิร์ฟเวอร์ TCP
ในโปรเจค รันคำสั่งนี้:
bashphp tcp_server.php start
1สามารถใช้
-d
เพื่อรันเบื้องหลัง. จากนั้นเชื่อมต่อด้วย client TCP ที่พอร์ตlocalhost:8082
ตัวอย่างเชื่อมต่อบน terminal อื่นด้วย
telnet
หรือnc
:bash# ใช้ telnet telnet localhost 8082 # หรือ nc (netcat) nc localhost 8082
1
2
3
4
5เมื่อเชื่อมต่อจะเห็นข้อความต้อนรับพิมพ์จาก server จากนั้นลองส่งข้อความ, server จะ echo ข้อมูลกลับ
ข้อควรระวัง
- พอร์ตถูกใช้งาน: ตรวจสอบว่าพอร์ตที่ Workerman ใช้งาน (8080, 8081, 8082) ไม่ถูก process อื่นยึดอยู่ ถ้าชนกัน Workerman จะรันไม่ได้ ดูด้วยคำสั่ง
lsof -i :เลขพอร์ต
- Firewall: firewall ใน OS อาจบล็อกการเข้าถึง หากต้องการให้ device อื่นใน LAN เข้าถึง ต้องตั้งค่าระบบ firewall
- ความสัมพันธ์กับเซิร์ฟเวอร์เว็บใน ServBay: Workerman เป็น process แยกต่างหากจากเซิร์ฟเวอร์ Caddy หรือ Nginx ของ ServBay โดยปกติ Workerman รับ connection โดยตรง ไม่ต้องผ่าน proxy เว้นแต่ตั้ง reverse proxy พิเศษ เหมาะกับงานที่ต้องการ connection ยาวหรือ async สูง (เช่น WebSocket)
- PHP เวอร์ชัน: ให้แน่ใจว่า PHP ที่ใช้ใน ServBay ตรงกับที่ Workerman ต้องการ โดยเลือกและเปิดใช้งานใน ServBay ได้หลายเวอร์ชัน
- ส่วนขยาย PHP: Workerman ใช้ extension PHP บางตัวเพื่อประสิทธิภาพ เช่น
event
,posix
,pcntl
ซึ่งโดยมากจะติดตั้งและเปิดใน ServBay อยู่แล้ว หากมีปัญหาตรวจสอบว่าเปิดอยู่ในแผงควบคุม ServBay - log: เมื่อรัน daemon log จะอยู่ในไฟล์ ตรวจสอบ log เป็นระยะเพื่อดูสถานะและ error
คำถามที่พบบ่อย (FAQ)
- Q: จะหยุดเซิร์ฟเวอร์ Workerman ได้อย่างไร?
- A: ถ้าเซิร์ฟเวอร์รัน foreground (สั่ง start) กด
Ctrl+C
ที่ terminal เพื่อหยุด หากรัน daemon (ใช้start -d
) ให้ใช้php your_server_file.php stop
ในโปรเจค
- A: ถ้าเซิร์ฟเวอร์รัน foreground (สั่ง start) กด
- Q: ทำไม Workerman รันไม่ขึ้น?
- A: สาเหตุหลักคือพอร์ตที่ฟังอยู่ถูก process อื่นจับไว้ ตรวจสอบ error ที่ terminal และอาจลองเปลี่ยนพอร์ต หรือหยุด process ที่ใช้พอร์ตนั้น ดู process ด้วย
lsof -i :เลขพอร์ต
- A: สาเหตุหลักคือพอร์ตที่ฟังอยู่ถูก process อื่นจับไว้ ตรวจสอบ error ที่ terminal และอาจลองเปลี่ยนพอร์ต หรือหยุด process ที่ใช้พอร์ตนั้น ดู process ด้วย
- Q: ต่างกันอย่างไรระหว่าง Caddy/Nginx ของ ServBay กับ Workerman? ใช้อะไรดี?
- A: Caddy/Nginx เป็นเว็บเซิร์ฟเวอร์แบบดั้งเดิมสำหรับ HTTP/HTTPS request ปกติ ใช้ควบกับ PHP-FPM หลังกระบวนการ PHP จะออกทุกครั้ง แต่ Workerman เป็น PHP framework แบบ async network รัน server อยู่ใน memory เองเหมาะกับงานเรียลไทม์, high-concurrency ถ้าทำเว็บหรือ REST API ใช้ Caddy/Nginx ตามปกติ ถ้าต้องการแอปเช่นแชท เว็บเกม IoT ใช้ Workerman หรือใช้ร่วมกันโดย reverse proxy ได้
- Q: สามารถรันแอป Workerman หลายตัวพร้อมกันใน ServBay ได้ไหม?
- A: ได้ สามารถรันแต่ละแอปใน process แยกกัน และใช้พอร์ตคนละเบอร์ เขียน script start/stop ของแต่ละแอปแล้วรันจาก terminal หลายหน้าต่าง หรือรัน background ก็ได้ ขอแค่ไม่ซ้ำพอร์ต
สรุป
หลังอ่านคู่มือนี้ คุณสามารถสร้างและรันโปรเจค Workerman บน ServBay ได้อย่างง่ายดาย Workerman มอบประสิทธิภาพและฟีเจอร์ async ที่โดดเด่นให้กับนักพัฒนา PHP ในการสร้างแอปเครือข่ายยุคใหม่ ร่วมกับ ServBay ที่ติดตั้ง Composer และ PHP ไว้แล้ว จึงประหยัดเวลาในการตั้งค่า สามารถโฟกัสกับ business logic ได้เต็มที่ ไม่ว่าจะเป็นบริการเว็บประสิทธิภาพสูง หรือแอป WebSocket แบบเรียลไทม์ ServBay จึงคู่ควรกับงาน Workerman ทุกรูปแบบ หวังว่าเอกสารนี้จะช่วยให้คุณเริ่มต้นใช้งาน Workerman ได้อย่างมั่นใจ!