onBufferFull

Giới thiệu:

callback Worker::$onBufferFull

Mỗi kết nối đều có một bộ đệm gửi riêng trên lớp ứng dụng, nếu tốc độ nhận của client nhỏ hơn tốc độ gửi của server, dữ liệu sẽ được tạm thời lưu trữ trong bộ đệm ứng dụng. Nếu bộ đệm đầy, callback onBufferFull sẽ được kích hoạt.

Kích thước bộ đệm lớn nhất là TcpConnection::$maxSendBufferSize, giá trị mặc định là 1MB. Bạn có thể thiết lập kích thước bộ đệm cho kết nối hiện tại một cách động, ví dụ:

// Thiết lập bộ đệm gửi của kết nối hiện tại, đơn vị byte
$connection->maxSendBufferSize = 102400;

Bạn cũng có thể sử dụng TcpConnection::$defaultMaxSendBufferSize để thiết lập kích thước bộ đệm mặc định cho tất cả các kết nối, ví dụ mã sau:

use Workerman\Connection\TcpConnection;
// Thiết lập kích thước bộ đệm gửi ứng dụng mặc định cho tất cả kết nối, đơn vị byte
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

Callback này có thể được kích hoạt ngay lập tức sau khi gọi Connection::send, chẳng hạn như khi gửi dữ liệu lớn hoặc gửi liên tục nhanh chóng đến đối tác. Do các nguyên nhân mạng và lý do khác, dữ liệu bị chèn ép nhiều trong bộ đệm gửi của kết nối tương ứng. Khi vượt quá giới hạn của TcpConnection::$maxSendBufferSize, sự kiện này sẽ được kích hoạt.

Khi xảy ra sự kiện onBufferFull, thường thì nhà phát triển cần thực hiện các biện pháp, chẳng hạn như dừng gửi dữ liệu đến đối tác, chờ cho dữ liệu trong bộ đệm gửi được gửi đi hoàn tất (sự kiện onBufferDrain) và các hành động khác.

Khi gọi Connection::send($A) dẫn đến việc kích hoạt onBufferFull, thì bất kể kích thước của dữ liệu $A là bao nhiêu, ngay cả khi lớn hơn TcpConnection::$maxSendBufferSize, dữ liệu này vẫn sẽ được đưa vào bộ đệm gửi. Có nghĩa là dữ liệu thực tế được đưa vào bộ đệm gửi có thể vượt quá TcpConnection::$maxSendBufferSize. Khi dữ liệu trong bộ đệm gửi đã lớn hơn TcpConnection::$maxSendBufferSize, nếu tiếp tục sử dụng Connection::send($B), dữ liệu '$B' này sẽ không được đưa vào bộ đệm gửi mà sẽ bị loại bỏ và kích hoạt callback onError.

Tóm lại, miễn là bộ đệm gửi chưa đầy, dù chỉ còn một byte trống, gọi Connection::send($A) chắc chắn sẽ đưa $A vào bộ đệm gửi. Nếu sau khi đưa vào bộ đệm gửi, kích thước bộ đệm gửi vượt quá hạn chế của TcpConnection::$maxSendBufferSize, callback onBufferFull sẽ được kích hoạt.

Tham số của hàm callback

$connection

Đối tượng kết nối, tức là 实例 TcpConnection, được sử dụng để thao tác với kết nối client, như là gửi dữ liệu, đóng kết nối và nhiều thao tác khác.

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->onBufferFull = function(TcpConnection $connection)
{
    echo "bufferFull và không gửi nữa\n";
};
// Chạy worker
Worker::runAll();

Ghi chú: Ngoài việc sử dụng hàm ẩn danh làm callback, bạn cũng có thể tham khảo ở đây để sử dụng các cách viết callback khác.

Tham khảo

onBufferDrain sẽ được kích hoạt khi dữ liệu trong bộ đệm gửi của lớp ứng dụng của kết nối được gửi đi hoàn toàn.