send
说明:
mixed Connection::send(mixed $data [,$raw = false])
إرسال البيانات إلى العميل
المعاملات
$data
البيانات المرسلة. إذا تم تحديد البروتوكول عند تهيئة فئة Worker، فسيتم استدعاء طريقة encode الخاصة بالبروتوكول تلقائيًا، وسيتم إرسال البيانات بعد حزمها وفقًا للبروتوكول إلى العميل.
$raw
ما إذا كان سيتم إرسال البيانات الأصلية، أي عدم استدعاء طريقة encode للبروتوكول، الافتراضي هو false، أي استدعاء طريقة encode للبروتوكول تلقائيًا.
القيمة المرجعة
true تعني أن البيانات قد كُتبت بنجاح إلى منطقة تخزين مؤقت لإرسال socket على مستوى نظام التشغيل للاتصال.
null تعني أن البيانات قد كُتبت إلى منطقة تخزين مؤقت للإرسال على مستوى التطبيق للاتصال، في انتظار الكتابة إلى منطقة تخزين مؤقت لـ socket على مستوى نظام التشغيل.
false تعني أن الإرسال قد فشل، قد يكون السبب في ذلك هو أن اتصال العميل قد تم إغلاقه بالفعل، أو أن منطقة تخزين مؤقت للإرسال على مستوى التطبيق قد امتلأت.
تنبيه
إرجاع send true يعني فقط أن البيانات قد كُتبت بنجاح إلى منطقة تخزين مؤقت لإرسال socket على مستوى نظام التشغيل، ولا يعني أن البيانات قد أُرسلت بنجاح إلى منطقة تخزين مؤقت لاستقبال socket على الجانب الآخر، ولا يعني أن التطبيق على الجانب الآخر قد قرأ البيانات من منطقة التخزين المؤقتة المحلية لـ socket. ومع ذلك، طالما أن send لا ترجع false وأن الشبكة لم تنقطع، وأن العميل يستقبل بشكل طبيعي، فيمكن اعتبار البيانات بشكل أساسي أنه تم إرسالها إلى الطرف الآخر بنسبة 100%.
نظرًا لأن البيانات في منطقة التخزين المؤقت لإرسال socket يتم إرسالها بشكل غير متزامن من قبل نظام التشغيل إلى الطرف الآخر، لم يوفر نظام التشغيل آلية تأكيد مناسبة على مستوى التطبيق، لذا فإن المستوى التطبيقي لا يستطيع معرفة متى تبدأ البيانات في منطقة التخزين المؤقت للإرسال في الإرسال، و المستوى التطبيقي لا يستطيع معرفة ما إذا كانت البيانات في منطقة التخزين المؤقت للإرسال قد تم إرسالها بنجاح. بناءً على الأسباب المذكورة أعلاه، لا يمكن لـ workerman مباشرة تقديم واجهة تأكيد الرسائل.
إذا كانت الأعمال تتطلب ضمان أن كل رسالة قد تلقاها العميل، يمكن إضافة آلية تأكيد على مستوى الأعمال. قد تختلف آلية التأكيد حسب الأعمال، حتى لو كانت نفس الأعمال، يمكن أن يكون هناك طرق متعددة لآلية التأكيد.
على سبيل المثال، يمكن لنظام الدردشة استخدام هذه الآلية للتأكيد. يتم تخزين كل رسالة في قاعدة البيانات، وكل رسالة تحتوي على حقل يشير ما إذا كانت قد تم قراءتها. بعد أن يتلقى العميل رسالة، يرسل حزمة تأكيد إلى الخادم، ويقوم الخادم بتعيين الرسالة المقابلة كـ "تمت قراءتها". عندما يتصل العميل بالخادم (عادةً عند تسجيل الدخول أو إعادة الاتصال بعد الانقطاع)، يتحقق مما إذا كانت هناك رسائل غير مقروءة في قاعدة البيانات، وإذا كان هناك، يتم إرسالها إلى العميل، وبالمثل، يقوم العميل بإخطار الخادم أن الرسالة قد تم قراءتها. هذا يضمن أن كل رسالة يمكن استقبالها من الطرف الآخر. بالطبع، يمكن للمطورين استخدام منطقتهم لتأكيد المنطق.
المثال
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
// سيؤدي هذا إلى استدعاء \Workerman\Protocols\Websocket::encode تلقائيًا لتغليف البيانات في بروتوكول websocket وإرسالها
$connection->send("hello\n");
};
// تشغيل الworker
Worker::runAll();