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 जब कनेक्शन के एप्लीकेशन स्तर के भेजने वाले बफर का डेटा पूरी तरह से भेज दिया जाता है तो ट्रिगर होता है।