onBufferFull

คำอธิบาย:

callback Worker::$onBufferFull

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

ขนาดบัฟเฟอร์สูงสุดคือ TcpConnection::$maxSendBufferSize ค่าตั้งต้นคือ 1MB สามารถกำหนดขนาดบัฟเฟอร์ได้อย่างไดนามิกสำหรับการเชื่อมต่อปัจจุบัน เช่น:

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

นอกจากนี้ยังสามารถใช้ TcpConnection::$defaultMaxSendBufferSize เพื่อกำหนดขนาดบัฟเฟอร์ของการเชื่อมต่อทั้งหมด เช่น รหัสตัวอย่าง:

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

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

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

เมื่อเรียกใช้ Connection::send($A) ซึ่งทำให้เกิดการเรียกใช้ onBufferFull ข้อมูลที่ส่งในครั้งนี้ $A ไม่ว่าจะใหญ่เพียงใด แม้จะเกิน TcpConnection::$maxSendBufferSize ข้อมูลที่จะส่งในครั้งนี้ยังคงถูกใส่เข้าไปในบัฟเฟอร์การส่งข้อมูล ซึ่งหมายความว่าข้อมูลที่ถูกใส่ในบัฟเฟอร์การส่งข้อมูลอาจมีมากกว่าขนาดจำกัดของ TcpConnection::$maxSendBufferSize เมื่อข้อมูลในบัฟเฟอร์การส่งข้อมูลมีขนาดใหญ่กว่าขีดจำกัดของ TcpConnection::$maxSendBufferSize หากยังคงทำการเชื่อมต่อด้วย Connection::send($B) ข้อมูล $B นี้จะไม่ถูกใส่เข้าไปในบัฟเฟอร์การส่งข้อมูล แต่จะถูกทิ้งไปและทำให้เกิดการเรียกใช้ onError callback

สรุป คือ ตราบใดที่บัฟเฟอร์การส่งข้อมูลยังไม่เต็ม แม้จะมีพื้นที่เพียงหนึ่งไบต์เมื่อเรียกใช้ Connection::send($A) ก็จะต้องมีการใส่ $A เข้าไปในบัฟเฟอร์การส่งข้อมูล หากหลังจากใส่แล้ว ขนาดบัฟเฟอร์การส่งข้อมูลเกินขีดจำกัดของ TcpConnection::$maxSendBufferSize จะทำให้เกิดการเรียกใช้ onBufferFull callback

พารามิเตอร์ของ callback function

$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 แล้ว ยังสามารถ ดูเพิ่มเติมได้ที่นี่ เพื่อใช้วิธีการเขียน callback อื่นๆ

ดูเพิ่มเติม

onBufferDrain จะถูกเรียกใช้เมื่อข้อมูลบัฟเฟอร์การส่งของชั้นแอปพลิเคชันถูกส่งครบถ้วนแล้ว