Sử dụng Swoole trong ServBay để xây dựng ứng dụng PHP hiệu suất cao
ServBay là một môi trường phát triển web local được thiết kế dành riêng cho lập trình viên, tích hợp sẵn các môi trường ngôn ngữ, cơ sở dữ liệu và công cụ, giúp đơn giản hóa quá trình phát triển trên máy cá nhân. Bài viết này sẽ hướng dẫn bạn cách khai thác sức mạnh của tiện ích Swoole ngay trong ServBay để xây dựng dịch vụ mạng PHP hiệu suất cao.
Swoole là gì?
Swoole là một engine mạng song song, hiệu suất cao cho PHP, dựa trên coroutine (luồng con). Được viết hoàn toàn bằng C, Swoole cung cấp khả năng giao tiếp mạng bất đồng bộ, song song và coroutine cho PHP. Qua Swoole, các lập trình viên PHP có thể vượt qua hạn chế mô hình request-response truyền thống (Apache/Nginx + PHP-FPM) để xử lý hiệu quả các tác vụ đồng thời số lượng lớn — ví dụ như xây dựng máy chủ web thường trực trong bộ nhớ, xử lý tác vụ bất đồng bộ, hoặc dịch vụ giao tiếp thời gian thực (WebSocket).
Các tính năng nổi bật của Swoole:
- Hiệu suất cao: Được phát triển bằng C ở tầng thấp, hỗ trợ I/O bất đồng bộ, đa tiến trình/đa luồng.
- Coroutine: Tạo coroutine nhẹ, thực thi code đồng bộ một cách bất đồng bộ, đơn giản hóa mô hình lập trình bất đồng bộ.
- Hỗ trợ nhiều giao thức: Native cho TCP/UDP/HTTP/WebSocket và nhiều giao thức mạng khác.
- Dễ sử dụng: API đơn giản, phù hợp thói quen lập trình PHP.
- Chạy thường trực trong bộ nhớ: Ứng dụng hoạt động quanh năm như một tiến trình thường trực, loại bỏ chi phí khởi tạo môi trường cho mỗi request như PHP truyền thống.
Nhờ Swoole, PHP không chỉ là ngôn ngữ viết các web truyền thống mà còn có thể làm việc trong các môi trường ứng dụng mạng hiệu suất cao đa dạng.
Kích hoạt Swoole trong ServBay
Một trong những mục tiêu của ServBay là giúp bạn dễ dàng quản lý và sử dụng các tiện ích mở rộng PHP. Swoole — tiện ích quan trọng cho phát triển PHP hiện đại — đã được tích hợp sẵn trong ServBay. Bạn chỉ cần một vài thao tác để bật nó lên.
Yêu cầu:
- Đã cài đặt và chạy ServBay.
- Đảm bảo ServBay có ít nhất một phiên bản PHP.
Cách kích hoạt:
- Mở giao diện ứng dụng ServBay.
- Đi đến “Packages” (Gói phần mềm) hoặc màn hình quản lý phiên bản PHP. (Tùy phiên bản ServBay, tên mục có thể hơi khác — thường nằm ở màn hình chính hoặc phần cài đặt)
- Chọn phiên bản PHP bạn muốn bật Swoole.
- Tìm tuỳ chọn Swoole và tick kích hoạt. ServBay thường hiển thị các tiện ích mở rộng đã biên dịch thành dạng danh sách hoặc nút công tắc.
- Lưu thay đổi và khởi động lại ServBay hoặc dịch vụ PHP theo hướng dẫn. ServBay sẽ tự động cấu hình môi trường PHP tải tiện ích Swoole.
Hoàn tất các bước trên, bạn đã có thể sử dụng Swoole trên phiên bản PHP đã chọn. Kiểm tra bằng lệnh php -m
xem có xuất hiện swoole
trong danh sách tiện ích đã tải hay không.
TIP
ServBay khuyên bạn nên đặt các file website và dự án vào các thư mục sau để tiện cho việc quản lý và cấu hình:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Các ví dụ trong bài cũng sử dụng đường dẫn này cho nhất quán.
Tạo máy chủ HTTP đơn giản với Swoole
Tiếp theo, hãy thử tạo một máy chủ HTTP căn bản bằng Swoole để xử lý request web.
Bước 1: Tạo thư mục dự án
Mở Terminal, tạo thư mục mới và tiếp cận theo thư mục được ServBay đề xuất:
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
Bước 2: Viết file script máy chủ
Tạo file tên server.php
trong thư mục servbay-swoole-http
và thêm nội dung sau:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Tạo instance máy chủ HTTP Swoole
// Lắng nghe tất cả giao diện mạng (0.0.0.0) tại cổng 9501
$server = new Server("0.0.0.0", 9501);
// Đăng ký callback sự kiện 'start'
// Kích hoạt khi server khởi động thành công
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Bạn có thể ghi lại PID tiến trình chính, PID quản lý tại đây
});
// Đăng ký callback sự kiện 'request'
// Kích hoạt khi nhận được request HTTP mới
$server->on("request", function (Request $request, Response $response) {
// Thiết lập header phản hồi
$response->header("Content-Type", "text/plain");
// Xử lý logic theo đường dẫn hoặc tham số truy vấn
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Đường dẫn yêu cầu: " . $path . "\n";
$content .= "Phương thức: " . $request->server['request_method'] . "\n";
$content .= "IP khách: " . $request->server['remote_addr'] . "\n";
// Thêm thông tin về request có thể lấy qua đối tượng $request
}
// Trả về nội dung phản hồi và kết thúc request
$response->end($content);
});
// Khởi động server
$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
Script này tạo server HTTP Swoole trên cổng 9501. Khi có request, nó trả về chuỗi "Hello ServBay!". Nếu truy cập đường dẫn /info
, nó trả về thông tin chi tiết về request.
Bước 3: Chạy server Swoole
Đảm bảo đã chuyển về đúng thư mục servbay-swoole-http
. Dùng PHP phiên bản có Swoole của ServBay để chạy script:
bash
php server.php
1
Nếu thành công, bạn sẽ thấy output sau trên Terminal:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
Điều này xác nhận server đã chạy và lắng nghe tại cổng 9501.
Bước 4: Truy cập máy chủ Swoole
Mở trình duyệt web, truy cập các địa chỉ sau:
http://localhost:9501
http://localhost:9501/info
Bạn sẽ lần lượt thấy nội dung Hello ServBay!
hoặc văn bản thông tin về request.
Để dừng server, quay lại cửa sổ terminal đang chạy script và nhấn Ctrl + C
.
Xử lý kết nối WebSocket với Swoole
Swoole hỗ trợ giao thức WebSocket native — lý tưởng để phát triển ứng dụng giao tiếp thời gian thực như chat, game server, hay push dữ liệu lập tức.
Bước 1: Viết script server WebSocket
Trong thư mục dự án (ví dụ servbay-swoole-http
, hoặc tạo thư mục riêng như servbay-swoole-websocket
), tạo file tên websocket_server.php
:
Đường dẫn dự án:
- 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;
// Tạo instance máy chủ WebSocket Swoole
// WebSocket server kế thừa HTTP server nên cũng có thể xử lý request HTTP
$server = new Server("0.0.0.0", 9502); // Lắng nghe cổng 9502
// Đăng ký sự kiện 'start', kích hoạt khi server khởi động
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// Đăng ký sự kiện 'open', kích hoạt khi kết nối mới được thiết lập
// Đối tượng $request chứa thông tin kết nối client, như $request->fd là file descriptor của client
$server->on("open", function (Server $server, Request $request) {
echo "Kết nối mới: {$request->fd}\n";
// Gửi tin nhắn chào mừng tới client
$server->push($request->fd, "Chào mừng đến với ServBay WebSocket Demo!");
});
// Đăng ký sự kiện 'message', kích hoạt khi server nhận được tin nhắn WebSocket từ client
// Đối tượng $frame chứa nội dung tin nhắn, như $frame->data (nội dung), $frame->fd (descriptor)
$server->on("message", function (Server $server, Frame $frame) {
echo "Nhận tin nhắn từ {$frame->fd}: {$frame->data}\n";
// Gửi lại tin nhắn cho client, hoặc broadcast tới mọi người
// Ví dụ: phản hồi cho chính người gửi
$server->push($frame->fd, "Hello, bạn vừa gửi: {$frame->data}");
// Phát broadcast (cần quản lý danh sách kết nối hoặc duyệt connections)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // Không gửi cho chính người gửi
// $server->push($fd, "User {$frame->fd} nói: {$frame->data}");
// }
// }
});
// Đăng ký sự kiện 'close', kích hoạt khi kết nối đóng
$server->on("close", function ($ser, $fd) {
echo "Kết nối đóng: {$fd}\n";
});
// Khởi động server
$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
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
Script trên xây dựng server WebSocket Swoole trên cổng 9502, định nghĩa callback cho các sự kiện trọng yếu: start
(khởi động), open
(kết nối mới), message
(nhận tin nhắn), close
(đóng kết nối). Ở sự kiện message
, server sẽ trả về bất cứ tin nhắn nào bạn gửi kèm tiền tố.
Bước 2: Chạy server WebSocket
Đảm bảo đang ở đúng thư mục chứa websocket_server.php
. Dùng PHP có Swoole để chạy script:
bash
php websocket_server.php
1
Nếu thành công, Terminal hiển thị:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
Tức là server đã hoạt động và lắng nghe cổng 9502.
Bước 3: Kết nối tới WebSocket Server
Có nhiều cách để thử kết nối tới server WebSocket này.
Cách A: Dùng trình duyệt (DevTools)
Hầu hết trình duyệt hiện đại cung cấp DevTools (mở bằng F12), vào tab “Network” hoặc “Console” có thể test kết nối WebSocket.
Mở trang web (ví dụ:
about:blank
).Mở DevTools, chuyển sang “Console”.
Nhập đoạn mã JavaScript sau để kết nối:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("Kết nối WebSocket đã mở:", event); ws.send("Hello từ Trình duyệt!"); // Gửi tin nhắn khi kết nối thành công }; ws.onmessage = function(event) { console.log("Tin nhắn từ server:", event.data); // Nhận phản hồi }; ws.onerror = function(event) { console.error("Lỗi WebSocket:", event); // Khi có lỗi }; ws.onclose = function(event) { console.log("Kết nối WebSocket đã đóng:", event); // Khi đóng mất }; // Có thể gửi thêm tin nhắn bằng ws.send("nội dung") // Đóng kết nối bằng ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Quan sát kết quả trên Console và Terminal server.
Cách B: Dùng tool dòng lệnh wscat
wscat
là tool WebSocket CLI phổ biến dựa trên Node.js.
Cài đặt
wscat
: Nếu chưa có Node.js + npm, cài trước. Với npm, càiwscat
như sau:bashnpm install -g wscat
1Kết nối tới server: Chạy lệnh:
bashwscat -c ws://localhost:9502
1Nếu thành công sẽ hiện prompt
>
.Gửi tin nhắn: Gõ tin nhắn, nhấn Enter:
bash> Hello ServBay từ wscat
1Server sẽ phản hồi, kết quả ở terminal
wscat
(dấu<
ở đầu):bash< Hello, bạn vừa gửi: Hello ServBay từ wscat
1Terminal server cũng sẽ ghi log lại kết nối và tin nhắn.
Để ngắt kết nối trên wscat
, nhấn Ctrl + C
.
Lưu ý khi sử dụng
- Xung đột cổng: Đảm bảo các cổng Swoole sử dụng (9501, 9502, ...) không bị ứng dụng khác chiếm dụng. Nếu xung đột, server không khởi động được.
- Phiên bản PHP: Hãy luôn chạy script bằng đúng phiên bản PHP đã được bật Swoole trên ServBay. Kiểm tra bằng
php -v
. ServBay có sẵn công cụ chuyển PHP dễ dàng. - Trạng thái tiện ích: Nếu server khởi động lỗi, kiểm tra lại tiện ích Swoole đã bật cho đúng phiên bản PHP chưa, và các dịch vụ (ServBay, PHP) đã restart để áp dụng chưa.
- Quản lý tiến trình thường trực: Server Swoole là tiến trình chạy thường trực. Khi làm việc trên sản xuất, bạn nên dùng các tool giám sát tiến trình (Supervisor, Systemd, pm2…) để tự động restart khi lỗi. Trong môi trường local ServBay, thao tác bằng terminal là đủ dễ dàng.
Tổng kết
Nhờ ServBay, bạn dễ dàng bật và sử dụng tiện ích Swoole để phát triển và kiểm thử ứng dụng PHP hiệu suất cao ngay trên môi trường local — từ dịch vụ HTTP truyền thống cho đến ứng dụng WebSocket giao tiếp thời gian thực hiện đại. Swoole kết hợp cùng ServBay mở ra nhiều khả năng mới cho lập trình viên PHP, giúp bạn xây dựng ứng dụng tốt hơn, mạnh mẽ hơn. Hãy thử ngay Swoole trên ServBay hôm nay!