onBufferFull

الوصف:

callback Worker::$onBufferFull

كل اتصال لديه مساحة إرسال خاصة به في طبقة التطبيق، فإذا كانت سرعة استلام العميل أقل من سرعة إرسال الخادم، سيتم تخزين البيانات في مساحة الإرسال، وإذا كانت المساحة ممتلئة، فسوف يتم استدعاء رد النداء onBufferFull.

حجم المساحة هو TcpConnection::$maxSendBufferSize، القيمة الافتراضية هي 1MB، ويمكن ضبط حجم المساحة ديناميكيًا للاتصال الحالي، على سبيل المثال:

// ضبط مساحة الإرسال للاتصال الحالي، وحدة البايت
$connection->maxSendBufferSize = 102400;

يمكن أيضًا استخدام TcpConnection::$defaultMaxSendBufferSize لتعيين الحجم الافتراضي لجميع الاتصالات، على سبيل المثال:

use Workerman\Connection\TcpConnection;
// ضبط حجم مساحة الإرسال الافتراضية لجميع الاتصالات، وحدة البايت
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

قد يتم استدعاء هذا النداء في بعض الأحيان فور استدعاء Connection::send، مثلما يحدث عند إرسال بيانات كبيرة أو إرسال بيانات بسرعة متتالية إلى الجانب الآخر، بسبب أسباب تتعلق بالشبكة وغيرها، تتراكم البيانات بكثرة في مساحة الإرسال الخاصة بالاتصال المعني، وعندما تتجاوز TcpConnection::$maxSendBufferSize الحد الأقصى، يتم استدعاؤه.

عند حدوث حدث onBufferFull، يحتاج المطور عادةً إلى اتخاذ تدابير، مثل التوقف عن إرسال البيانات إلى الجانب الآخر، والانتظار حتى يتم إرسال البيانات من مساحة الإرسال (حدث onBufferDrain) وغيرها.

عند استدعاء Connection::send($A) مما يؤدي إلى تفعيل onBufferFull، بغض النظر عن حجم البيانات المرسلة $A، حتى لو كانت أكبر من TcpConnection::$maxSendBufferSize، فإن البيانات التي سيتم إرسالها هذه المرة ستظل تُضاف إلى مساحة الإرسال. بعبارة أخرى، قد تكون البيانات المتواجدة في مساحة الإرسال أكبر بكثير من TcpConnection::$maxSendBufferSize، وعندما تكون البيانات في مساحة الإرسال أكبر من TcpConnection::$maxSendBufferSize، إذا تم الاستمرار في استدعاء Connection::send($B) للبيانات، فلن يتم إضافة بيانات $B هذه إلى مساحة الإرسال، بل سيتم تجاهلها، مما يؤدي إلى استدعاء رد النداء onError.

بإيجاز، طالما أن مساحة الإرسال ليست ممتلئة، حتى لو كانت هناك مساحة بايت واحدة فقط، فإن استدعاء Connection::send($A) سيؤدي بالتأكيد إلى إضافة $A إلى مساحة الإرسال، وإذا تجاوزت مساحة الإرسال حجم TcpConnection::$maxSendBufferSize بعد إضافتها، فسوف يتم استدعاء رد النداء onBufferFull.

معلمات دالة النداء

$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::runAll();

تلميح: بالإضافة إلى استخدام الدوال المجهولة كنداء، يمكنك أيضًا الرجوع إلى هنا لاستخدام طرق نداء أخرى.

انظر أيضًا

onBufferDrain يتم استدعاؤها عندما تتم عملية إرسال البيانات من مساحة الإرسال في طبقة التطبيق بالكامل.