aka tGDA
مع الـsocket programming: الـHTTP/1.1 والـKeep-Alive!
0 تعليقات
كنت البارحة أقوم ببعض الـsocket programming في الـPHP وقد لزمني فتح إتصال إلى مخدم apache للقيام ببعض المهام، لبروتوكول الـHTTP نسختان، النسخة 1.0 والتي لا تدعم نوع الإتصال Keep-Alive، والنسخة 1.1 التي تدعمه دون مشاكل.
يعني Keep-Alive أن الـsocket (إتصال الـTCP/IP مع المخدم) يمكن توظيفها لأكثر من طلب، فليس هناك داع لفتح socket جديدة عند كل طلب. هذا يعني أنك مثلاً عندما تتصفح موقع ما، فإن كل الطلبات من هذا المخدم سترسل على نفس قناة الإتصال، الصفحة وملفات الـcss والـjs والصور، وليس هناك داع لإنشاء إتصال tcp/ip جديد لكل منها على حدى.
هذه الميزة جعلتني أعيد كتابة الـscript الذي كنت أعمل عليه ليستعمل الـHTTP/1.1، وذلك حفظاً لموارد النظام وإختصاراً للوقت.
المهم أن البرنامج كان يعمل، الطلب الأول، الثاني، الثالث... المئة، المئة وواحد، وينقطع الإتصال. كنت قد حللت عدداً من المشاكل قبيل ذلك، فمن كيفية معرفة طول الرد إما عن طريق الـContent-Length أو عن طريق الـTransfer-Encoding: chunked (سوف أحاول كتابة موضوع يلخص هذه الأمور، وكيفية القيام بإتصال HTTP/1.1 ومعالجة الردود مع الـKeep-Alive). المهم أني إعتقدت أن هناك مشكلة ما في الطلب رقم 101 أو الرد عليه من المخدم. لذا قمت بتخطي أول 99 طلب، وإعادة العملية مع بعض الـdebugging، متوقعاً حصول المشكلة في الطلب الثاني (الطلب رقم 101 سابقاً) ولكن الذي حصل أن الطلبات انسابت دون أي مشكلة. إنتظرت طبعاً كوني لم أفكر بشيء آخر أقوم به، وإذ أن المشكلة تعاود الظهور مع الطلب رقم 101!
ما سر الرقم 101؟ هل هي جمعية سرية تحاول الإنتقام من مستخدمي السوكيت في البرمجة؟! (صوت من البعيد يقول لي خلي هدول القصص لدان براون :) انت خليك هون وفكر شو السبب اللي عن جد عم يعمل هالمشكلة..)
آه تذكرت، بإتصالات الـKeep-Alive هناك حد معين لعدد الطلبات التي يمكن القيام بها على نفس الـsocket، وبشكل إفتراضي الرقم هو 100، يعني طبيعي يصير هيك شي عالـ101، لأنو بكون السيرفر سكر السوكيت! معناها لازم نشيك إذا سكرت ونرجع نفتحها! مشان هيك رجعت ضبضبت كل توابع القراءة والكتابة بكلاس، وعدنا السكريبت لتستعمل هالـclass. وخلينا تابع الكتابة يشيك قبيل ما يكتب عالسوكيت فيما إذا كانت مسكرة ويفتحها. وهيك توتة توتة خلصت الحتوتة.. مشي الحال وكلو تمام.
لا طولو بالكن شوي، في حين أنو كل شي منطقي ولازم كلو يشتغل عالتمام.. بلش يصير في أغلاط بالسوكيت أحياناً عند الطلب 101 أو عند الـ202، يعني بالأماكن اللي يفترض تتسكر فيها السوكيت، ايه بس أنا عم إتأكد كنو عم تتسكر، وهالشي عن طريق تابع feof بالـPHP اللي لازم يرجع true في حال تسكرت الـsocket.. رجعت تأكدت.. كأنو الـfeof عم يرجع false مع أنو الـsocket سكرت.. وعند عملية القراءة التالية عم يصير في timeout.. طيب هي شو حلتها؟! ليش الـPHP ما عم تكتشف أنو السوكيت سكرت للعملية التالية؟
ملاحظة على تابع feof مع الـsockets في الـPHP:
جربت شغلة أنو حطيت sleep ثانية قبل ما إستدعي الـfeof لإتأكد أنو الـsocket سكرت ولا لأ، والنتائج أتت مطابقة للتوقعات: الـPHP على ما يبدو ما بتكتشف أنو الـsocket سكرت دغري بدها شوي لتستوعب هالشي، طبعاً مو ثانية كاملة، رجعت حطيت usleep شي 30000 ميكرو ثانية ومشي الحال كمان.
كنت عم إستعمل PHP/5.1.2 مع Apache/2.2 وويندوز XP (ياللعار!)
حلت المشكلة، و.ه.م : )
No Comments YET :|
إضافة تعليق:
هدف هذه المدونة تأمين أرشيف من المقالات والمواضيع والدروس لمواضيع الكومبيوتر المتقدمة غالباً وأحياناً البسيطة ولكن التي يصعب فهمها، المدونة حالياً في الفترة التجريبية، الرجاء الزيارة قريباً حيث تكون هناك بعض المقالات التي تهمك.
This work by Aularon is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.




Loading..