ใช้ Swoole ใน ServBay สร้างแอป PHP ประสิทธิภาพสูง
ServBay คือสภาพแวดล้อมการพัฒนา Web แบบ Local ที่ออกแบบมาสำหรับนักพัฒนาโดยเฉพาะ มาพร้อมภาษาโปรแกรม, ฐานข้อมูล และเครื่องมือต่างๆ ที่ติดตั้งไว้ล่วงหน้า เพื่อช่วยให้กระบวนการพัฒนาบนเครื่องง่ายยิ่งขึ้น บทความนี้จะเจาะลึกวิธีใช้ส่วนขยาย Swoole ใน ServBay เพื่อเสริมพลังให้กับแอป PHP ในการสร้างบริการเครือข่ายที่ประสิทธิภาพสูง
Swoole คืออะไร?
Swoole เป็นเอนจินเครือข่ายประสิทธิภาพสูงที่ออกแบบมาสำหรับ PHP ใช้งานหลักกับงานที่ต้องประมวลผลแบบขนานและใช้ coroutine เพื่อพัฒนาโปรแกรมแบบ asynchronous เขียนด้วยภาษา C ล้วนๆ และมอบความสามารถในการสื่อสารเครือข่ายแบบ asynchronous, แบบขนาน, และ coroutine ให้กับ PHP ผ่าน Swoole นักพัฒนา PHP สามารถก้าวข้ามข้อจำกัดของเซิร์ฟเวอร์แบบเดิม (เช่น Apache/Nginx + PHP-FPM) ที่ทำงานแบบ request-response จนสามารถรองรับงานที่ต้องการประสิทธิภาพสูง เช่น การสร้าง Web server ที่รันแบบประจำในหน่วยความจำ การจัดการงาน asynchronous หรือบริการสื่อสารแบบ real-time (เช่น WebSocket) ฯลฯ
จุดเด่นหลักของ Swoole:
- ประสิทธิภาพสูง: พัฒนาโดยใช้ C ล้วน รองรับ I/O แบบ asynchronous, กระบวนการย่อย (multi-process)/เธรด (multi-thread)
- Coroutine: รองรับ coroutine น้ำหนักเบา เขียนโค้ด synchronous แต่ทำงาน asynchronous ได้จริง ง่ายต่อการพัฒนา
- รองรับโปรโตคอลหลากหลาย: รองรับ TCP/UDP/HTTP/WebSocket และโปรโตคอลอีกมากมายโดยตรง
- ใช้งานง่าย: API ออกแบบมาตามแนวทางการใช้งานของ PHP
- รันในหน่วยความจำ: แอปพลิเคชันสามารถรันในรูปแบบ process ประจำ ลดต้นทุนการ initial environment ทุกครั้งแบบ PHP ทั่วไป
ด้วย Swoole, PHP ไม่ได้เป็นเพียงแค่ภาษาสคริปต์สำหรับพัฒนาเว็บ แต่พร้อมรับบทบาทใหม่ในการสร้างแอปเครือข่ายประสิทธิภาพสูงในหลากหลายรูปแบบ
เปิดใช้งาน Swoole ใน ServBay
หนึ่งในเป้าหมายหลักของ ServBay คือการช่วยให้นักพัฒนาจัดการและใช้งานส่วนขยายของ PHP ได้ง่าย Swoole นับเป็นส่วนขยายสำคัญสำหรับการพัฒนา PHP แบบประสิทธิภาพสูงยุคใหม่ และถูกติดตั้งมาให้พร้อมใน ServBay แล้ว คุณเพียงไม่กี่ขั้นตอนก็เปิดใช้งานได้ทันที
ข้อกำหนดเบื้องต้น:
- ติดตั้งและเปิดใช้งาน ServBay แล้ว
- ตรวจสอบให้แน่ใจว่ามี PHP เวอร์ชันอย่างน้อยหนึ่งตัวถูกติดตั้งใน ServBay
ขั้นตอนเปิดใช้งาน:
- เปิดหน้าหลักของแอป ServBay
- ไปที่เมนู “ซอฟต์แวร์แพคเกจ (Packages)” หรือหน้าจัดการ PHP เวอร์ชัน (หมายเหตุ: ชื่อเมนูอาจแตกต่างกันเล็กน้อยตามแต่ละเวอร์ชัน มักจะอยู่ที่หน้าหลักหรือเมนูการตั้งค่า)
- เลือก PHP เวอร์ชันที่คุณต้องการเปิด Swoole ด้วย
- ค้นหาตัวเลือก Swoole extension และทำเครื่องหมายเพื่อเปิดใช้งาน ServBay มักจะแสดงส่วนขยายนี้เป็นรายการหรือสวิตช์ให้สลับเปิด-ปิดได้
- บันทึกการเปลี่ยนแปลงและรีสตาร์ท ServBay หรือ PHP service ตามคำแนะนำ ServBay จะช่วยตั้งค่าการโหลด Swoole extension เข้าสู่ PHP โดยอัตโนมัติ
เมื่อดำเนินการครบแล้ว คุณสามารถเริ่มใช้งาน Swoole ใน PHP เวอร์ชันที่เลือกได้ สามารถตรวจสอบการเปิดใช้งานส่วนขยายได้โดยรัน php -m
ใน Terminal และมองหา swoole
ในรายชื่อ extensions ที่ถูกโหลด
TIP
ServBay แนะนำให้คุณเก็บไฟล์เว็บไซต์หรือโปรเจกต์ไว้ที่ /Applications/ServBay/www
เพื่อให้จัดการและตั้งค่าเว็บใน ServBay ได้ง่ายขึ้น ตัวอย่างในบทความนี้จะใช้เส้นทางนี้เช่นกัน
สร้าง Swoole HTTP Server แบบง่าย
ต่อไปเราจะสร้าง HTTP server เบื้องต้นโดยใช้ Swoole เพื่อรับและตอบสนอง Web request
ขั้นตอนที่ 1: สร้างโฟลเดอร์โปรเจกต์
เปิด Terminal สร้างและเข้าสู่โฟลเดอร์โปรเจกต์ใหม่ โดยอิงตามคำแนะนำของ ServBay ไว้ที่ /Applications/ServBay/www
:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
ขั้นตอนที่ 2: เขียนสคริปต์เซิร์ฟเวอร์
สร้างไฟล์ชื่อ server.php
ในโฟลเดอร์ servbay-swoole-http
แล้วเติมโค้ดต่อไปนี้:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// สร้างอินสแตนซ์ Swoole HTTP Server
// รับฟังเลขที่อยู่ 0.0.0.0 ที่พอร์ต 9501
$server = new Server("0.0.0.0", 9501);
// ลงทะเบียน callback สำหรับ event 'start'
// จะถูกเรียกเมื่อเซิร์ฟเวอร์เริ่มทำงาน
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// สามารถบันทึก PID ของ process หลัก, process ผู้จัดการ ฯลฯ ที่นี่ได้
});
// ลงทะเบียน callback สำหรับ event 'request'
// จะถูกเรียกเมื่อมี HTTP request ใหม่เข้ามา
$server->on("request", function (Request $request, Response $response) {
// ตั้งค่าหัวข้อการตอบกลับ
$response->header("Content-Type", "text/plain");
// ประมวลผล logic ตาม path หรือ parameter ที่ส่งมา
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// สามารถดูรายละเอียด request เพิ่มเติมได้จาก object $request
}
// ตอบกลับและยุติคำขอ (request)
$response->end($content);
});
// เริ่มต้นเซิร์ฟเวอร์
$server->start();
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
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
โค้ดนี้จะสร้าง Swoole HTTP server ที่รับฟังที่พอร์ต 9501 โดยเมื่อมี request เข้ามา เซิร์ฟเวอร์จะตอบกลับด้วย "Hello ServBay!" แบบ plain text หากเข้าที่ path /info
จะตอบกลับข้อมูลรายละเอียดของ request
ขั้นตอนที่ 3: รัน Swoole Server
ตรวจสอบให้แน่ใจว่า terminal อยู่ในโฟลเดอร์ servbay-swoole-http
แล้วรันไฟล์ด้วย PHP ที่เปิดใช้งาน Swoole ใน ServBay:
bash
php server.php
1
หากทุกอย่างถูกต้องจะเห็นข้อความใน terminal ประมาณนี้:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
แสดงว่า Swoole HTTP server ทำงานอยู่ที่พอร์ต 9501 เรียบร้อย
ขั้นตอนที่ 4: เข้าใช้งาน Swoole Server
เปิดเบราว์เซอร์แล้วเข้าที่:
http://localhost:9501
http://localhost:9501/info
จะเห็นว่าหน้าเว็บแสดงข้อความ Hello ServBay!
หรือแสดงรายละเอียด request ตาม path ที่เข้า
หากต้องการหยุด server ให้กด Ctrl + C
ใน terminal ที่รัน script
ใช้ Swoole รับส่ง WebSocket
Swoole รองรับ WebSocket protocol ในระดับ native เหมาะกับงานสื่อสาร real-time เช่น แชท เกม หรือ push ข้อมูลแบบสด ฯลฯ
ขั้นตอนที่ 1: เขียนสคริปต์ WebSocket Server
สร้างไฟล์ websocket_server.php
ใน /Applications/ServBay/www/servbay-swoole-http
(หรือโฟลเดอร์ใหม่เช่น servbay-swoole-websocket
) แล้วเติมโค้ดดังนี้:
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// สร้างอินสแตนซ์ Swoole WebSocket Server
// WebSocket Server สืบทอดจาก HTTP Server จึงรองรับ HTTP request ด้วย
$server = new Server("0.0.0.0", 9502); // ฟังที่พอร์ต 9502
// ลงทะเบียน event 'start' เมื่อเซิร์ฟเวอร์เริ่มทำงาน
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// ลงทะเบียน event 'open'
// เรียกใช้เมื่อมีการเชื่อมต่อใหม่
// $request มีข้อมูลผู้เชื่อมต่อ $request->fd คือ file descriptor (อ้างอิงการเชื่อมต่อ)
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// ส่ง welcome message ไปยัง client
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// ลงทะเบียน event 'message'
// เมื่อเซิร์ฟเวอร์ได้รับ WebSocket message จาก client
// $frame มีข้อมูลข้อความ เช่น $frame->data คือเนื้อความ, $frame->fd คือผู้ส่ง
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// ตอบกลับไปยังผู้ส่ง
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// ตัวอย่าง broadcast (ต้องเก็บ connection list หรือวนลูป)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // ไม่ส่งให้ตัวเอง
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// ลงทะเบียน event 'close'
// เรียกใช้เมื่อเชื่อมต่อถูกปิด
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// เริ่มต้นเซิร์ฟเวอร์
$server->start();
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
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
โค้ดนี้จะสร้าง Swoole WebSocket server ที่รับฟังพอร์ต 9502 พร้อม callback ฟังก์ชันสำหรับ event หลัก เช่น start
(เริ่มต้น), open
(เชื่อมต่อใหม่), message
(ได้รับข้อความ), close
(ปิดการเชื่อมต่อ) โดยเมื่อมีข้อความเข้าจาก client จะตอบกลับข้อความเดิมพร้อม prefix ทันที
ขั้นตอนที่ 2: รัน WebSocket Server
ตรวจสอบให้แน่ใจว่า terminal อยู่ในโฟลเดอร์ที่เก็บไฟล์ websocket_server.php
แล้วรันด้วย PHP ที่มี Swoole ใน ServBay:
bash
php websocket_server.php
1
หากรันสำเร็จ จะมีข้อความใน terminal:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
แสดงว่า Swoole WebSocket server ทำงานอยู่ที่พอร์ต 9502 แล้ว
ขั้นตอนที่ 3: ทดสอบเชื่อมต่อ WebSocket Server
สามารถทดสอบเชื่อมต่อกับ WebSocket server ได้หลายวิธี
วิธี A: ผ่านเครื่องมือ DevTools ในเบราว์เซอร์
เบราว์เซอร์สมัยใหม่ส่วนใหญ่มี DevTools (กด F12) ใน Panel “Console” หรือ “Network” ใช้ทดสอบ WebSocket ได้
เปิดหน้าเว็บเปล่าเช่น
about:blank
เปิด DevTools และเปลี่ยนไปยัง “Console”
รันโค้ด JavaScript ต่อไปนี้ในคอนโซล:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // ส่งข้อความหลังเชื่อมต่อสำเร็จ }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // รับข้อความ }; ws.onerror = function(event) { console.error("WebSocket error:", event); // แสดง error }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // ปิดการเชื่อมต่อ }; // สามารถส่งข้อความโดย ws.send("ข้อความของคุณ") // หรือปิดเชื่อมต่อด้วย ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21สังเกตผลลัพธ์ที่ได้ที่ Console และดู log บน terminal ที่รัน
websocket_server.php
วิธี B: ด้วยคำสั่ง wscat
(CLI)
wscat
คือ WebSocket client ผ่าน terminal สะดวกและง่าย โดยอาศัย Node.js
ติดตั้ง
wscat
: หากยังไม่ได้ติดตั้ง Node.js และ npm ให้ติดตั้งก่อน แล้วสั่ง npm ติดตั้งwscat
แบบ global:bashnpm install -g wscat
1เชื่อมต่อไปยัง WebSocket server: ที่ terminal รัน:
bashwscat -c ws://localhost:9502
1หากเชื่อมต่อสำเร็จ จะเห็น prompt
>
ส่งข้อความ: พิมพ์ข้อความที่ต้องการและกด Enter
bash> Hello ServBay via wscat
1Server จะตอบกลับและแสดงข้อความที่ขึ้นต้นด้วย
<
เช่น:bash< Hello, you sent: Hello ServBay via wscat
1Terminal ที่รัน
websocket_server.php
จะแสดง log เหมือนกัน
เพื่อหยุดการเชื่อมต่อ wscat ให้กด Ctrl + C
ข้อควรระวัง
- พอร์ตซ้ำ: ตรวจสอบให้แน่ใจว่าพอร์ตที่ Swoole ใช้งาน (เช่น 9501, 9502) ไม่ถูกโปรแกรมอื่นใช้ หากซ้ำกัน Swoole server จะเริ่มต้นไม่ได้
- เวอร์ชัน PHP: ให้แน่ใจว่า PHP ที่รันอยู่ใน terminal เป็นตัวเดียวกับที่เปิดใช้ Swoole extension บน ServBay ใช้คำสั่ง
php -v
เพื่อตรวจสอบเวอร์ชันที่กำลังใช้งาน ปกติ ServBay จะมีคำสั่งสลับเวอร์ชัน PHP ที่สะดวกให้ใช้ - สถานะส่วนขยาย: หาก server รันไม่ได้ ให้กลับไปเช็คอีกครั้งว่า Swoole extension เปิดใช้งานกับ PHP เวอร์ชันปัจจุบันบน ServBay แล้ว และ restart ServBay หรือ PHP service เพื่อให้มีผล
- การจัดการ process ประจำ: Swoole server จะรันค้างในหน่วยความจำ ใน production แนะนำใช้เครื่องมือบริหาร process เช่น Supervisor, Systemd, pm2 ฯลฯ เพื่อเฝ้าระวังหาก process ตายให้ restart อัตโนมัติ แต่ในการพัฒนา local กับ ServBay รันตรงๆ ผ่าน terminal ก็เพียงพอ
สรุป
ด้วย ServBay คุณสามารถเปิดใช้งานและใช้ Swoole extension ได้อย่างง่ายดาย เพื่อพัฒนาและทดสอบแอป PHP ที่ประสิทธิภาพสูงบน local ทั้งบริการ HTTP แบบเดิมหรือแบบ real-time ผ่าน WebSocket Swoole มอบพลังใหม่ให้กับ PHP และเมื่อผสานกับสภาพแวดล้อมที่สะดวกของ ServBay ก็ยิ่งช่วยให้นักพัฒนาสร้างแอปที่ทรงพลังและมีประสิทธิภาพยิ่งกว่าเดิม ลองใช้งาน Swoole ใน ServBay วันนี้!