send
Giới thiệu:
mixed Connection::send(mixed $data [,$raw = false])
Gửi dữ liệu đến khách hàng
Tham số
$data
Dữ liệu cần gửi, nếu đã chỉ định giao thức khi khởi tạo lớp Worker, thì sẽ tự động gọi phương thức encode của giao thức, hoàn thành công việc đóng gói giao thức trước khi gửi cho khách hàng
$raw
Có gửi dữ liệu thô hay không, tức là không gọi phương thức encode của giao thức, mặc định là false, tức là tự động gọi phương thức encode của giao thức
Giá trị trả về
true có nghĩa là dữ liệu đã được ghi thành công vào bộ đệm gửi socket của hệ điều hành ở kết nối đó
null có nghĩa là dữ liệu đã được ghi vào bộ đệm gửi của lớp ứng dụng tại kết nối đó, đang chờ để ghi vào bộ đệm gửi socket của hệ thống
false có nghĩa là gửi thất bại, lý do thất bại có thể là kết nối của khách hàng đã bị đóng, hoặc bộ đệm gửi của lớp ứng dụng tại kết nối đó đã đầy
Lưu ý
send trả về true, chỉ đơn thuần có nghĩa là dữ liệu đã được ghi thành công vào bộ đệm gửi socket của hệ điều hành ở kết nối đó, không có nghĩa là dữ liệu đã được gửi thành công đến bộ đệm nhận socket của đối phương, và cũng không có nghĩa là ứng dụng ở đối phương đã đọc dữ liệu từ bộ đệm nhận socket ở máy local. Tuy nhiên, ngay cả như vậy, chỉ cần send không trả về false và mạng không bị ngắt, và khách hàng nhận dữ liệu bình thường, dữ liệu cơ bản có thể được xem như có thể 100% gửi đến đối phương.
Do dữ liệu trong bộ đệm gửi socket được hệ điều hành gửi không đồng bộ đến đối phương, hệ điều hành không cung cấp cơ chế xác nhận tương ứng cho lớp ứng dụng, vì vậy lớp ứng dụng không thể biết dữ liệu trong bộ đệm gửi socket bắt đầu được gửi lúc nào, lớp ứng dụng cũng không thể biết dữ liệu trong bộ đệm gửi socket có được gửi thành công hay không. Dựa trên những lý do trên, Workerman không thể cung cấp giao diện xác nhận tin nhắn trực tiếp.
Nếu nghiệp vụ cần đảm bảo mỗi tin nhắn đều được nhận bởi khách hàng, có thể tăng cường một cơ chế xác nhận trong nghiệp vụ. Cơ chế xác nhận có thể khác nhau tùy theo nghiệp vụ, ngay cả khi cùng một nghiệp vụ cũng có thể có nhiều phương pháp xác nhận khác nhau.
Ví dụ như hệ thống trò chuyện có thể sử dụng cơ chế xác nhận như vậy. Lưu từng tin nhắn vào cơ sở dữ liệu, mỗi tin nhắn đều có trường xem đã đọc hay chưa. Mỗi khi khách hàng nhận được một tin nhắn, gửi một gói xác nhận đến máy chủ, máy chủ sẽ đánh dấu tin nhắn tương ứng là đã đọc. Khi khách hàng kết nối với máy chủ (thường là khi người dùng đăng nhập hoặc kết nối lại sau khi mất kết nối), truy vấn cơ sở dữ liệu xem có tin nhắn chưa đọc nào không, nếu có thì gửi cho khách hàng, tương tự như vậy, khách hàng nhận được tin nhắn sau đó thông báo máy chủ đã đọc. Theo cách này có thể đảm bảo mỗi tin nhắn đều được đối phương nhận. Tất nhiên, nhà phát triển cũng có thể sử dụng logic xác nhận của riêng mình.
Ví dụ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Sẽ tự động gọi \Workerman\Protocols\Websocket::encode để đóng gói thành dữ liệu giao thức websocket trước khi gửi
$connection->send("hello\n");
};
// Chạy worker
Worker::runAll();