التعليم
Server Sent Event-HTML5
مقدمة تعريفية
نعيش في وقتنا الحاضر في ظ ّل ثورة علم ّية ومعلومات ّية تجعل من عالم الويب الحديث عالم مليء بالتحديات .حيث تبرز الكثير من
المتطلبات ومن ضمنها ان يكون تحميل صفحات الويب سريعا ويجب ان يكون المحتوى مفيد ومشوق ومحدث تلقائيا.
من المعروفانه في عالم الويب تستخدم لغة الـ HTMLفي أنشاء هيكلية صفحات الويب ,وتستخدم الـ CSSلانشاء ثيم لهذه الصفحات
(حيث يشمل تحديد الخلفية ,نوع النص ,حجم النص والالوان ,غيرها).
أما لغة الـ ( )Java Scriptفهي المسؤولة عن جعل صفحات الويب تفاعلية (على سبيل المثال :وجود رسوم متحركة معقدة او أزرار قابلة
للنقر وقوائم منبثقة وغيرها من الامور المشابهة).
لدينا شيئان هما:
مثــال :لنفــرض انــه كل حزمــة مــن Data Pull . 2
البيانــات تحتــاج الــى 100msلكــي تنتقــل .١هيكلية الصفحة
بيــن ال serverوال . client هــي تقنيــة تقليديــة متوفــرة قبــل ال SSE .٢البيانات نفسها
حيـث تقـوم الصفحـة بعمـل طلـب بصـورة
-فــي حالــة الــ data pushســوف يحصــل متكـررة ( كل عـدد معيـن مـن الثوانـي) الـى
clientعلــى البيانــات بعــد 100msمــن serverفيمـا اذا كان هنالـك بيانـات جديـدة بصورةعامـة عندمـا تكـون البيانـات محدثـة
ام لا .ومثــال علــى ذلــك أســتخدام تقنيــات فالهيكليــة لاتحتــاج الــى تحيــث ومــن هنــا
حصــول serverعليهــا . ال AJAX HTTP Requestلعمــل طلــب علــى جائــت الرغبــة الــى التفكيــر بأســتخدام
-فـي حالـة الــ :data pullلنفـرض انـه client بيانـات جديـدة و ُتعـرف هـذه الطريقـة بأنهـا تقنيــات تعمــل علــى تحديــث محتــوى
يقــوم بعمــل طلــب الــى serverكل ,10s ( )Two-Way-Messagingحيــث يقــوم client الصفحـة باسـرع وقـت وبصـورة اتوماتيكيـة
فبالتال ـي ســوف يحص ـل علــى البيان ـات بعــد بعمــل ( )requestالــى serverفــي الخطــوة بـدون الحاجـة الـى عمـل ( )reloadللصفحـه
الاولـى ,ومـن ثـم يرسـل serverالاسـتجابة
( ,)10s + 100msأي بعــد (!)ms 10100 لــه فــي الخطــوة الثانيــة وعــادة الاســتجابة مــن قبــل المســتخدم.
وبهــذا يمكــن الاســتنتاج بــأن قيمــة ال تكــون أمــا ( )New Dataاو فارغــة (empty ســوف نتحــدث فــي هــذا المقــال عــن
latencyفـي حالـة الــ data pushتكـون أقـل )Responseفــي حالــة عــدم وجــود بيانــات أشــهر التقنيــات التــي تضمــن التأكــد مــن
• لايوجــد هــدر فــي أســتخدام المــوارد (CPU جديــدة .الصــورة التاليــة توضــح عمــل ال أن الاشــخاص الذيــن يســتخدمون الموقــع
.)cycle , Network Bandwidthبخــاف ال الالكترونــي علــى شــبكة الويــب يحصلــون
,data pullفلنفــرض فــي حالــة قيــام ال .data pull علــى محتــوى محــدث بصــورة تلقائيــة
clientبعمــل طلــب متكــرر للبيانــات وهـذه التقنيـات هـي علـى نوعيـنdata push :
(كل عــدد معيــن مــن الثوانــي) ,وفــي الواقــع او ماتعــرف بالــ ( )Server-sent-Eventو الــ
.data pull
ال serverلايملــك بيانــات جديــدة ,ســوف Data Push . 1
يـؤدي ذلـك الـى هـدر فـي أسـتخدام المـوارد
وعمــل مزيــد مــن الطلبــات بــدون جــدوى.
• ( )automatic reconnectionتقــوم الــ الــ data pushاو )Server sent Event) SSE
SSEباعــادة الاتصــال مــع serverفــي حالــة و ُتعــرف علــى انهــا احــد تقنيــات ال HTML5
والتــي تســمح لــل ( )serverبأرســال بيانــات
انقطاعــه . جديــدة ( )New Dataمباشــرة الــى (,)client
أمثلة عن تطبيقات الكترونية تستخدم الصورة Data pull :2 وال ـذي يقص ـد ب ـه هن ـا صفح ـة الوي ـب ,فف ـي
تقنية ال SSE هــذه التقنيــة يكــون أتجــاه نقــل البيانــات
Facebook / twitter updates .1 مميزات Data Push/SSE مــن serverالــى clientكمــا موضــح فــي
مــن الملاحــظ انــه نتيجــة تطبيــق ِكلتــا الصــورة التاليــة بــدون الحاجــة الــى انتظــار
Chat Application .2 التقنيتيــن تــؤدي فــي النهايــة الــى حصــول طلـب ( )requestمـن ( .)clientوعـادة يطلـق
Online Game . 3 عليهــا ()One-Way Messaging
News feed . 4
Sport results . 5
clientعلـى بيانـات جديـدة New Dataوبـدون
عمــل reloadللصفحــة.
.ولكــن الجديــر بالذكــر أن ال data push
تمتلــك بعــض المميــزات وهــي:
• ســرعة حصــول ال clientعلــى البيانــات
الجديــدة ,حيــث تكــون ال latencyقليلــة
جــدا.
الصورة Data push :1
زينب سالم علوان 8
التعليم
دعم المتصفحات ( )browsersلتقنية ال SSE
اسم المتصفح chrome Firefox Opera Internet Explorer Safari
رقم النسخة 6.0 6.0 11.5 x 5.0
ملاحظة :رقم النسخة في الجدول اعلاه يمثل رقم اول نسخة من اصدار المتصفح التي تدعم بصورة كاملة الـ .SSE
قليلــة كان مــن الافضــل أســتخدام الــ مثال برمجي:
.S SE كمــا ذكرنــا ســابقا انــه عنــد أســتخدام تقنيــة ال SSEســوف يحصــل الــ clientبصــورة
اوتوماكيـة علـى البيانـات الجديـدة مـن قبـل الــ serverبـدون ارسـال ( )requestلـل server
• كــم مــرة يتطلــب ارســال بيانــات جديــدة
للمســتخدم؟ فكلمــا كان الرقــم كبيــر ولكـي يتحق ـق ذل ـك يج ـب تتبـع الخط ـوات التالي ـة:
كلمــا كان الافضــل أســتخدام ال .SSE • وبهــذا يتــم اســتقبال البيانــات الجديــدة :Server-side code .1
• هـل توفـر بيانـات جديـدة علـى ال ()server وعرضهــا علــى الصفحــة ,فــي العنصــر الــذي
بصــورة ﻟﯾﺳت ﺎﻧدرة إﻟﯽ ﺣد ﺎﻣ وﻟﮐﻧﮭﺎ ﺣﺗدث يمتلــك idمســاويا الــى « »resultفــي جهــة لكــي يرســل الــ serverالبيانــات الجديــدة
أﯾﺎ ًﺿ ﻲﻓ أوﺎﻗت ﺗﻣوﺔﻌﻗ؟ (مثــا هنالــك يجــب ان توجــد صفحــة ولتكــن صفحــة
رســالة او تنبيــه فــي وقــت معيــن ونريــد ال client PHP,ASPتك ـون مهمته ـا أرسـال البيان ـات
ان يتــم اســتلامه مــن جميــع المشــتركين كماموضح في الصورة التالية: الجديــدة حــال توفرهــا الــى ,clientففــي هــذا
فــي الموقــع الاكترونــي فــي ذلــك الوقــت), المثــال لنفــرض رابــط هــذه الصفحــة هــو
فالافضــل فــي هــذه الحالــة أســتخدام الــ ><script « .»demo_sse.php
AJAXلعمــل طلــب ( )requestقبــل البــدء _var source = new EventSource(«demo
بنشــر البيــان بثوانــي ,وبعــد اســتلامه يتــم ;)»sse.php ويجب تحديد مايلي في كود هذه الصفحة:
غلــق الاتصــال مــع الــ .serverاذا لايوجــد { )source.onmessage = function(event يجــب ان تكــون ال content-Type •
داعـي لجعـل الاتصـال مفتـوح طيلـة الوقـت
بأنتظــار الــ serverلانــه ســوف يــؤدي الــى document.getElementById(«result»). Text/event-stream هــي
هــدر فــي أســتخدام المصــادر (Machine ;»>innerHTML += event.data + «<br
;} يجــب تحديــد ال cache-control •
. )R e s o u r c e ></script
عزيــزي القــار ْى فــي نهايــة هــذا المقــال أود لتكــون « .»no-cache
ان ألفــت أنتباهــك الــى انــه هنالــك الكثيــر البيانــات المرســلة يجــب ان تبــدأ •
مــن الامــور تخــص التقنيتيــن (data push
و )data pullويجــب التفكيــر جيــدا قبــل بعبــارة «.»:data
اختيــار الطريقــة المناســبة لتطبيقــك . أسـتخدام )(flushلارسـال البيانـات •
وكمــا أشــرت فــي البدايــة عالــم الويــب
ملـيء بالتحديـات وهـذه التحديـات كثيـرا مـا الــى .client
يواجههــا المبرمــج أثنــاء برمجــة المواقــع
الالكترونيـة ,فلـذا أنصحـك بأعتمـاد الكتـاب أما نتيجة تنفيذ هذا المثال تكون بالشكل <?php
التالــي كمرجــع ق ًيــم ومفيــد لمواجهــة اي التالي: header(‹Content-Type: text/event-
تحـدي أثنـاء أسـتخدام SSEحيـث أعتمدتـه ;)›stream
أنــا خــال كتابتــي لهــذا المقــال ,وعنــوان ;)›header(‹Cache-Control: no-cache
هــذا الكتــاب هــو: The server time is: Mon, 09 Jul 2018 ;)›$time = date(‹r
«»SSE Data Push App with HTML5 0400- 18:29:57 \}echo «data: The server time is: {$time
The server time is: Mon, 09 Jul 2018 ;»n\n
0400- 18:30:00 ;)(flush
The server time is: Mon, 09 Jul 2018 >?
0400- 18:30:04
The server time is: Mon, 09 Jul 2018
0400- 18:30:07
وبصورة مستمرة Client- side code . 2
عزيــزي القــار ْى بعــد ان أســتعرضنا تعاريــف أمــا عنــد الصفحــة فــي جهــة ال client
ِكلتــا التقنيتيــن وعرفنــا ماهــي مميــزات
,SSEهنالــك أمــور يجــب ان ُتأخــذ بنظــر فيجــب تعريــف مايلــي :
الاعتبـار قبـل ان تقـرر فيمـا اذا كانـت الـ SSE • نقــوم بتعريــف متغيــر مــن نــوع Event
هــي الخيــار الانســب والاصــح لتطبيقــك, Source Objectsداخــل كــود ال java script
وطبعــا هــذا كلــه يعتمــد علــى طبيعــة ومهمـة هـذا المتغيـر هـو اسـتلام الاشـعار
التطبيــق فمثــا: مــن الــ server
• هــل مســألة وقــت اســتلام البيانــات مــن • نقــوم بتحديــد الرابــط الخــاص بالصفحــة
قبــل المســتخدم ضروريــة ام لا؟ اي يجــب ,وهــي صفحــة (« ,)»demo_sse.phpالتــي
التفكيــر فــي ( )latencyفكلمــا كانــت ســوف تقــوم بأرســال البيانــات الجديــدة.
• كلمـا يتـم اسـتلام تحديـث مـن ال server
سـوف يتـم تفعيـل ال onmessage event
زينب سالم علوان 9