Hàm khởi tạo __construct
Giới thiệu:
Worker::__construct([string $listen , array $context])
Khởi tạo một thể hiện Worker container, có thể thiết lập một số thuộc tính và giao diện callback của container, hoàn thành chức năng cụ thể.
Tham số
$listen (tham số tùy chọn, không điền có nghĩa là không lắng nghe bất kỳ cổng nào)
Nếu có thiết lập tham số lắng nghe $listen, sẽ thực hiện lắng nghe socket.
Định dạng của $listen là <giao thức>://<địa chỉ lắng nghe>
<giao thức> có thể là các định dạng sau:
tcp: ví dụ tcp://0.0.0.0:8686
udp: ví dụ udp://0.0.0.0:8686
unix: ví dụ unix:///tmp/my_file (yêu cầu Workerman>=3.2.7)
http: ví dụ http://0.0.0.0:80
websocket: ví dụ websocket://0.0.0.0:8686
text: ví dụ text://0.0.0.0:8686 (text là giao thức văn bản tích hợp sẵn trong Workerman, tương thích với telnet, xem thêm phần phụ lục Giao thức Text)
và các giao thức tùy chỉnh khác, xem phần tùy chỉnh giao thức liên lạc trong hướng dẫn này
<địa chỉ lắng nghe> có thể là các định dạng sau:
Nếu là socket unix, địa chỉ là một đường dẫn đĩa cục bộ
Đối với socket không phải unix, định dạng địa chỉ là <ip cục bộ>:<số cổng>
<ip cục bộ> có thể là 0.0.0.0 để biểu thị lắng nghe tất cả các card mạng của máy tính, bao gồm cả ip nội bộ và ip bên ngoài cũng như vòng lặp cục bộ 127.0.0.1
<ip cục bộ> nếu là 127.0.0.1 nghĩa là chỉ lắng nghe vòng lặp cục bộ, chỉ có thể truy cập từ máy cục bộ, không thể truy cập từ bên ngoài
<ip cục bộ> nếu là ip nội bộ, giống như 192.168.xx.xx, nghĩa là chỉ lắng nghe ip nội bộ, do đó người dùng từ bên ngoài không thể truy cập được
Giá trị mà bạn thiết lập cho <ip cục bộ> nếu không phải là ip của máy cục bộ sẽ không thể thực hiện lắng nghe, và sẽ báo lỗi Cannot assign requested address
Chú ý: <số cổng> không được lớn hơn 65535. <số cổng> nếu nhỏ hơn 1024 thì cần có quyền root mới có thể lắng nghe. Cổng lắng nghe phải là cổng chưa bị chiếm dụng trên máy cục bộ, nếu không sẽ không thể lắng nghe và báo lỗi Address already in use
$context
Một mảng. Được sử dụng để truyền các tùy chọn ngữ cảnh socket, xem tùy chọn ngữ cảnh socket
Ví dụ
Worker như một container http lắng nghe và xử lý yêu cầu http
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Worker như một container websocket lắng nghe và xử lý yêu cầu websocket
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Worker như một container tcp lắng nghe và xử lý yêu cầu tcp
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Worker như một container udp lắng nghe và xử lý yêu cầu udp
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('udp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Worker lắng nghe socket domain unix (yêu cầu Workerman>=3.2.7)
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('unix:///tmp/my.sock');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Worker không thực hiện bất kỳ lắng nghe nào, được sử dụng để xử lý một số tác vụ định kỳ
use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
// Thực hiện mỗi 2.5 giây một lần
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "task run\n";
});
};
// Chạy worker
Worker::runAll();
Worker lắng nghe cổng giao thức tùy chỉnh
Cấu trúc thư mục cuối cùng
├── Protocols // Đây là thư mục Protocols sẽ được tạo
│ └── MyTextProtocol.php // Đây là tệp giao thức tùy chỉnh sẽ được tạo
├── test.php // Đây là tệp script test sẽ được tạo
└── Workerman // Thư mục mã nguồn của Workerman, không thay đổi mã trong đó
1、Tạo thư mục Protocols và tạo một tệp giao thức
Protocols/MyTextProtocol.php(tham khảo cấu trúc thư mục trên)
// Không gian tên giao thức tùy chỉnh của người dùng là Protocols
namespace Protocols;
// Giao thức văn bản đơn giản, định dạng giao thức là văn bản + xuống dòng
class MyTextProtocol
{
// Chức năng phân gói, trả về chiều dài của gói hiện tại
public static function input($recv_buffer)
{
// Tìm kiếm ký tự xuống dòng
$pos = strpos($recv_buffer, "\n");
// Nếu không tìm thấy ký tự xuống dòng, có nghĩa là không phải là một gói hoàn chỉnh, trả về 0 để tiếp tục chờ dữ liệu
if($pos === false)
{
return 0;
}
// Nếu tìm thấy ký tự xuống dòng, trả về chiều dài của gói hiện tại, bao gồm cả ký tự xuống dòng
return $pos+1;
}
// Sau khi nhận được một gói hoàn chỉnh, sẽ tự động giải mã thông qua decode, ở đây chỉ bỏ ký tự xuống dòng
public static function decode($recv_buffer)
{
return trim($recv_buffer);
}
// Trước khi gửi dữ liệu tới client sẽ tự động mã hóa thông qua encode, rồi mới gửi tới client, ở đây thêm ký tự xuống dòng
public static function encode($data)
{
return $data."\n";
}
}
2、Sử dụng giao thức MyTextProtocol để lắng nghe và xử lý yêu cầu
Tham khảo cấu trúc thư mục cuối cùng, tạo tệp test.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// #### Worker MyTextProtocol ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
/*
* Khi nhận được một dữ liệu hoàn chỉnh (kết thúc bằng ký tự xuống dòng), sẽ tự động thực hiện MyTextProtocol::decode('dữ liệu nhận được')
* Kết quả sẽ được truyền qua biến $data tới callback onMessage
*/
$text_worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump($data);
/*
* Gửi dữ liệu tới client, sẽ tự động gọi MyTextProtocol::encode('hello world') để thực hiện mã hóa giao thức,
* rồi gửi tới client
*/
$connection->send("hello world");
};
// Chạy tất cả workers
Worker::runAll();
3、Kiểm tra
Mở terminal, vào thư mục chứa test.php, thực hiện php test.php start
php test.php start
Workerman[test.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.7 PHP version:5.4.37
------------------------ WORKERS -------------------------------
user worker listen processes status
root none myTextProtocol://0.0.0.0:5678 1 [OK]
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.
Mở terminal, sử dụng telnet để kiểm tra (khuyên dùng telnet của hệ thống linux)
Giả sử là kiểm tra trên máy cục bộ,
trong terminal thực hiện telnet 127.0.0.1 5678
sau đó nhập hi và nhấn Enter
sẽ nhận được dữ liệu hello world\n
telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world