الظاهرة:

عند تشغيل أمر الحالة (status)، يتم رؤية حالات send_fail، ما هو السبب؟

الجواب:

عادةً ما لا تكون حالة send_fail مشكلة كبيرة، وعادةً ما يكون ذلك بسبب إغلاق الاتصال من قبل العميل أو عدم قدرة العميل على استقبال البيانات مما يؤدي إلى فشل إرسال البيانات.

يوجد سببان لحالة send_fail:

  1. استدعاء واجهة send لإرسال البيانات إلى العميل يظهر أن العميل قد فصل الاتصال بالفعل، وبالتالي يتم زيادة عدد send_fail. نظرًا لأن الفصل هو ناتج عن العميل بناء، فهو ظاهرة طبيعية يمكن تجاهلها عادةً.

  2. سرعة إرسال البيانات من الخادم أكبر من سرعة استقبال العميل، مما يؤدي إلى تراكم البيانات بشكل مستمر في الذاكرة المؤقتة للخادم (workerman يقوم بإنشاء مساحة ذاكرة مؤقتة لكل عميل). إذا تجاوزت حجم المساحة المؤقتة الحد المسموح به (TcpConnection::$maxSendBufferSize الافتراضي 1 ميغابايت)، فسيتم التخلص منها، مما يؤدي إلى تنشيط حدث onError (إذا كان موجودًا)، وزيادة عدد send_fail.

على سبيل المثال، يمكن أن يتوقف تشغيل JavaScript بعد تصغير المتصفح، مما يؤدي إلى توقف استقبال بيانات الخادم، وتراكم البيانات لفترة طويلة في الذاكرة المؤقتة، وبتجاوز الحد المسموح به، ستزيادة عدد send_fail عند كل استدعاء لـ send.

التلخيص:

عادةً ما لا داعي للقلق بشأن send_fail الناتجة عن فصل العميل عن الاتصال.

إذا كانت send_fail بسبب توقف العميل عن استقبال البيانات، فيجب التحقق من سلامة العميل.

إذا استمرت سرعة استقبال البيانات من العميل في التراجع بشكل مستمر مقارنة بسرعة إرسال الخادم، فيجب التفكير في تحسين عمليات العمل، أو تحسين أداء العميل. وإذا كان سبب عدم الانسيابية في الإرسال ناجمًا عن عرض النطاق الترددي، فيمكن النظر في زيادة عرض النطاق الترددي للسيرفر.