Cài đặt và chạy ứng dụng Workerman trong ServBay
Tổng quan
Tài liệu này sẽ hướng dẫn người dùng ServBay cách dễ dàng xây dựng và chạy nhanh các ứng dụng mạng PHP hiệu năng cao sử dụng Workerman ngay trên macOS, tận dụng môi trường PHP và Composer tích hợp trong ServBay. Workerman là một thư viện PHP mạnh mẽ, thích hợp cho việc xây dựng các dịch vụ mạng cần xử lý đồng thời số lượng lớn kết nối, như máy chủ Web, máy chủ giao tiếp thời gian thực, máy chủ game, v.v. ServBay mang lại nền tảng phát triển sẵn sàng sử dụng, giúp việc cấu hình môi trường Workerman trở nên cực kỳ đơn giản.
Workerman là gì?
Workerman là một framework giao tiếp mạng bất đồng bộ hiệu năng cao, mã nguồn mở, hoàn toàn viết bằng PHP. Framework này sử dụng cơ chế EventLoop để xử lý I/O bất đồng bộ, không bị tắc nghẽn, nhờ đó có thể xử lý hàng loạt kết nối đồng thời rất hiệu quả. Khác với mô hình phát triển web PHP truyền thống (như Apache/Nginx + PHP-FPM), ứng dụng Workerman thường chạy thường trú trong bộ nhớ, lắng nghe cổng nhất định và trực tiếp xử lý kết nối, dữ liệu mà không phải tải lại quy trình sau từng yêu cầu, từ đó nâng cao hiệu năng và throughput đáng kể.
Với Workerman, bạn có thể dễ dàng xây dựng:
- Máy chủ HTTP chịu tải lớn, thậm chí thay thế Apache/Nginx cho các yêu cầu tĩnh hoặc động đơn giản.
- Máy chủ WebSocket realtime, cho chat room, đẩy dữ liệu thời gian thực,...
- Máy chủ TCP/UDP tùy chỉnh theo các giao thức bạn định nghĩa.
- Công cụ dòng lệnh, nhiệm vụ định kỳ, vi dịch vụ,...
Điểm nổi bật & ưu thế của Workerman
- Hiệu năng vượt trội: Dựa trên event-driven và I/O bất đồng bộ, xử lý được lượng lớn kết nối đồng thời với hiệu suất xuất sắc.
- Hỗ trợ đa giao thức: Tích hợp sẵn HTTP, WebSocket, TCP, UDP, và dễ dàng mở rộng thành protocol tuỳ biến.
- Dễ sử dụng: API ngắn gọn, trực quan, giúp giảm độ phức tạp của lập trình mạng bất đồng bộ – cực kỳ thân thiện với lập trình viên PHP.
- Mở rộng linh hoạt: Hỗ trợ đa tiến trình, tận dụng toàn bộ CPU đa nhân, dễ tích hợp gói Composer và thư viện PHP bên ngoài.
- Tương thích hệ sinh thái PHP: Là thư viện PHP, tận dụng Composer để quản lý phụ thuộc, hòa nhập dễ dàng vào dự án có sẵn.
- Chạy chế độ daemon ổn định: Hỗ trợ chế độ daemon chạy nền ổn định, phù hợp triển khai production, đảm bảo dịch vụ luôn sẵn sàng.
Workerman mở ra cơ hội xây dựng ứng dụng mạng realtime, chịu tải lớn cực mạnh mẽ cho cộng đồng lập trình viên PHP.
Xây dựng môi trường phát triển Workerman với ServBay
ServBay là công cụ môi trường phát triển cục bộ, tích hợp sẵn PHP, Node.js, Python, Go, Java,... cùng nhiều hệ quản trị cơ sở dữ liệu và phần mềm server như Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached. Điểm mạnh của ServBay là “cài đặt dùng ngay", đặc biệt Composer đã được cài đặt và cấu hình sẵn giúp việc phát triển ứng dụng Workerman tiện lợi tối đa.
Hướng dẫn này sẽ minh họa quy trình cài đặt – vận hành ứng dụng Workerman trong ServBay thông qua các ví dụ cơ bản: máy chủ HTTP, máy chủ WebSocket, và máy chủ TCP.
TIP
Để dễ quản lý và thống nhất, ServBay khuyến khích bạn đặt mọi tệp dự án website cục bộ vào thư mục /Applications/ServBay/www
. Toàn bộ đường dẫn trong tài liệu này đều lấy theo thư mục gốc này.
Điều kiện cần có
Trước khi bắt đầu, bạn cần đảm bảo:
- Đã cài đặt và chạy ServBay: Tải bản mới nhất tại trang chủ ServBay và cài đặt.
- Kích hoạt PHP trong ServBay: Trên bảng điều khiển ServBay, đảm bảo phiên bản PHP bạn muốn dùng đã được kích hoạt. Workerman yêu cầu PHP 5.4+ (khuyên dùng PHP 7.x hoặc 8.x để tối ưu hiệu năng).
- Có kiến thức PHP cơ bản và dùng dòng lệnh: Bạn cần nắm PHP cơ bản và biết thao tác với terminal.
Cài đặt Workerman
1. Kiểm tra Composer
Composer đã tích hợp sẵn trong ServBay – không cần cài đặt thêm. Chỉ cần chắc chắn môi trường ServBay đã khởi động và đúng phiên bản PHP bạn định dùng được kích hoạt. ServBay sẽ cấu hình tự động Composer tương ứng với PHP.
Mở terminal và gõ lệnh xác nhận Composer hoạt động:
composer -v
Nếu Composer đã cài và cấu hình đúng trong ServBay, bạn sẽ thấy thông tin phiên bản Composer. Nếu không nhận diện được lệnh, hãy kiểm tra lại ServBay đã chạy chưa và PHP đã kích hoạt chưa.
2. Tạo thư mục dự án
Đi đến thư mục gốc của website theo khuyến nghị và tạo thư mục mới cho dự án Workerman, rồi chuyển vào thư mục đó:
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
2
3
Ở đây, chúng ta tạo thư mục servbay-workerman-demo
để lưu mã nguồn dự án.
3. Cài đặt Workerman qua Composer
Trong thư mục dự án (/Applications/ServBay/www/servbay-workerman-demo
), dùng Composer để cài thư viện Workerman (Composer tự xử lý toàn bộ phụ thuộc):
composer require workerman/workerman
Composer sẽ tự động tải Workerman cùng các phụ thuộc về thư mục vendor
trong dự án.
Viết mã máy chủ HTTP với Workerman
Máy chủ HTTP là kịch bản phổ biến nhất khi dùng Workerman để xây dựng web app hoặc API hiệu suất cao.
Tạo file tên http_server.php
(hoặc tên bất kỳ bạn thích, ví dụ server.php
) ngay trong thư mục dự án rồi chép đoạn mã PHP sau:
<?php
// Nhúng file autoload của Composer để sử dụng class Workerman
require __DIR__ . '/vendor/autoload.php';
// Import class Worker của Workerman
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// Tạo một instance Worker, chỉ định protocol và địa chỉ lắng nghe
// 'http://0.0.0.0:8080' nghĩa là tạo server HTTP, lắng nghe cổng 8080 trên mọi interface (0.0.0.0)
// 0.0.0.0 cho phép truy cập từ máy cục bộ hoặc các thiết bị mạng LAN; 8080 là số cổng
$http_worker = new Worker('http://0.0.0.0:8080');
// Cấu hình số lượng tiến trình Worker
// Đặt là 4 – nghĩa là tạo 4 tiến trình PHP độc lập để xử lý request; điều chỉnh theo số nhân CPU
$http_worker->count = 4;
// Định nghĩa logic xử lý khi nhận request từ client
// $connection: đại diện kết nối hiện tại (gửi phản hồi cho client)
// $request: đối tượng chứa thông tin chi tiết của request (URL, Headers, Body, ...)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// Gửi phản hồi đơn giản cho client
// Workerman tự động xử lý header HTTP...
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Khởi động toàn bộ Worker, bắt đầu vòng lặp chính
Worker::runAll();
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
Giải thích mã nguồn:
require __DIR__ . '/vendor/autoload.php';
: Tải autoloader của Composer, giúp tự động load các class Workerman (Worker
,Request
,Response
...).use Workerman\...;
: Import các class cần dùng.new Worker('http://0.0.0.0:8080')
: Tạo instance Worker cho HTTP lắng nghe địa chỉ này.$http_worker->count = 4;
: Thiết lập 4 tiến trình (multi-process), tận dụng CPU đa nhân – tăng khả năng xử lý đồng thời.$http_worker->onMessage = function(...) { ... };
: Định nghĩa callback thực thi mỗi khi nhận request HTTP hoàn chỉnh:$connection
để gửi lại dữ liệu cho client,$request
là thông tin client gửi lên, classResponse
xây dựng phản hồi chuẩn HTTP trả về.Worker::runAll();
: Khởi động event-loop, đưa toàn bộ Worker vào trạng thái lắng nghe và xử lý kết nối.
Chạy thử máy chủ HTTP Workerman
Trong thư mục dự án (/Applications/ServBay/www/servbay-workerman-demo
), mở terminal và gõ lệnh bên dưới để khởi động server HTTP:
php http_server.php start
Các chế độ chạy:
- Chạy foreground (trực tiếp): Khi thực hiện lệnh này, Workerman hoạt động ở foreground – mọi log và thông báo trạng thái hiện ngay trên terminal, dừng server bằng
Ctrl+C
. Chế độ này phù hợp cho phát triển, test. - Chạy daemon (nền): Ở môi trường production, thường server phải chạy nền (background) với option
-d
:bashWorkerman sẽ chạy ở background, log chuyển vào file log riêng (thường trong thư mục của Workerman hoặc đường dẫn chỉ định).php http_server.php start -d
1
Quản lý tiến trình:
Workerman cung cấp nhiều lệnh quản lý tiện lợi:
- Khởi động:
php http_server.php start
(foreground),php http_server.php start -d
(background) - Dừng:
php http_server.php stop
(đợi các request đang xử lý xong rồi dừng êm) - Khởi động lại:
php http_server.php restart
(dừng và chạy lại) - Tải lại (reload):
php http_server.php reload
(thường dùng khi update code, các tiến trình con restart tuần tự, không mất kết nối – chú ý callback nhưonWorkerStart
) - Xem trạng thái:
php http_server.php status
(kiểm tra trạng thái các tiến trình, lượng RAM, số kết nối...)
Sau khi khởi động server, mở trình duyệt và truy cập http://localhost:8080
hoặc http://127.0.0.1:8080
. Bạn sẽ thấy dòng chữ Hello ServBay Workerman HTTP Server!
.
Tạo máy chủ WebSocket với Workerman
WebSocket cho phép client và server (browser ↔ server) duy trì kết nối hai chiều không ngắt quãng, cực kỳ thích hợp xây dựng ứng dụng realtime: chat, market, game, v.v. Workerman hỗ trợ WebSocket rất tốt.
Viết mã máy chủ WebSocket
Tạo file
websocket_server.php
trong thư mục dự án rồi dán mã sau:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // Tạo WebSocket server lắng nghe cổng 8081 // 'websocket://0.0.0.0:8081' tạo server WebSocket và xử lý handshake tự động $ws_worker = new Worker('websocket://0.0.0.0:8081'); // Khởi động 4 tiến trình độc lập $ws_worker->count = 4; // Xử lý khi có client mới kết nối $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // Xử lý khi nhận message từ client // $data – nội dung nhận từ client (đã decode từ WebSocket frame) $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // Phản hồi lại message cho client $connection->send('ServBay Workerman received: ' . $data); }; // Xử lý khi client đóng kết nối $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // Xử lý khi có lỗi (tùy chọn) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // Khởi động toàn bộ 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
39Chạy máy chủ WebSocket
Trong thư mục dự án, gõ lệnh sau để khởi động WebSocket server:
bashphp websocket_server.php start
1Có thể bổ sung
-d
để chạy nền. Sau khi server chạy, bạn dùng các công cụ hỗ trợ WebSocket để kết nối tớiws://localhost:8081
.Ví dụ, test kết nối bằng JavaScript trên console DevTools browser:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket connection opened"); ws.send("Hello from Browser!"); // Gửi message }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // Nhận message }; 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); }; // Đóng connect (tùy chọn) // 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
25Khi kết nối thành công, terminal sẽ hiển thị thông tin kết nối; khi gửi message từ browser, server sẽ hiển thị nội dung nhận và browser nhận được phản hồi.
Tạo máy chủ TCP với Workerman
Workerman cũng rất phù hợp để xây dựng server TCP cho game backend, nền tảng IoT hoặc truyền thông tuỳ chỉnh protocol.
Viết mã máy chủ TCP
Tạo file
tcp_server.php
rồi dán đoạn mã dưới đây:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // Tạo một TCP server lắng nghe cổng 8082 // 'tcp://0.0.0.0:8082' tạo server TCP. Workerman mặc định dùng giao thức Text (\n). $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // Khởi động 4 tiến trình xử lý kết nối $tcp_worker->count = 4; // Xử lý khi có kết nối mới $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // Gửi thông báo chào mừng khi kết nối thành công $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // Xử lý khi nhận data từ client // $data: dữ liệu TCP nhận được (đã xử lý theo protocol) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // Phản hồi lại data cho client $connection->send('ServBay Workerman received: ' . $data); }; // Xử lý khi client đóng kết nối $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; // Khởi động tất cả 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
35Chạy máy chủ TCP
Trong thư mục dự án gõ lệnh sau để khởi động TCP server:
bashphp tcp_server.php start
1Có thể thêm
-d
để chạy background. Sau khi chạy, bạn dùng tool TCP như telnet hoặc netcat để kết nối tớilocalhost:8082
:bash# Dùng telnet telnet localhost 8082 # Hoặc dùng nc (netcat) nc localhost 8082
1
2
3
4
5Sau khi kết nối thành công sẽ thấy server gửi message chào mừng. Gõ bất kỳ nội dung (nhấn Enter vì sử dụng Text protocol), server sẽ phản hồi lại bạn.
Lưu ý cấu hình & thường gặp
- Trùng cổng: Đảm bảo các port Workerman lắng nghe (8080, 8081, 8082 – hoặc số khác) không bị chiếm dụng bởi dịch vụ khác trên macOS/ServBay. Nếu trùng port, Workerman sẽ hiện lỗi và không khởi động. Kiểm tra trạng thái port bằng lệnh:
lsof -i :số_cổng
. - Tường lửa macOS: Nếu bạn cần truy cập server từ ngoài máy (trong LAN), kiểm tra và cấu hình firewall của macOS để mở các port tương ứng.
- So với Web Server ServBay: Workerman lắng nghe cổng riêng, là một tiến trình độc lập với Caddy/Nginx cài trong ServBay. Thông thường Workerman trực tiếp xử lý connection (không qua Caddy/Nginx trừ khi config reverse proxy). Workerman đặc biệt phù hợp ứng dụng long-connection, lượng lớn concurrent (VD: WebSocket), còn Caddy/Nginx xử lý HTTP thông thường.
- Phiên bản PHP: Đảm bảo PHP bạn sử dụng đáp ứng yêu cầu tối thiểu của Workerman. ServBay cho phép chọn phiên bản PHP ngay trên bảng điều khiển.
- Phụ thuộc mở rộng: Workerman tối ưu nhất khi có một số extension PHP như
event
(nếu có sẽ tự sử dụng để tăng hiệu năng),posix
,pcntl
(cho đa tiến trình). ServBay mặc định kích hoạt phần lớn extension thông dụng, song bạn nên kiểm tra nếu gặp lỗi liên quan tới extension. - Log: Khi chạy nền, mọi log của Workerman sẽ chuyển vào file log. Nên định kỳ kiểm tra log để theo dõi tình trạng server hoặc lỗi phát sinh.
Câu hỏi thường gặp (FAQ)
- Q: Làm sao dừng máy chủ Workerman?
- A: Nếu chạy foreground (
start
), đơn giản nhấnCtrl+C
trên terminal. Nếu chạy nền (daemon –start -d
), vào đúng thư mục dự án và dùng lệnhphp ten_file_server.php stop
.
- A: Nếu chạy foreground (
- Q: Tại sao không mở được Workerman server?
- A: Lý do phổ biến nhất là port bạn lắng nghe đã bị ứng dụng khác chiếm. Xem kỹ log console, nếu báo lỗi occupied port hãy đổi port hoặc dừng tiến trình đang chiếm. Dùng
lsof -i :port
để check.
- A: Lý do phổ biến nhất là port bạn lắng nghe đã bị ứng dụng khác chiếm. Xem kỹ log console, nếu báo lỗi occupied port hãy đổi port hoặc dừng tiến trình đang chiếm. Dùng
- Q: Khác biệt giữa Caddy/Nginx của ServBay và Workerman? Khi nào nên dùng gì?
- A: Caddy/Nginx là web server truyền thống – chuyên xử lý HTTP/HTTPS, thường phối hợp PHP-FPM, mỗi request quy trình xử lý xong có thể sẽ reload process PHP. Workerman là framework PHP realtime, bất đồng bộ, có thể đóng vai trò Web Server, xử lý WebSocket, TCP,... chạy lâu dài trong RAM, cực mạnh khi cần long-connection và tải lớn. Chọn cái nào tùy theo ứng dụng của bạn: web, API thông thường chọn Caddy/Nginx; realtime, chat, backend game,... thì Workerman vượt trội. Hoàn toàn có thể kết hợp: Caddy/Nginx làm reverse proxy chuyển request đặc thù sang Workerman.
- Q: Có thể chạy nhiều ứng dụng Workerman đồng thời trên ServBay không?
- A: Được. Tạo script start riêng cho từng ứng dụng, đảm bảo mỗi app nghe cổng khác nhau, mở nhiều cửa sổ terminal chạy từng cái (hoặc background).
Tổng kết
Với tài liệu này, bạn đã nắm rõ cách sử dụng ServBay – môi trường phát triển mạnh mẽ trên macOS – để set up và vận hành dự án Workerman tốc độ cao. Workerman đem lại tiềm năng tạo ứng dụng mạng thế hệ mới cho PHP nhờ hiệu năng và khả năng đồng bộ ưu việt; kết hợp cùng Composer/PHP sẵn sàng trong ServBay, bạn tập trung tối đa cho phần logic, không tốn thời gian setup môi trường. Dù xây dựng dịch vụ web, websocket real-time hay bất kỳ công nghệ mạng động nào, ServBay luôn là cánh tay phải đắc lực cho Workerman của bạn. Chúc bạn khám phá Workerman thành công!