خادم NodeJs لبث Laravel Echo باستخدام Jack.io.
ما يلي مطلوب لتعمل بشكل صحيح.
يمكن العثور على معلومات إضافية حول البث باستخدام Laravel في المستندات الرسمية: https://laravel.com/docs/master/broadcasting
قم بتثبيت حزمة npm عالميًا باستخدام الأمر التالي:
$ npm install -g laravel-echo-server
قم بتشغيل الأمر init في دليل المشروع الخاص بك:
$ laravel-echo-server init
ستساعدك أداة cli في إعداد ملف laravel-echo-server.json في الدليل الجذر لمشروعك. سيتم تحميل هذا الملف بواسطة الخادم أثناء بدء التشغيل. يمكنك تحرير هذا الملف لاحقًا لإدارة تكوين الخادم الخاص بك.
يعرض Laravel Echo Server واجهة برمجة تطبيقات http خفيفة لأداء وظائف البث. ولأغراض أمنية، يجب مصادقة الوصول إلى نقاط النهاية هذه من مُحيلي http باستخدام معرف التطبيق والمفتاح. يمكن إنشاء هذا باستخدام الأمر cli:
$ laravel-echo-server client:add APP_ID
إذا قمت بتشغيل client:add
بدون وسيطة معرف التطبيق، فسيتم إنشاء واحدة لك. بعد تشغيل هذا الأمر، سيتم عرض معرف العميل والمفتاح وتخزينهما في ملف laravel-echo-server.json .
في هذا المثال، سيتم السماح بالطلبات طالما يتم توفير معرف التطبيق والمفتاح مع طلبات http.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
يمكنك إزالة العملاء باستخدام laravel-echo-server client:remove APP_ID
في الدليل الجذر لمشروعك، قم بتشغيل
$ laravel-echo-server start
في الدليل الجذر لمشروعك، قم بتشغيل
$ laravel-echo-server stop
قم بتحرير التكوين الافتراضي للخادم عن طريق إضافة خيارات إلى ملف laravel-echo-server.json الخاص بك.
عنوان | تقصير | وصف |
---|---|---|
apiOriginAllow | {} | التكوين للسماح بالوصول إلى واجهة برمجة التطبيقات (API) عبر CORS. مثال |
authEndpoint | /broadcasting/auth | المسار الذي يصادق على القنوات الخاصة |
authHost | http://localhost | مضيف الخادم الذي يقوم بتصديق القنوات الخاصة وقنوات الحضور |
database | redis | قاعدة البيانات المستخدمة لتخزين البيانات التي يجب أن تستمر، مثل أعضاء قناة التواجد. الخيارات حاليًا هي redis و sqlite |
databaseConfig | {} | مثال على تكوينات برامج تشغيل قاعدة البيانات المختلفة |
devMode | false | يضيف تسجيلًا إضافيًا لأغراض التطوير |
host | null | مضيف خادم المقبس.io على سبيل المثال. app.dev . سيقبل null الاتصالات على أي عنوان IP |
port | 6001 | المنفذ الذي يجب أن يعمل عليه خادم المقبس.io |
protocol | http | يجب أن يكون إما http أو https |
sslCertPath | '' | المسار إلى شهادة SSL الخاصة بخادمك |
sslKeyPath | '' | المسار إلى مفتاح SSL الخاص بالخادم الخاص بك |
sslCertChainPath | '' | المسار إلى سلسلة شهادات SSL الخاصة بخادمك |
sslPassphrase | '' | عبارة المرور المستخدمة للشهادة (إن أمكن) |
socketio | {} | خيارات للتمرير إلى مثيل المقبس.io (الخيارات المتاحة) |
subscribers | {"http": true, "redis": true} | يسمح بتعطيل المشتركين بشكل فردي. المشتركون المتاحون: http و redis |
إذا تم العثور على ملف .env في نفس الدليل مثل ملف laravel-echo-server.json، فيمكن تجاوز الخيارات التالية:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
ملاحظة : سيعود هذا الخيار إلى خيار LARAVEL_ECHO_SERVER_HOST
كخيار افتراضي إذا تم تعيينه في ملف .env.host
: LARAVEL_ECHO_SERVER_HOST
port
: LARAVEL_ECHO_SERVER_PORT
devMode
: LARAVEL_ECHO_SERVER_DEBUG
databaseConfig.redis.host
: LARAVEL_ECHO_SERVER_REDIS_HOST
databaseConfig.redis.port
: LARAVEL_ECHO_SERVER_REDIS_PORT
databaseConfig.redis.password
: LARAVEL_ECHO_SERVER_REDIS_PASSWORD
protocol
: LARAVEL_ECHO_SERVER_PROTO
sslKeyPath
: LARAVEL_ECHO_SERVER_SSL_KEY
sslCertPath
: LARAVEL_ECHO_SERVER_SSL_CERT
sslPassphrase
: LARAVEL_ECHO_SERVER_SSL_PASS
sslCertChainPath
: LARAVEL_ECHO_SERVER_SSL_CHAIN
ملاحظة: تدعم هذه المكتبة حاليًا العرض من http أو https فقط، وليس كليهما.
إذا كنت تواجه صعوبة في تنفيذ SSL مع هذه الحزمة، فيمكنك التفكير في استخدام وحدة الوكيل داخل Apache أو NginX. بشكل أساسي، بدلاً من توصيل حركة مرور websocket الخاصة بك بـ https://yourserver.dev:6001/socket.io؟..... ومحاولة تأمينها، يمكنك توصيل حركة مرور websocket الخاصة بك بـ https://yourserver.dev/socket .io. خلف الكواليس، سيتم تكوين وحدة الوكيل الخاصة بـ Apache أو NginX لاعتراض طلبات /socket.io، وإعادة توجيهها داخليًا إلى خادم الصدى الخاص بك عبر منفذ غير SSL على المنفذ 6001. وهذا يحافظ على تشفير كل حركة المرور بين المتصفح والويب الخادم، حيث أن خادم الويب الخاص بك سيستمر في إجراء تشفير/فك تشفير SSL. الشيء الوحيد الذي بقي غير آمن هو حركة المرور بين خادم الويب الخاص بك وخادم Echo، والذي قد يكون مقبولاً في كثير من الحالات.
#the following would go within the server{} block of your web server config
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
يمكن تمرير دليل العمل الذي سيبحث فيه laravel-echo-server
عن ملف التكوين laravel-echo-server.json
إلى أمر start
من خلال المعلمة --dir
كما يلي: laravel-echo-server start --dir=/var/www/html/example.com/configuration
يشترك Laravel Echo Server في الأحداث الواردة بطريقتين: Redis وHttp.
يمكن لتطبيقك الأساسي استخدام Redis لنشر الأحداث على القنوات. سوف يشترك Laravel Echo Server في تلك القنوات ويبث تلك الرسائل عبر المقبس.io.
باستخدام Http، يمكنك أيضًا نشر الأحداث على Laravel Echo Server بنفس الطريقة التي تفعلها مع Redis عن طريق إرسال channel
message
إلى نقطة نهاية البث. تحتاج إلى إنشاء مفتاح API كما هو موضح في قسم عملاء API وتوفير مفتاح API الصحيح.
طلب نقطة النهاية
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
هيئة الطلب
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
القناة - اسم القناة التي سيتم بث الحدث إليها. بالنسبة للقنوات الخاصة أو الخاصة بالحضور، قم بإضافة private-
أو presence-
. القنوات - بدلاً من قناة واحدة، يمكنك البث إلى مجموعة من القنوات بطلب واحد. الاسم - سلسلة تمثل مفتاح الحدث داخل تطبيقك. البيانات - البيانات التي ترغب في بثها إلى القناة. مقبس_معرف (اختياري) - معرف مأخذ التوصيل الخاص بالمستخدم الذي بدأ الحدث. عند وجوده، سيقوم الخادم فقط "بالبث للآخرين".
مشترك HTTP متوافق مع مشترك Laravel Pusher. ما عليك سوى تكوين المضيف والمنفذ لخادم Switch.IO الخاص بك وتعيين معرف التطبيق والمفتاح في config/broadcasting.php. السر غير مطلوب.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
يمكنك الآن إرسال الأحداث باستخدام HTTP، دون استخدام Redis. يتيح لك هذا أيضًا استخدام Pusher API لسرد القنوات/المستخدمين كما هو موضح في مكتبة Pusher PHP
تعرض HTTP API نقاط النهاية التي تسمح لك بجمع معلومات حول الخادم والقنوات قيد التشغيل.
الحالة احصل على العدد الإجمالي للعملاء ووقت تشغيل الخادم واستخدام الذاكرة.
GET /apps/:APP_ID/status
قائمة القنوات بجميع القنوات.
GET /apps/:APP_ID/channels
القناة احصل على معلومات حول قناة معينة.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
مستخدمو القناة قائمة المستخدمين على القناة.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
يمكن تحديد الوصول عبر النطاقات في ملف laravel-echo-server.json عن طريق تغيير allowCors
في apiOriginAllow
إلى true
. يمكنك بعد ذلك تعيين CORS Access-Control-Allow-Origin وAccess-Control-Allow-Methods كسلسلة مفصولة بفاصلة (يتم تمكين GET وPOST افتراضيًا) وAccess-Control-Allow-Headers التي يمكن لواجهة برمجة التطبيقات تلقيها.
المثال أدناه:
{
"apiOriginAllow" :{
"allowCors" : true ,
"allowOrigin" : " http://127.0.0.1 " ,
"allowMethods" : " GET, POST " ,
"allowHeaders" : " Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id "
}
}
يتيح لك هذا إرسال طلبات إلى واجهة برمجة التطبيقات عبر AJAX من تطبيق قد يكون قيد التشغيل على نفس المجال ولكن بمنفذ مختلف أو مجال مختلف تمامًا.
للاحتفاظ ببيانات قناة التواجد، يوجد دعم لاستخدام Redis أو SQLite كمخزن للمفاتيح/القيمة. المفتاح هو اسم القناة، والقيمة هي قائمة أعضاء قناة التواجد.
يمكن تكوين كل برنامج تشغيل قاعدة بيانات في ملف laravel-echo-server.json ضمن خاصية databaseConfig
. يتم تمرير الخيارات إلى موفر قاعدة البيانات، بحيث يكون للمطورين الحرية في إعدادها كما يحلو لهم.
على سبيل المثال، إذا أردت تمرير تكوين مخصص إلى Redis:
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
ملاحظة: لا ينبغي استخدام أي مخطط (http/https وما إلى ذلك) لعنوان المضيف
يمكن العثور على قائمة كاملة بخيارات Redis هنا.
على سبيل المثال، إذا أردت استخدام redis-sentinel، فستحتاج إلى تمرير تكوين مخصص:
"databaseConfig" : {
"redis" : {
"sentinels" : [
{
"host" : " redis-sentinel-0 " ,
"port" : 26379
},
{
"host" : " redis-sentinel-1 " ,
"port" : 26379
}
{
"host" : " redis-sentinel-2 " ,
"port" : 26379
}
],
"name" : " mymaster " ,
"sentinelPassword" : " redis-password "
},
},
لمزيد من المعلومات حول تكوين redis Sentinel، يمكنك التحقق من ذلك
مع SQLite قد تكون مهتمًا بتغيير المسار الذي يتم تخزين قاعدة البيانات فيه.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
ملاحظة 1: المسار متعلق بجذر تطبيقك، وليس بنظامك.
ملاحظة 2: العقدة sqlite3 مطلوبة لقاعدة البيانات هذه. يرجى التثبيت قبل الاستخدام.
npm install sqlite3 -g
عندما ينضم المستخدمون إلى قناة حضور، يتم تخزين بيانات مصادقة قناة الحضور الخاصة بهم باستخدام Redis.
بينما تحتوي قنوات الحضور على قائمة بالمستخدمين، ستكون هناك حالات ينضم فيها المستخدم إلى قناة الحضور عدة مرات. على سبيل المثال، قد يحدث هذا عند فتح علامات تبويب متعددة في المتصفح. في هذه الحالة، يتم إرسال أحداث "الانضمام" و"المغادرة" فقط إلى المثيل الأول والأخير للمستخدم.
اختياريًا، يمكنك تكوين laravel-echo-server لنشر حدث في كل تحديث لقناة الحضور، عن طريق تعيين databaseConfig.publishPresence
على true
:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
يمكنك استخدام تكامل Laravel's Redis لتشغيل كود التطبيق من هناك:
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
راجع وثائق Laravel الرسمية لمزيد من المعلومات. https://laravel.com/docs/master/broadcasting#introduction
يمكنك تضمين مكتبة عميل المقبس.io من خادمك قيد التشغيل. على سبيل المثال، إذا كان الخادم الخاص بك يعمل على app.dev:6001
فيجب أن تكون قادرًا على إضافة علامة برنامج نصي إلى ملف html الخاص بك كما يلي:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
ملاحظة: عند استخدام مكتبة عميل المقبس.io من خادمك قيد التشغيل، تذكر التحقق من تعريف المتغير العام io
قبل الاشتراك في الأحداث.
لقد تم إهمال μWebSockets رسميًا. لا يوجد حاليًا أي دعم لـ μWebSockets في Switch.IO، ولكن قد يكون هناك دعم ClusterWS الجديد. وفي الوقت نفسه، سيستخدم Laravel Echo Server محرك ws
افتراضيًا حتى يتوفر خيار آخر.