ใช้ Swoole บน ServBay เพื่อสร้างแอป PHP ประสิทธิภาพสูง
ServBay คือสภาพแวดล้อมการพัฒนาเว็บในเครื่อง ที่ออกแบบมาเพื่อดีเวลลอปเปอร์โดยเฉพาะ โดยมีสภาพแวดล้อมหลายภาษา ฐานข้อมูล และเครื่องมือหลากหลายที่ติดตั้งไว้ล่วงหน้า เพื่อให้การพัฒนาในเครื่องเป็นเรื่องง่าย ในบทความนี้จะเน้นการใช้งานส่วนขยาย Swoole ใน ServBay เพื่อเสริมศักยภาพ PHP ให้สามารถสร้างเซิร์ฟเวอร์เครือข่ายประสิทธิภาพสูง
Swoole คืออะไร?
Swoole คือเอนจินสื่อสารเครือข่ายแบบประสิทธิภาพสูงพร้อม coroutine รองรับการทำงานแบบขนานที่ออกแบบมาเพื่อ PHP เขียนด้วยภาษา C ทั้งหมด ช่วยให้ PHP มีความสามารถในการสื่อสารเครือข่ายแบบ async ขนาน และใช้ coroutine ด้วย Swoole นักพัฒนา PHP สามารถก้าวข้ามข้อจำกัดของเซิร์ฟเวอร์เว็บแบบเดิม (เช่น Apache/Nginx + PHP-FPM) ที่ใช้โมเดล request-response เพื่อรองรับงานหนักๆ เช่น สร้างเซิร์ฟเวอร์ที่อยู่ในความจำตลอดเวลา จัดการงาน async หรือบริการสื่อสารเรียลไทม์ (WebSocket) เป็นต้น
จุดเด่นของ Swoole:
- ประสิทธิภาพสูง: พัฒนาใจกลางด้วยภาษา C สนับสนุน async I/O, multi-process, และ multi-thread
- Coroutine: มี coroutine น้ำหนักเบา ทำให้โค้ด sync ทำงานแบบ async ได้ง่าย ย่นความซับซ้อนของงาน async
- รองรับโปรโตคอลหลากหลาย: สนับสนุน TCP/UDP/HTTP/WebSocket แบบ native
- ใช้งานง่าย: API ออกแบบตามความคุ้นเคยของผู้ใช้ PHP
- รันในความจำตลอดเวลา: แอปสามารถรันต่อเนื่องแบบไม่ต้องเริ่มสิ่งแวดล้อมใหม่ทุกครั้งที่มี request เหมือน PHP แบบเดิม
ด้วย Swoole, PHP ไม่ใช่แค่ภาษาสำหรับเว็บอีกต่อไป แต่สามารถใช้สร้างแอปเครือข่ายประสิทธิภาพสูงมากมาย
เปิดใช้งาน Swoole ใน ServBay
หนึ่งในเป้าหมายของ ServBay คือทำให้ดีเวลลอปเปอร์จัดการและใช้งานส่วนขยาย PHP ต่างๆ ได้ง่าย Swoole ในฐานะส่วนขยายหลักสำหรับงานพัฒนา PHP ระดับสูง ได้ติดตั้งไว้ล่วงหน้าใน ServBay คุณสามารถเปิดใช้งานได้ในไม่กี่ขั้นตอน
เงื่อนไขที่ต้องมี:
- ติดตั้งและเปิดใช้งาน ServBay แล้ว
- มี PHP รุ่นใดรุ่นหนึ่งติดตั้งใน ServBay
ขั้นตอนการเปิดใช้งาน:
- เปิดหน้าแอป ServBay
- ไปที่เมนู “Packages” หรือจัดการเวอร์ชัน PHP (หมายเหตุ: เมนูอาจมีชื่อแตกต่างกัน แล้วแต่เวอร์ชันของ ServBay โดยทั่วไปอยู่หน้าแรกหรือในส่วน settings)
- เลือกเวอร์ชัน PHP ที่ต้องการใช้ Swoole
- หา Swoole extension และติ๊กเปิดใช้งาน (มักจะแสดงเป็นรายการหรือปุ่มเปิด/ปิด)
- บันทึกการเปลี่ยนแปลง และรีสตาร์ท ServBay หรือบริการ PHP ตามคำแนะนำ (ServBay จะ config สภาพแวดล้อม PHP ให้โหลด Swoole อัตโนมัติ)
หลังจากนี้ คุณสามารถเริ่มใช้ Swoole กับ PHP รุ่นที่เลือก โดยตรวจสอบด้วยคำสั่ง php -m
ว่า swoole
อยู่ในรายการส่วนขยายที่โหลดแล้วหรือไม่
TIP
ServBay แนะนำให้คุณจัดเก็บเว็บไซต์หรือไฟล์โปรเจกต์ไว้ในไดเรกทอรีนี้ เพื่อความสะดวกในการบริหารและตั้งค่า:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
ตัวอย่างในบทความนี้ จะใช้เส้นทางที่แนะนำนี้เช่นกัน
การสร้าง Swoole HTTP Server แบบง่าย
ต่อไปเราจะสร้าง Swoole HTTP server พื้นฐาน เพื่อดูหลักการจัดการ request หน้าเว็บ
ขั้นตอนที่ 1: สร้างโฟลเดอร์โปรเจกต์
เปิด Terminal แล้วสร้างโฟลเดอร์โปรเจกต์ใหม่ในไดเรกทอรีที่ ServBay แนะนำ
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
ขั้นตอนที่ 2: เขียนสคริปต์เซิร์ฟเวอร์
ในโฟลเดอร์ servbay-swoole-http
สร้างไฟล์ชื่อ server.php
และเพิ่มเนื้อหาต่อไปนี้:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// สร้างอินสแตนซ์ Swoole HTTP server
// รับฟังทุก network (0.0.0.0) ที่ port 9501
$server = new Server("0.0.0.0", 9501);
// ลงทะเบียน callback เหตุการณ์ 'start'
// เมื่อเซิร์ฟเวอร์เริ่มสำเร็จ
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// สามารถบันทึก PID, management process เป็นต้น
});
// ลงทะเบียน callback เหตุการณ์ 'request'
// ทำงานเมื่อมี HTTP request ใหม่เข้ามา
$server->on("request", function (Request $request, Response $response) {
// กำหนด response header
$response->header("Content-Type", "text/plain");
// ประมวลผลตาม 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
}
// ส่ง response แล้วจบการทำงาน
$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 ที่รันที่ port 9501 เมื่อรับ request จะตอบกลับ “Hello ServBay!” หากเรียก path /info
จะส่งข้อมูล request กลับไป
ขั้นตอนที่ 3: รัน Swoole Server
ตรวจสอบว่า Directory ปัจจุบันคือ 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 เริ่มฟัง port 9501 แล้ว
ขั้นตอนที่ 4: เข้าถึง Swoole Server
เปิดเว็บเบราว์เซอร์ ไปที่:
http://localhost:9501
http://localhost:9501/info
จะเห็นข้อความหน้าเว็บว่า Hello ServBay!
และข้อมูล request ตาม path ที่เลือก
ถ้าต้องการหยุดเซิร์ฟเวอร์ ใน Terminal ที่รันสคริปต์อยู่ กด Ctrl + C
ใช้ Swoole กับ WebSocket
Swoole สนับสนุนโปรโตคอล WebSocket โดยตรง จึงเหมาะสำหรับสร้างแอปสื่อสารแบบเรียลไทม์ เช่น แชท เกม หรือดึงข้อมูลแบบทันทีทันใด
ขั้นตอนที่ 1: สร้างสคริปต์ WebSocket Server
ในโฟลเดอร์โปรเจกต์ (เช่น servbay-swoole-http
หรือสร้างใหม่เช่น servbay-swoole-websocket
) สร้างไฟล์ชื่อ websocket_server.php
โดยใส่โค้ดดังนี้:
ตำแหน่งโฟลเดอร์โปรเจกต์:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// สร้างอินสแตนซ์ Swoole WebSocket server
// Swoole WebSocket server สืบทอดจาก HTTP server สามารถประมวลผล HTTP request ได้ด้วย
$server = new Server("0.0.0.0", 9502); // รับฟังที่ port 9502
// ลงทะเบียนเหตุการณ์ 'start' เมื่อเซิร์ฟเวอร์เริ่มต้น
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// ลงทะเบียนเหตุการณ์ 'open'
// ทำงานเมื่อเชื่อมต่อ WebSocket ใหม่
// object $request จะมีข้อมูลเช่น $request->fd ใช้ระบุ client
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// ส่งข้อความต้อนรับ client ได้ที่นี่
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// ลงทะเบียนเหตุการณ์ 'message'
// เมื่อเซิร์ฟเวอร์ได้รับข้อความ WebSocket
// object $frame มีข้อมูล message เช่น $frame->data คือเนื้อหา, $frame->fd คือหมายเลข client
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// ตอบกลับผู้ส่ง หรือ broadcast
// ตัวอย่าง: ตอบกลับผู้ส่ง
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// ตัวอย่าง broadcast (ต้องเก็บรายชื่อ connection หรือวนลูป)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // ไม่ส่งให้ตัวเอง
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// ลงทะเบียนเหตุการณ์ 'close'
// ทำงานเมื่อ client ปิดการเชื่อมต่อ
$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
49
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
โค้ดนี้จะสร้าง Swoole WebSocket server ที่ port 9502 และกำหนด callback ให้แต่ละเหตุการณ์สำคัญ เช่น เริ่มเซิร์ฟเวอร์, client เชื่อมต่อ, รับข้อความ, หรือปิดเชื่อมต่อ โดยเมื่อมีข้อความเข้ามาจะตอบกลับพร้อม prefix ไปยังผู้ส่ง
ขั้นตอนที่ 2: รัน WebSocket Server
ตรวจสอบว่าอยู่ในไดเรกทอรีที่เก็บ 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 เริ่มฟัง port 9502 แล้ว
ขั้นตอนที่ 3: เชื่อมต่อ WebSocket Server
มีหลายวิธีจะลองเชื่อมต่อเซิร์ฟเวอร์นี้เพื่อทดสอบ
วิธี A: ใช้เครื่องมือเว็บเบราว์เซอร์
เว็บเบราว์เซอร์รุ่นใหม่ๆ มี developer tools (F12) ในแถบ Network หรือ Console ที่ใช้ทดสอบ WebSocket ได้
เปิดหน้าเว็บ (เช่น
about:blank
)เปิด developer tools แล้วไปที่แถบ 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); // หากเกิดปัญหา }; 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 ขณะเดียวกัน ใน terminal ที่รัน
websocket_server.php
จะเห็น log สำหรับการเชื่อมต่อและข้อความ
วิธี B: ใช้ wscat
บน command line
wscat
เป็น client WebSocket แบบบรรทัดคำสั่ง สร้างด้วย Node.js
ติดตั้ง
wscat
: ถ้ายังไม่มี Node.js และ npm ให้ติดตั้ง จากนั้นติดตั้งwscat
ทั่วระบบbashnpm install -g wscat
1เชื่อมต่อเซิร์ฟเวอร์: ใช้ command นี้ใน terminal
bashwscat -c ws://localhost:9502
1ถ้าเชื่อมต่อสำเร็จ จะเห็น prompt
>
ส่งข้อความ: พิมพ์ข้อความหลัง prompt แล้วกด Enter
bash> Hello ServBay via wscat
1จากนั้นเซิร์ฟเวอร์จะตอบกลับ ข้อความจะขึ้นต้นด้วย
<
เช่นbash< Hello, you sent: Hello ServBay via wscat
1และใน terminal ที่รัน
websocket_server.php
จะเห็น log ที่เกี่ยวข้อง
ถ้าต้องการปิดการเชื่อมต่อ wscat
กด Ctrl + C
ข้อควรระวัง
- การชนกันของพอร์ต: ตรวจสอบพอร์ตที่ Swoole server ใช้งาน (เช่น 9501, 9502) ไม่ได้ถูกโปรแกรมอื่นใช้งานอยู่ ก่อนเริ่มเซิร์ฟเวอร์
- เวอร์ชัน PHP: รันสคริปต์โดยใช้ PHP ที่เปิดใช้งาน Swoole ใน ServBay ตรวจสอบด้วย
php -v
ว่าเป็นเวอร์ชันที่ถูกต้อง ServBay มักมีเครื่องมือเปลี่ยนเวอร์ชัน PHP ได้ง่าย - สถานะส่วนขยาย: ถ้าเปิดเซิร์ฟเวอร์ไม่สำเร็จ ให้ตรวจดูว่า Swoole extension ถูกเปิดใช้งานบน PHP ที่ใช้อยู่ และรีสตาร์ท ServBay หรือ PHP แล้ว
- การดูแล process แบบต่อเนื่อง: Swoole server รันเป็น process อยู่ในความจำ ในโปรดักชั่นควรใช้เครื่องมือดูแล (เช่น Supervisor, Systemd, pm2) เพื่อให้ server restart อัตโนมัติหากเกิดข้อผิดพลาด แต่สำหรับการทดสอบในเครื่อง รันจาก terminal ก็สะดวกแล้ว
สรุป
ServBay ทำให้คุณเปิดใช้งานและพัฒนา Swoole extension ได้อย่างง่ายดาย สร้างและทดสอบแอป PHP ประสิทธิภาพสูงในสภาพแวดล้อมเครื่อง ไม่ว่าจะเป็น HTTP server แบบดั้งเดิมหรือ WebSocket สื่อสารเรียลไทม์ Swoole ที่ทรงพลังผสานกับ ServBay ที่ใช้งานสะดวก เปิดโอกาสใหม่ให้กับนักพัฒนา PHP ในการสร้างแอปพลิเคชันที่มีประสิทธิผลและความแข็งแกร่งสูง เริ่มทดลองใช้ Swoole กับ ServBay ได้เลยวันนี้!