onBufferFull

คำอธิบาย:

callback Worker::$onBufferFull

ทุกการเชื่อมต่อจะมี buffer สำหรับการส่งที่ระดับแอปพลิเคชันเป็นลมอยู่ ถ้าความเร็วในการรับของผู้ใช้น้อยกว่าความเร็วในการส่งของเซิร์ฟเวอร์ ข้อมูลจะถูกเก็บไว้ใน buffer ของระดับแอปพลิเคชัน ถ้า buffer เต็มแล้วจะเรียกใช้ callback onBufferFull

buffer ส่งขนาดใหญ่TcpConnection::$maxSendBufferSizeมีค่าเริ่มต้นที่ 1MB สามารถตั้งค่าขนาด buffer ได้แบบไดนามิกสำหรับการเชื่อมต่อปัจจุบัน เช่น:

// ตั้งค่าขนาด buffer ส่งของการเชื่อมต่อปัจจุบัน หน่วยเป็นไบต์
$connection->maxSendBufferSize = 102400;

และยังสามารถใช้TcpConnection::$defaultMaxSendBufferSizeเพื่อตั้งค่าขนาด buffer เริ่มต้นสำหรับการเชื่อมต่อทั้งหมด เช่นโค้ด:

use Workerman\Connection\TcpConnection;
// ตั้งค่าขนาด buffer ส่งของการเชื่อมต่อทั้งหมดเป็นค่าเริ่มต้น หน่วยเป็นไบต์
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

callback นี้อาจถูกเรียกทันทีหลังจากการเรียก Connection::send เช่น การส่งข้อมูลขนาดใหญ่หรือทำการส่งข้อมูลไปทับซ้ำโดยรวดเร็วไปยังอีกฝั่ง เนื่องจากเหตุผลต่างๆ ข้อมูลก็ถูกเหลือไว้ใน buffer ส่งของการเชื่อมต่อที่เกี่ยวกับ การเกินข้างบนของTcpConnection::$maxSendBufferSizeเวลาจะเรียกใช้

เมื่อเกิดเหตุการณ์ onBufferFull นักพัฒนาควรทำหน้าที่ เช่น หยุดการส่งข้อมูลไปที่อีกฝั่ง รอให้ข้อมูลใน buffer ส่งเสร็จสิ้น (เหตุการณ์ onBufferDrain) เป็นต้น

เมื่อเรียกใช้ Connection::send($A) ครั้งที่ส่งเป็นโอกาสที่เรียกใช้ onBufferFull เหมือนกับข้อมูลที่จะส่งที่จะถูกเก็บใน buffer ส่ง ไม่ว่าจะใหญ่ขนาดเท่าไร แม้แต่มันใหญ่กว่าTcpConnection::$maxSendBufferSize ข้อมูลที่จะส่งในครั้งนี้ยังคงถูกเก็บไว้ใน buffer ส่ง นอกเหนือจาก buffer ส่งภายในีจระับไว و܇ณัวการเกินขอบเขตTcpConnection::$maxSendBufferSize จะเรียกใช้ onBufferFull

โดยสรุป รำับว่า ถ้า buffer ส่งยังไม่เต็ม ไมัสำคัญแม้แต่มีแค่พื้นที่ไว้จิ่การเรียกใช้ Connection::send($A) จะเอา$Aไปใส่ใน buffer การส่ง หากอย่างไรก็ตามหลังจากเอาไปในbuffer การส่งแล้วถ้าขนาดของ buffer การส่งมีค่ามากกว่าTcpConnection::$maxSendBufferSize การจําเงิบจะเรียกใช้ onBufferFull回。

พารามิเตอร์ของฟังก์ชัน callback

$connection

วัตถุการเชื่อมต่อ ซึ่งหมายควา TcpConnection ที่เป็นอิสปรินึเมน ใช้ในการดําเนินการ เช่น ส่งข้อมูล ปิดการเชื่อมต่อ เป็นต้น

ตัวอย่าง

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 and do not send again\n";
};
// ทำให้ worker ทำงาน
Worker::runAll();

เรายังสามารถอ้างอิงที่นี่ไปยังวิธีการตั้งค่า callback อื่นๆได้

ดูเพิ่มเติม

onBufferDrain เมื่อข้อมูลใน buffer ส่งของการเชื่ออถอยหมดการส่งทั้งหมดของการเชื่อมต่อ เกิดขึ้น