اذهب إلى المحتوى
  • 0

كيف نستخدم تقنية Server Sent Events

علي الكاسر

السؤال

السلام عليكم 

قريبا تعلمت هذه التقنيه Server Sent Events 

سؤالي هل اذا جربت الاكواد خاصتها مباشره هل تتسبب بالضغط على السيرفر مما يؤدي الى اغلاقه خاصه اذا كان زوار الموقع بالالاف، وهل يمكن اذا استعملناها في جلب البيانات من الداتا بيز وارسالها للمتصفح هل هذا سيؤثر ايضا على السيرفر 

وماهي الحلول في حال كانت الاجوبة بنعم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

نظام الSSE  ليس لتعديل البيانات و بعث بيانات يعتبر نظام الSSE مثال على إرسال البيانات من إتجاه واحد فقط من ناحية الServer  فقط لذلك لا يمكنك إرسال أي معلومات الى السيرفير سوى للقيام بعمل HandChaking  أي خلق أتصال بين السيرفر و التطبيق مثال على أستعمال هذه الطريقة هي Notification  أي جلب أي معلومات يتم تحديثها بأستمرار .

نظام الSEE  يشبه كثيرا ال WebSocket  الا أن WebSockets  تختلف بحيث أنها ترسل و تستقبل معلومات من و إالى السيرفر أما الSSE  فقط يرسل من السيرفير الى التطبيق و أن أرسلت معلومات  زائدة عن رقم ال CLIENT أو إسم الEVENT  .. الخ, فسوف يتم تجاهلها 

عملية إرسال المعلومات من السيرفير الى التطبيق عدة مرات لن يقوم بغلق السيرفير و لن يكون تدفق المعلومات عبئ على الشبكة بحيث أنه لن يتم إرسال المعلومات من السيرفير الى المتصفح أو الهاتف بشكل مستمر بالرغم من أن الأتصال يبقى مفتوح بحيث أولا لا يوجد أرسال سوى بأتجاه واحد فقط كما أن عملية التصافح HandChacking  تحدث مرة واحدة فقط و أيضا الأتصال ممكن أن يتم أيقافه مؤقتا إن لم يكن المستخدم active لذلك لن يكون هناك تاثير كبير على عمل السيرفير أن كان هنالك الألاف من الستخدمين و لهذه المشكلة تم تصميم هذه النظام 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 12 ساعات قال Nuhla Almasri:

أن أرسلت معلومات  زائدة عن رقم ال CLIENT أو إسم الEVENT  .. الخ, فسوف يتم تجاهلها 

ممكن توضيح لهذه الجزئية لم افهمها ماهو هذا الرقم او اسم الحدث

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 23 ساعات قال علي الكاسر:

ممكن توضيح لهذه الجزئية لم افهمها ماهو هذا الرقم او اسم الحدث

// هكذا يتم تعريف الSSE
// من جهة السيرفير لاحظ أنه لا يستقبل أي داتا و ضمنيا فقط يستقبل رقم المستخدم و أسم الأيفينت 


// هنا تعريف الEventHandler 
// لل SSE 

function eventsHandler(request, response, next) {
  const headers = {
    'Content-Type': 'text/event-stream',
    'Connection': 'keep-alive',
    'Cache-Control': 'no-cache'
  };
  response.writeHead(200, headers);

  const data = `data: ${JSON.stringify(facts)}\n\n`;

  response.write(data);

  const clientId = Date.now();

  // هنا نقوم بإعطاء المستخدم ID
  // و يتم المصادقة فقط مره واحدة 
  const newClient = {
    id: clientId,
    response
  };

  clients.push(newClient);

  request.on('close', () => {
    console.log(`${clientId} Connection closed`);
    clients = clients.filter(client => client.id !== clientId);
  });
}

// و هنا نستخدم أسم ال EVENTHANDLER 
// الذي نريد تنفيدذه 
app.get('/events', eventsHandler);

و من جهة المستخدم يقوم بإستدعاء الدالة مرارا و تكرار حسب إسم الروات التي تقوم بأستدعاء الSSE eventHandler

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 6/27/2021 at 13:19 قال Nuhla Almasri:

من جهة المستخدم يقوم بإستدعاء الدالة مرارا و تكرار حسب إسم الروات التي تقوم بأستدعاء الSSE eventHandler

انا استخدم هذا الكود وسغال معي ولا توجد به مشاكل ولكن هل يمكنني الاعتماد عليه، الكود الذي ارسلتيه يختلف عن هذا كثير ومعقد جدا 

<?php
    set_time_limit(0); // لايوجد اقصى مدة للطلب
    header("Content-Type: text/event-stream");
    $viewd = 0; // عدد الرسائل التي عرضت لمنع إرسال الرسالة اكثر من مرة
    $lastFileSize = 0; // حجم الملف عندما يتغير فان هناك رسالة ارسلت
    while(true){
        if(filesize("data.json") >= $lastFileSize){// التحديث فقط عند تغير حجم الملف
            $messages = json_decode(file_get_contents("data.json")); // قراءة الرسائل
            for($i=$viewd;$i<=sizeof($messages)-1;$i++){ // حلقة تكرار من أخر رسالة مُرسلة
                echo "data: ".json_encode($messages[$i]).PHP_EOL;
                echo PHP_EOL;
            }
            $viewd = sizeof($messages); // تحديث عدد الرسائل المرسلة
   $lastFileSize = filesize("data.json"); // تحديث مُتغير أخر حجم للملف
        }
        ob_flush();
        flush();
        sleep(1);
    }
?>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أنت تستخدم الPHP  و أختلاف طريقة كتابة الكود لا يختلف بأستعماله لكل لغة طريقة معينىة بتطبيق نفس الكود ما ارسلته انا هو بال Javascript , nodeJs لكن المهم أن الطريقة المستخدمة تخدمك فقط لأستدعاء بيانات من السيرفير و ليس لأرسال أو تعديل البينات بالسيرفير وإن أحتجت لتعديل أو أرسال بيانات ستحتاج الى أستعمال http Request. أستخدام الSSE  هو لتقليل الثقل على السيرفر كما ذكرنا و هذا ما انت تريده   

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 ساعات قال Nuhla Almasri:

أنت تستخدم الPHP  و أختلاف طريقة كتابة الكود لا يختلف بأستعماله لكل لغة طريقة معينىة بتطبيق نفس الكود ما ارسلته انا هو بال Javascript , nodeJs لكن المهم أن الطريقة المستخدمة تخدمك فقط لأستدعاء بيانات من السيرفير و ليس لأرسال أو تعديل البينات بالسيرفير وإن أحتجت لتعديل أو أرسال بيانات ستحتاج الى أستعمال http Request. أستخدام الSSE  هو لتقليل الثقل على السيرفر كما ذكرنا و هذا ما انت تريده   

هذا ما اود سماعه شكرا لك 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...