0Pricing
Lua Academy · درس

‏Cosockets وTCP غير الحاجب

استخدم ngx.socket.tcp للاتصالات الخلفية غير المتزامنة في content_by_lua

‏Cosockets وTCP غير الحاجب درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما المقابس التعاونية؟

مقابس OpenResty التعاونية هي مقابس TCP/UDP غير حاجبة تتكامل مع حلقة أحداث Nginx. وعند انتظار البيانات، تتنازل coroutine عن التنفيذ، ما يحرر العامل لمعالجة طلبات أخرى.

إنشاء مقبس TCP تعاوني

استخدم ngx.socket.tcp() لإنشاء مقبس تعاوني. وتتخلى عمليات الاتصال والإرسال والاستقبال جميعها عن التنفيذ تلقائيًا عندما تؤدي عمليات الإدخال والإخراج إلى الحجب.

-- content_by_lua_block
local sock = ngx.socket.tcp()
local ok, err = sock:connect("redis.local", 6379)
if not ok then
  ngx.log(ngx.ERR, "Connect failed: ", err)
  return ngx.exit(500)
end

إرسال البيانات

ترسل sock:send(data) سلسلة نصية. وتعيد عدد البايتات المُرسلة أو nil مع رسالة خطأ.

local bytes, err = sock:send("PING\r\n")
if not bytes then
  ngx.log(ngx.ERR, "Send error: ", err)
end

استقبال البيانات

تقرأ sock:receive(pattern) البيانات. وتشمل الأنماط: "*l" لقراءة سطر، و"*a" لقراءة كل البيانات حتى الإغلاق، ورقمًا لقراءة N من البايتات بالضبط.

local data, err = sock:receive("*l")
if not data then
  ngx.log(ngx.ERR, "Receive error: ", err)
  return ngx.exit(500)
end
ngx.say("Response: " .. data)

ضبط مهلات الانتظار

اضبط مهلات الاتصال والإرسال والاستقبال لمنع التعليق.

sock:settimeout(1000)  -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000)  -- connect, send, receive (ms)

تجمّع الاتصالات

تعيد sock:setkeepalive(timeout, pool_size) المقبس إلى تجمّع لإعادة استخدامه. وهذا مهم جدًا لأداء Redis وMySQL.

sock:setkeepalive(60000, 100)  -- 60s timeout, pool size 100

إجراء طلب HTTP

نفّذ طلب GET بسيطًا باستخدام HTTP/1.0 ومقبس تعاوني.

local function httpGet(host, path)
  local sock = ngx.socket.tcp()
  sock:connect(host, 80)
  sock:send("GET " .. path .. " HTTP/1.0\r\nHost: " .. host .. "\r\n\r\n")
  local resp = sock:receive("*a")
  sock:close()
  return resp
end

مقبس UDP تعاوني

ينشئ ngx.socket.udp() مقبس UDP تعاونيًا. وهو مفيد لإرسال مقاييس statsd.

local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")

نمط معالجة الأخطاء

تتبع جميع دوال المقابس التعاونية اصطلاح Lua: تعيد nil مع سلسلة خطأ عند الفشل. احرص دائمًا على التحقق من قيمتي الإرجاع كلتيهما.

قيود المقابس التعاونية

لا يمكن استخدام المقابس التعاونية في: init_by_lua وset_by_lua وheader_filter_by_lua. استخدمها فقط في مراحل content وaccess وrewrite.

مقارنة الأداء

تحقق المقابس التعاونية معدل النقل نفسه الذي تحققه شيفرة C الخام المعتمدة على epoll، لأنها تستخدم مباشرةً آلية الإدخال والإخراج في Nginx. ولا تضيف أي تكلفة زائدة ناتجة عن خيط أو عملية إضافية.

سؤال حول المقابس التعاونية

ماذا يحدث عندما ينتظر مقبس تعاوني بيانات من خادم بطيء؟

مراجعة: المقابس التعاونية وTCP غير الحاجب

توفر مقابس OpenResty التعاونية اتصال TCP/UDP غير حاجب يتنازل عن التنفيذ أثناء عمليات الإدخال والإخراج، ما يتيح درجة عالية من التزامن. استخدم setkeepalive لتجميع الاتصالات. واضبط مهلات الانتظار لتجنب التعليق. ولا تتوفر هذه المقابس إلا في مراحل content وaccess وrewrite.

الأسئلة الشائعة

هل درس «‏Cosockets وTCP غير الحاجب» مجاني؟

نعم — نص درس «‏Cosockets وTCP غير الحاجب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏Cosockets وTCP غير الحاجب»؟

استخدم ngx.socket.tcp للاتصالات الخلفية غير المتزامنة في content_by_lua تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏Cosockets وTCP غير الحاجب»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية OpenResty
  2. معالجة طلبات HTTP في Lua
  3. ‏Cosockets وTCP غير الحاجب
  4. قواميس الذاكرة المشتركة
← العودة إلى Lua Academy