أجهزة الكمبيوتر شبابيك إنترنت

إنشاء صفحات html باستخدام PHP. ما هو الفرق بين ملف php وملف html؟ ما الذي تريد معرفته

كاميرون ليرد

PHP لا يدعم معالجة التدفقات. بغض النظر ، وخلافًا لرأي معظم مطوري PHP الذين تحدثت إليهم ، يمكن لتطبيقات PHP القيام بمهام متعددة. لنبدأ باكتشاف معنى "تعدد المهام" و "خيوط المعالجة" لبرمجة PHP.

تنوع التوازي

أولاً ، نضع جانباً القضايا التي تقع خارج الاتجاه السائد للموضوع الرئيسي. PHP لها علاقة معقدة مع تعدد المهام أو التزامن. في المستوى الأعلى ، تشارك PHP باستمرار في تعدد المهام - يتم استخدام تثبيتات PHP القياسية على الخادم (مثل وحدة Apache) بطريقة متعددة المهام. أي أن تطبيقات العميل المتعددة (متصفحات الويب) يمكنها طلب نفس صفحة PHP في نفس الوقت ، وسيعيدها خادم الويب إلى الجميع أكثر أو أقل في نفس الوقت.

لا تمنع إحدى صفحات الويب الإرسال من صفحة أخرى ، على الرغم من أنها يمكن أن تتداخل قليلاً مع بعضها البعض عند التعامل مع موارد محدودة مثل ذاكرة الخادم أو النطاق الترددي للشبكة. وبالتالي ، قد تسمح متطلبات النظام للتزامن بالحلول المستندة إلى PHP. فيما يتعلق بالتطبيق ، فإن PHP تحمل خادم الويب مسؤولية التزامن.

استحوذ التوازي من جانب العميل المسمى Ajax أيضًا على انتباه المطورين في السنوات القليلة الماضية. بينما أصبح معنى Ajax غامضًا إلى حد ما ، فإن أحد جوانب هذه التقنية هو أن المتصفح يمكنه إجراء عمليات حسابية في نفس الوقت ويظل حساسًا لإجراءات المستخدم مثل تحديد القائمة. إنها حقًا نوع من المهام المتعددة. يقوم Ajax بتشفير PHP ، ولكن بدون أي تدخل خاص في PHP ؛ تعمل إطارات Ajax للغات الأخرى بنفس الطريقة.

المثال الثالث للتزامن الذي يخدش سطح PHP فقط هو PHP / TK. PHP / TK هو امتداد PHP يوفر روابط واجهة مستخدم رسومية محمولة (GUI) إلى نواة PHP. يتيح لك PHP / TK إنشاء تطبيقات واجهة المستخدم الرسومية لسطح المكتب مكتوبة بلغة PHP. تحاكي جوانبها التي تحركها الأحداث شكلاً من أشكال التزامن الذي يسهل تعلمه وأقل عرضة للخطأ من العمل مع الخيوط. مرة أخرى ، "يتم توريث" التزامن من تقنية تكميلية بدلاً من وظائف PHP الأساسية.

كانت هناك عدة تجارب لإضافة دعم مؤشر الترابط إلى PHP نفسها. على حد علمي ، لم ينجح أي منها. ومع ذلك ، تُظهر أطر Ajax و PHP / TK المستندة إلى الأحداث أن الأحداث يمكن أن تعبر بشكل أفضل عن التزامن لـ PHP أكثر من الخيوط. PHP V5 يثبت ذلك.

يقدم PHP V5 Stream_select ()

في PHP القياسي V4 والإصدارات الأقدم ، يجب أن يتم تنفيذ جميع أعمال تطبيق PHP بالتتابع. إذا احتاج البرنامج إلى استرداد سعر عنصر ما من موقعين تجاريين ، على سبيل المثال ، فإنه يطلب السعر الأول ، وينتظر الرد ، ويطلب السعر الثاني ، وينتظر مرة أخرى.

ماذا لو تمكن البرنامج من أداء مهام متعددة في نفس الوقت؟ سيتم الانتهاء منه في جزء بسيط فقط من الوقت المطلوب للعمل المتسق.

المثال الأول

توفر وظيفة stream_select الجديدة ، جنبًا إلى جنب مع العديد من أصدقائها ، هذه الإمكانية. خذ بعين الاعتبار المثال التالي:

0) ($ s = stream_socket_client ("phaseit.net:80"، $ errno، $ errstr، $ timeout، STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT)؛ if ($ s) ($ sockets [$ id ++] = $ s؛ $ http_message = "GET / ظاهر / تأخير؟ Delay =". $ Delay. "HTTP / 1.0 \ r \ n المضيف: phaseit.net \ r \ n \ r \ n"؛ fwrite ($ s، $ http_message)؛) else (echo "Stream". $ id. "فشل في الفتح بشكل صحيح." ؛) تأخير $ - = 3 ؛) بينما (count ($ sockets)) ($ read = $ sockets ؛ stream_select ($ read ، $ w = null ، $ e = null، $ timeout)؛ إذا كان (count ($ read)) (/ * stream_select عادةً ما يخلط $ read ، لذلك علينا معرفة أي مأخذ يقرأ منه. * / foreach ($ read as $ r) ($ id = array_search ($ r، $ sockets) ؛ $ data = fread ($ r، $ appropriate_read_block) ؛ / * يمكن قراءة المقبس إما لأنه يحتوي على بيانات للقراءة أو لأنه في حالة EOF. * / إذا (strlen ($ data) = = 0) (echo "Stream". $ Id. "مغلق عند". Date ("h: i: s"). ". \ N"؛ fclose ($ r)؛ unset ($ sockets [ $ id]) ؛) else ($ result [$ id]. = $ data؛))) else (/ * Ty يعني maut أن جميع الخيوط لم تنتظر ردًا. * / صدى "Time-out! \ n" ؛ استراحة؛ ))؟>

إذا قمت بتشغيل هذا البرنامج ، فسترى معلومات مشابهة لما يلي:

يبدأ البرنامج الساعة 02:38:50. يغلق الدفق 4 في 02:38:53. يغلق البث 3 في 02:38:56. يغلق البث 2 في 02:38:59. يغلق الدفق 1 الساعة 02:39:02. يغلق البث 0 في 02:39:05.

من المهم أن نفهم ما يحدث هنا. على مستوى عالٍ ، يقوم البرنامج الأول بإجراء عدة طلبات HTTP ويستقبل الصفحات التي يرسلها خادم الويب إليها. بينما قد يطلب التطبيق الحقيقي عدة خوادم ويب مختلفة (ربما google.com و yahoo.com و ask.com وما إلى ذلك) ، فإن هذا المثال يمرر جميع الطلبات إلى خادم الشركة في Phaseit.net فقط لتقليل التعقيد. ...

تعرض صفحات الويب المطلوبة النتائج بعد التأخير المتغير الموضح أدناه. إذا كان البرنامج سينفذ الطلبات بالتتابع ، فسيستغرق حوالي 15 + 12 + 9 + 6 + 3 (45) ثانية حتى يكتمل. كما هو موضح في القائمة 2 ، يستغرق الأمر 15 ثانية حتى يكتمل. الإنتاجية الثلاثية هي نتيجة رائعة.

أصبح هذا ممكنًا من خلال stream_select ، وهي ميزة جديدة في PHP V5. يتم بدء الطلبات بالطريقة المعتادة - عن طريق فتح العديد من stream_socket_clients وكتابة GET لكل منهم ، والذي يتوافق مع http://phaseit.net/demonstration/delay؟delay=$DELAY. عندما تطلب عنوان URL هذا في متصفحك ، يجب أن ترى:


على الرغم من أن التنفيذ المحدد في القائمة 3 خاص بـ UNIX® ، إلا أن معظم البرامج النصية في هذه المقالة تنطبق بشكل جيد على تثبيتات PHP على Windows® (خاصة ما بعد Windows 98) أو UNIX. على وجه الخصوص ، يمكنك العمل مع القائمة 1 على أي نظام تشغيل. Linux® و Mac OS X هما من نكهات UNIX ، وستعمل جميع التعليمات البرمجية هنا على كلا النظامين.

يتم إجراء طلبات خادم وقت الاستجابة بالترتيب التالي:

تأخير = 15 تأخير = 12 تأخير = 9 تأخير = 6 تأخير = 3

الهدف من stream_select هو الحصول على النتائج في أسرع وقت ممكن. في هذه الحالة ، يكون ترتيب التأخيرات هو عكس الترتيب الذي تم تقديم الطلبات به. بعد 3 ثوانٍ ، تصبح الصفحة الأولى جاهزة للقراءة. هذا الجزء من البرنامج عبارة عن كود PHP عادي - في هذه الحالة ، مع fread. تمامًا كما هو الحال في برنامج PHP آخر ، يمكن إجراء القراءة باستخدام fgets.

تستمر المعالجة بنفس الطريقة. كتل البرنامج في stream_select حتى تصبح البيانات جاهزة. المهم هو أنه يبدأ القراءة بمجرد أن يحتوي أي اتصال على بيانات ، بأي ترتيب. هذه هي الطريقة التي ينفذ بها البرنامج تعدد المهام أو المعالجة المتوازية لنتائج استعلامات متعددة.

لاحظ أنه لا يوجد حمل إضافي لوحدة المعالجة المركزية على الكمبيوتر المضيف. ليس من غير المألوف أن تقوم برامج الشبكة بتنفيذ fread بهذه الطريقة قريبًا لاستخدام 100٪ من وحدة المعالجة المركزية. ليس هذا هو الحال هنا ، نظرًا لأن stream_select له الخصائص المطلوبة ويستجيب فورًا بمجرد أن تصبح أي قراءة ممكنة ، ولكنه يقوم بتحميل وحدة المعالجة المركزية في وضع الاستعداد إلى الحد الأدنى بين عمليات القراءة.

ما تحتاج لمعرفته حول stream_select ()

هذه البرمجة القائمة على الحدث ليست تافهة. على الرغم من تقليص القائمة 1 إلى الأساسيات ، فإن أي تشفير يعتمد على عمليات الاسترجاعات أو التنسيق (وهو أمر ضروري في التطبيقات متعددة المهام) سيكون أقل دراية من التسلسل الإجرائي البسيط. في هذه الحالة ، تكمن الصعوبة الأكبر في مصفوفة $ read. يرجى ملاحظة أن هذا رابط ؛ يعرض Stream_select معلومات مهمة عن طريق تعديل محتويات $ read. مثلما تشتهر المؤشرات بكونها مصدرًا ثابتًا للأخطاء في لغة C ، يبدو أن المراجع هي أصعب جزء في PHP للمبرمجين.

يمكن استخدام تقنية الاستعلام هذه من أي عدد من مواقع الويب الخارجية ، مما يضمن أن البرنامج يتلقى كل نتيجة في أسرع وقت ممكن دون انتظار الطلبات الأخرى. في الواقع ، تعمل هذه التقنية بشكل صحيح مع أي اتصال TCP / IP ، وليس فقط الويب (المنفذ 80) ، أي ، من حيث المبدأ ، يمكنك التحكم في استخراج بيانات LDAP ، ونقل SMTP ، وطلبات SOAP ، إلخ.

لكن هذا ليس كل شيء. يتعامل PHP V5 مع التوصيلات المختلفة كـ "تدفقات" بدلاً من مآخذ توصيل بسيطة. تدعم مكتبة عناوين URL لعميل PHP (CURL) شهادات HTTPS وتحميلات FTP الصادرة وملفات تعريف الارتباط والمزيد (يسمح CURL لتطبيقات PHP باستخدام بروتوكولات مختلفة للاتصال بالخوادم). نظرًا لأن CURL يوفر واجهة دفق ، يكون الاتصال شفافًا من وجهة نظر البرنامج. يشرح القسم التالي كيف تعدد الإرسال stream_select حتى الحساب المحلي.

هناك بعض المحاذير بخصوص stream_select. لم يتم توثيق هذه الوظيفة ، لذلك لم يتم تناولها حتى في كتب PHP الجديدة. العديد من أمثلة التعليمات البرمجية المتوفرة على الويب لا تعمل أو غير مفهومة. يجب أن تكون الوسيطتان الثانية والثالثة لـ stream_select ، والتي تتحكم في قنوات الكتابة والاستثناء المتوافقة مع قنوات القراءة في القائمة 1 ، خالية دائمًا. مع استثناءات قليلة ، يعد اختيار هذه القنوات خطأ. إذا لم تكن من ذوي الخبرة الكافية ، فاستخدم فقط الخيارات الموصوفة جيدًا.

أيضًا ، يبدو أن stream_select به أخطاء ، على الأقل في PHP V5.1.2. الأهم من ذلك ، لا يمكن الوثوق بقيمة إرجاع الدالة. على الرغم من أنني لم أصحح التنفيذ حتى الآن ، فقد أظهرت تجربتي أنه من الآمن اختبار العدد (قراءة بالدولار) كما في القائمة 1 ، لكن هذا لا ينطبق على القيمة المرجعة لـ stream_select نفسه ، على الرغم من الوثائق الرسمية.

PHP التزامن المحلي

ركز المثال ومعظم المناقشة أعلاه على كيفية إدارة عدة موارد بعيدة في نفس الوقت والحصول على النتائج كما تظهر ، بدلاً من انتظار معالجة كل منها بترتيب الطلب الأصلي. هذا بلا شك تطبيق مهم لتزامن PHP. في بعض الأحيان يمكن تسريع التطبيقات الحقيقية عشرة أضعاف أو أكثر.

ماذا لو حدث التباطؤ أقرب؟ هل هناك طريقة لتسريع الحصول على النتائج في PHP عند المعالجة محليًا؟ هناك عدد قليل. ربما تكون أقل شهرة من النهج الموجه نحو المقبس في القائمة 1. وهناك عدة أسباب لذلك ، بما في ذلك:

  • بالنسبة للجزء الأكبر ، صفحات PHP سريعة بما يكفي. قد يكون الأداء الأفضل ميزة ، ولكن ليس كافيًا لتبرير الاستثمار في كود جديد.
  • يمكن أن يؤدي استخدام PHP في صفحات الويب إلى جعل تسريع التعليمات البرمجية الجزئية غير ذي صلة. إعادة توزيع الحساب للحصول على نتائج وسيطة بشكل أسرع غير ذي صلة عندما يكون المعيار الوحيد هو سرعة تسليم صفحة الويب ككل.
  • يتم التحكم في عدد قليل من الاختناقات المحلية بواسطة PHP. قد يشتكي المستخدمون من أن الأمر يستغرق 8 ثوانٍ لاسترداد معلومات الحساب ، ولكن هذا قد يحد من معالجة قاعدة البيانات أو بعض الموارد الأخرى الخارجية لـ PHP. حتى إذا قمت بتقليل وقت معالجة PHP إلى الصفر ، فسيستغرق الأمر أكثر من 7 ثوانٍ للبحث فقط.
  • حتى عدد أقل من القيود تصلح للمعالجة المتوازية. لنفترض أن صفحة معينة تحسب السعر الموصى به لسهم عادي مدرج ، وأن الحسابات معقدة بما يكفي وتستغرق عدة ثوان لإكمالها. يمكن أن يكون الحساب متسلسلًا في الطبيعة. لا توجد طريقة واضحة لتوزيعها من أجل "التعاون".
  • قليل من مبرمجي PHP يفهمون إمكانات PHP للمعالجة المتوازية. بالحديث عن إمكانية الموازاة ، اقتبس معظم المبرمجين الذين قابلتهم عبارة "PHP لا تعمل مع الخيوط" وعادوا إلى نموذجهم الحسابي المعمول به.

في بعض الأحيان يمكنك أن تفعل ما هو أفضل. لنفترض أن صفحة PHP تحتاج إلى حساب سعري سهم ، وربما مقارنتهما ، وأن الكمبيوتر المضيف المستخدم متعدد المعالجات. في هذه الحالة ، يمكننا مضاعفة الأداء تقريبًا عن طريق تعيين عمليتين حسابيتين منفصلتين طويلتين إلى معالجات مختلفة.

في عالم حوسبة PHP ، مثل هذه الأمثلة نادرة. ومع ذلك ، نظرًا لأنني لم أجد وصفًا دقيقًا في أي مكان آخر ، فأنا أريد أن أعطي مثالًا على هذا التسارع هنا.

المصفوفة ("pipe"، "r")، 1 => المصفوفة ("pipe"، "w")، 2 => المصفوفة ("file"، $ error_log، "w"))؛ cmd دولار = "النوم". تأخير دولار. "؛ صدى" انتهى مع تأخير ". $ delay." "."؛ $ handles [$ id] = proc_open ($ cmd، $ descriptorspec، $ الأنابيب)؛ تدفقات $ [$ id] = أنابيب $؛ all_pipes $ [$ id] = أنابيب $؛ تأخير دولار - = 2 ؛ ) while (count ($ streams)) ($ read = $ streams؛ stream_select ($ read، $ w = null، $ e = null، $ timeout)؛ foreach ($ read as $ r) ($ id = array_search ($ r، $ streams)؛ echo stream_get_contents ($ all_pipes [$ id])؛ if (feof ($ r)) (fclose ($ all_pipes [$ id])؛ fclose ($ all_pipes [$ id])؛ $ return_value = proc_close ($ handles [$ id])؛ unset ($ streams [$ id])؛)))؟>

سيعرض هذا البرنامج المعلومات التالية:

يبدأ البرنامج الساعة 10:28:41. انتهى بتأخير 1. انتهى بتأخير 3.

الفكرة هي أن PHP بدأت عمليتين فرعيتين مستقلتين ، وتلقت البيانات من الأولى ، ثم من الثانية ، على الرغم من أن الأخيرة بدأت في وقت سابق. إذا كان الكمبيوتر المضيف متعدد المعالجات وتم تكوين نظام التشغيل بشكل صحيح ، فإنه يعتني بتعيين برامج فرعية مختلفة إلى معالجات مختلفة. هذه طريقة واحدة للاستفادة من آلات PHP متعددة المعالجات.

ملخص

يدعم PHP تعدد المهام. لا تدعم PHP معالجة الدفق بالطريقة التي تعمل بها لغات البرمجة الأخرى مثل Java أو C ++ ، ولكن الأمثلة أعلاه أظهرت أن PHP لديها إمكانية تسريع أعلى مما يدركه معظم الناس.


لذا ، أيها الأصدقاء ، إذا وصلت إلى هذا الدرس ، فقد تمكنت من تثبيت خادم محلي ، أو شراء استضافة يمكنك العمل عليها باستخدام PHP. مبروك - هذه خطوة كبيرة!

سأقول بإيجاز عن PHP - تُستخدم لغة البرمجة هذه في جميع أنحاء العالم ويمكنك من خلالها إنشاء مواقع من جميع مستويات التعقيد ، من مواقع بطاقات العمل إلى البوابات الكبيرة. أعتقد أنه لم يعد سرا بالنسبة للكثيرين أن أكبر الشبكات الاجتماعية facebook.com(من الصفر إلى php) و vk.com(محرك php) تمت كتابته بلغة PHP. لذلك نستخلص النتائج ونبدأ العمل!)

كيف يعمل الكود

كود PHP معالجتها على جانب الخادم... أي لا توجد صفحة جاهزة. على سبيل المثال ، في الكود ، يتم إعطاء أمر لجمع البيانات حول عدد المستخدمين المسجلين حاليًا على الموقع. ينقر زائر الموقع على ارتباط جميع المستخدمين... يريد أن يحصل بيانات ديناميكية، أي تلك التي تتغير باستمرار. بعد انتهاء العد على الخادم ، ستأتي البيانات من الخادم في شكل كود HTML الذي تم إنشاؤه للصفحة مع عدد المستخدمين. نتيجة لذلك ، بعد النقر فوق طلب على الرابط ، يتلقى المستخدم الصفحة. إذا قمت بعرض كود الصفحة الناتجة ، يمكنك رؤية HTML فقط ، ولن يكون كود PHP متاحًا للعرض. بشكل تقريبي ، PHP هي تعليمات للخادم حول كيفية ومن أي كتل لإنشاء صفحة.

كيف يبدو كود PHP وأين يتم إدخاله؟

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

كود PHP(ملف index.php)



مثال على استخدام PHP


صدى "مرحبا العالم!" ؛
?>



برهنة مصادر التنزيل
ستكون نتيجة الكود ناتج نص عادي مرحبا بالعالم!... اسأل لماذا تكتب كود php لعرض نص عادي؟ بيان الصدى، الذي سنتحدث عنه بعد قليل ، ليس فقط لعرض النص. في كثير من الأحيان ، يتم استخدام echo لعرض نتيجة عمل بعض الوظائف التي قامت بحساب البيانات أو أخذها من قاعدة البيانات (ما هي قاعدة البيانات؟). هذا هو عرض البيانات الديناميكي.

بيان الصدى في PHP

كما فهمت بالفعل ، عامل التشغيل صدى صوتاللازمة لإخراج البيانات. نأخذ المحتوى (في حالتنا ، النص فقط حتى الآن) بداخله يقتبس، وفي النهاية نضع فاصلة منقوطة ; هذا يمثل نهاية عمل المشغل.

في البرمجة ، عند إنشاء الصفحة الأولى ، من المعتاد استخدام العبارة مرحبا بالعالم!- هذا هو مرحبا بالعالم!هذا ما نستخدمه. لن نستخدم لغة تأشير النص الفائق html في المثال ، لأنها ليست ضرورية.

كود PHP

صدى "مرحبا العالم!" ؛
?>
سيخرج البرنامج مرحبا بالعالم!.
في المثال الأول ، أدخلنا كود php صغيرًا في html. الآن ، على العكس من ذلك ، دعنا نحقن عناصر html في كود php.

كود PHP

صدى صوت " ";
صدى صوت " ";
صدى صوت " أول برنامج نصي لي PHP";
صدى صوت "";
صدى صوت " ";
صدى صوت "

مرحبا بالعالم!

";
صدى صوت ""؛
?>
نتيجة لذلك ، نحصل على صفحة فارغة بعنوان مرحبا بالعالم!

بيان طباعة PHP

بخلاف بيان echo ، اطبع بيانات المخرجات بما في ذلك المسافات والواصلة. له بعض القيود - يمكنك استخدام حجة واحدة فقط ، وصدى عدة حجة. يدوم لفترة أطول من الصدى. فيما يلي سنستخدم هذا العامل عند كتابة الوظائف.

اطبع "Hello World!
السطر الثاني من النص "؛ / / سيتم عرض النتيجة في سطرين
?>
سيتم عرض النص كما هو مكتوب.

بيان المخرجات - بناء جملة PHP heredoc

كما لاحظت بالفعل ، فإن عرض الصفحة باستخدام عامل الصدى باستمرار أمر قبيح وغير قابل للقراءة. لذلك ، لإخراج أجزاء كبيرة من كود html ، هناك بيان إخراج آخر يستخدم الصيغة القديمة. كما تعرض البيانات بالشكل نفسه الذي كانت فيه (مسافات وواصلات).

صدى صوت<<

مثال


مثال على إخراج كمية كبيرة من النص باستخدام لغة تأشير النص الفائق


الفقرة الثانية من نفس النص الضخم.


هنا؛
?>

مذكرة الدرس

كود PHP يمكنه:

1. لا تحتوي على أي عنصر html. سيستمر عرض الصفحة والنص. هناك حاجة إلى html لترميز المحتوى الجميل.

2. يتم تضمينها في كود html واحتوائها داخل عبارات الإخراج الخاصة بهم (echo ، print ، إلخ). الشيء الرئيسي هو عدم نسيان التصميم

3. يجب أن تحتوي الصفحات التي تحتوي على كود php على الامتداد المناسب: .php .phtml

من الدروس التالية ، سنتناول أساسيات إنشاء المواقع بلغة php ، حيث سترى جميع مزايا استخدام هذه اللغة!

شكرا للانتباه!

يوما سعيدا للجميع. هذه هي المقالة الأولى في سلسلة PHP للمبتدئين. ستكون هذه سلسلة غير عادية من المقالات ، ولن يكون هناك صدى "Hello World" ، سيكون هناك متشددون من حياة مبرمجي PHP مع القليل من "الواجب المنزلي" لتوحيد المواد.

سأبدأ بالجلسات - هذا هو أحد أهم المكونات التي سيتعين عليك العمل بها. عدم فهم مبادئ عمله - تويست بيزنس. لذلك من أجل تجنب المشاكل ، سأحاول إخبارك بكل الفروق الدقيقة الممكنة.

لكن أولاً ، لفهم سبب حاجتنا إلى جلسة ، دعنا ننتقل إلى الأصول - إلى بروتوكول HTTP.

بروتوكول HTTP

بروتوكول HTTP هو بروتوكول نقل النص التشعبي - أي. في الواقع ، إنه بروتوكول نصي ، ولن يكون من الصعب فهمه.

في البداية ، كان من المفترض أن يتم نقل HTML فقط عبر هذا البروتوكول ، من المكان والاسم ، والآن ما لا يرسلونه (_ ㅅ _) = ^. ^ =

لكي لا تتغلب على الأدغال ، اسمح لي أن أقدم لك مثالاً على الاتصال عبر بروتوكول HTTP ، فإليك الطلب كيف يرسله متصفحك عندما تطلب الصفحة http://example.com:

GET / HTTP / 1.1 Host: example.com Accept: text / html ... سلسلة فارغة ...

وإليك مثال للإجابة:

HTTP / 1.1 200 OK طول المحتوى: 1983 نوع المحتوى: text / html؛ charset = utf-8 ... ...

هذه أمثلة مبسطة للغاية ، ولكن يمكنك هنا معرفة ما يتكون منه طلب واستجابة HTTP:

  1. خط البداية- لطلب يحتوي على طريقة ومسار الصفحة المطلوبة ، للاستجابة - إصدار البروتوكول ورمز الاستجابة
  2. العناوين- اجعل قيمة مفتاح التنسيق مفصولة بنقطتين ، كل رأس جديد يكتب في سطر جديد
  3. نص الرسالة- HTML مباشرة أو يتم فصل البيانات عن الترويسات بواسطة فاصلي أسطر ، قد تكون غائبة ، كما هو الحال في الطلب المحدد

لذلك ، على ما يبدو ، اكتشفوا البروتوكول - إنه بسيط ، لقد كان يقود تاريخه منذ عام 1992 ، لذلك لا يمكنك تسميته بالمثالية ، ولكن ما هو - أرسل طلبًا - احصل على إجابة ، وهذا كل شيء ، الخادم ولم يعد العميل متصلًا بأي شكل من الأشكال. لكن مثل هذا السيناريو ليس بأي حال من الأحوال السيناريو الوحيد الممكن ، يمكننا الحصول على إذن ، يجب أن يفهم الخادم بطريقة أو بأخرى أن هذا الطلب جاء من مستخدم معين ، أي يجب أن يتواصل العميل والخادم خلال جلسة معينة. ونعم ، توصلوا إلى الآلية التالية لهذا:

  1. عند تفويض مستخدم ، ينشئ الخادم ويتذكر مفتاحًا فريدًا - معرف الجلسة ، ويبلغ المتصفح
  2. يقوم المتصفح بتخزين هذا المفتاح ، ومع كل طلب لاحق ، يقوم بإرساله

لتنفيذ هذه الآلية ، تم إنشاء (ملفات تعريف الارتباط ، ملفات تعريف الارتباط) - ملفات نصية بسيطة على جهاز الكمبيوتر الخاص بك ، ملف واحد لكل مجال (على الرغم من أن بعض المتصفحات أكثر تقدمًا وتستخدم قاعدة بيانات SQLite للتخزين) ، بينما يفرض المتصفح حدًا على العدد من السجلات وحجم البيانات المخزنة (لمعظم المتصفحات 4096 بايت ، انظر RFC 2109 لعام 1997)

أولئك. إذا قمت بسرقة ملف تعريف ارتباط من متصفحك ، فهل سيكون من الممكن الانتقال إلى صفحة الفيسبوك الخاصة بك نيابة عنك؟ لا تنزعج ، هذا لا يمكن القيام به ، على الأقل مع facebook ، وبعد ذلك سوف أعلمك كيف يمكنك حماية نفسك من هذا النوع من الهجوم على المستخدمين لديك.

دعنا الآن نرى كيف ستتغير استجابة الطلب ، وما إذا كان هناك إذن:

POST / تسجيل الدخول / HTTP / 1.1 المضيف: example.com قبول: text / html login = اسم المستخدم وكلمة المرور = Userpass

تم تغيير طريقتنا إلى POST ، وفي نص الطلب ، يتم إرسال اسم المستخدم وكلمة المرور (إذا كنت تستخدم طريقة GET ، فستحتوي سلسلة الطلب على اسم المستخدم وكلمة المرور ، ويمكن حفظها على بعض خوادم الوكيل الوسيطة ، والتي سيء جدا).

HTTP / 1.1 200 OK نوع المحتوى: نص / html ؛ charset = utf-8 Set-Cookie: KEY = VerySecretUniqueKey ... ...

ستحتوي استجابة الخادم على Set-Cookie: KEY = VerySecretUniqueKey ، والتي ستجبر المتصفح على حفظ هذه البيانات في ملفات تعريف الارتباط ، وفي المرة التالية التي يتم فيها الوصول إلى الخادم ، سيتم إرسالها والتعرف عليها من قبل الخادم:

GET / HTTP / 1.1 Host: example.com Accept: text / html Cookie: KEY = VerySecretUniqueKey ... سلسلة فارغة ...

كما ترى ، تختلف الرؤوس المرسلة بواسطة المتصفح (رؤوس الطلبات) والخادم (رؤوس الاستجابة) ، على الرغم من وجود رؤوس عامة لكل من الطلبات والاستجابات (الرؤوس العامة).

تعرف الخادم على مستخدمنا من خلال ملفات تعريف الارتباط المرسلة ، وسيوفر له أيضًا إمكانية الوصول إلى المعلومات الشخصية. حسنًا ، نوعًا ما تم الفرز مع الجلسات و HTTP ، يمكنك الآن العودة إلى PHP وميزاتها.

PHP والجلسة

آمل أن يكون لديك PHP مثبتًا بالفعل على جهاز الكمبيوتر الخاص بك ، منذ ذلك الحين كذلك سأقدم أمثلة ، وستحتاج إلى تشغيلها

تم إنشاء PHP لمطابقة بروتوكول HTTP - أي وتتمثل مهمتها الرئيسية في الاستجابة لطلب HTTP و "الموت" لتحرير الذاكرة والموارد. لذلك ، تعمل آلية الجلسة في PHP ليس في الوضع التلقائي ، ولكن في الوضع اليدوي ، وتحتاج إلى معرفة ما يجب الاتصال به ، وبأي ترتيب.

بادئ ذي بدء ، تحتاج إلى "بدء" الجلسة - لهذا سنستخدم وظيفة session_start () ، وننشئ ملفًا جلسة. بدء. phpبالمحتوى التالي:

Session_start () ،

والآن - نقوم بتحديث الصفحة ، ونرى أن المتصفح يرسل ملف تعريف الارتباط هذا إلى الخادم ، يمكنك محاولة تحديث الصفحة عدة مرات ، وستكون النتيجة متطابقة:

في المجموع ، لدينا - النظرية تزامنت مع الممارسة ، وهذا جيد.

الخطوة التالية هي حفظ قيمة عشوائية للجلسة ، لهذا الغرض ، تستخدم PHP المتغير العام الفائق $ _SESSION ، وسنوفر الوقت الحالي عن طريق استدعاء دالة date ():

Session_start () ، $ _SESSION ["time"] = التاريخ ("H: i: s") ؛ صدى $ _SESSION ["الوقت"] ؛

نقوم بتحديث الصفحة والاطلاع على وقت الخادم ، وتحديثه مرة أخرى - وتم تحديث الوقت. دعنا الآن نجعل الأمر بحيث لا يتغير الوقت المحدد في كل مرة يتم فيها تحديث الصفحة:

Session_start () ، if (! isset ($ _ SESSION ["time"])) ($ _SESSION ["time"] = date ("H: i: s")؛) echo $ _SESSION ["time"]؛

نقوم بتحديث - الوقت لا يتغير ، ما هو مطلوب. لكن في نفس الوقت ، نتذكر أن PHP تحتضر ، مما يعني أنها تخزن هذه الجلسة في مكان ما ، وسنجد هذا المكان ...

يصبح كل السر واضحا

بشكل افتراضي ، يخزن PHP الجلسة في ملفات - التوجيه session.save_handler هو المسؤول عن ذلك. ابحث عن المسار حيث يتم حفظ الملفات في التوجيه session.save_path ، أو استخدم الدالة session_save_path () للحصول على المسار المطلوب.

في التكوين الخاص بك ، قد لا يتم تحديد المسار إلى الملفات ، ثم سيتم تخزين ملفات الجلسة في ملفات مؤقتة على نظامك - اتصل بوظيفة sys_get_temp_dir () واكتشف مكان هذا المكان المخفي.

لذلك ، نذهب على طول هذا المسار ونجد ملف الجلسة الخاص بك (لدي هذا الملف sess_dap83arr6r3b56e0q7t5i0qf91) ، افتحه في محرر نصي:

الوقت | الساعات: 8: "16:19:51" ؛

كما ترون ، هذا هو وقتنا ، هذا هو التنسيق الصعب الذي يتم تخزين جلستنا فيه ، ولكن يمكننا إجراء تعديلات ، أو تغيير الوقت ، أو يمكننا ببساطة إدخال أي سطر ، لماذا لا:

الوقت | الساعات: 13: "\ m / (@ [بريد إلكتروني محمي]) \ م / "؛

لتحويل هذه السلسلة إلى مصفوفة ، تحتاج إلى استخدام وظيفة session_decode () ، للتحويل العكسي - session_encode () - وهذا ما يسمى التسلسل ، ولكن فقط في PHP للجلسات - إنه خاص ، على الرغم من أنه يمكنك استخدام تسلسل PHP القياسي - اكتبها في جلسة توجيه التكوين .serialize_handler php_serialize value وستكون سعيدًا ، ويمكن استخدام $ _SESSION بدون قيود - الآن يمكنك استخدام الأرقام والأحرف الخاصة كمؤشر | و! بالاسم (طوال سنوات العمل التي تزيد عن 10 سنوات ، لم أضطر أبدًا إلى :)

يمارس
اكتب وظيفتك الخاصة ، المشابهة في وظيفة session_decode () ، إليك مجموعة اختبار من البيانات للجلسة (لا تحتاج إلى معرفة بالتعبيرات العادية لحلها) ، خذ النص للتحويل من ملف جلستك الحالية:

_SESSION $ ["فار عدد صحيح"] = 123 ؛ _SESSION $ ["float var"] = 1.23 ؛ $ _SESSION ["فار ثماني"] = 0x123 ؛ $ _SESSION ["string var"] = "Hello world"؛ $ _SESSION ["array var"] = ["one"، "two"،]؛ $ object = new stdClass () ؛ $ object-> foo = "bar"؛ $ object-> arr = ["hello"، "world"]؛ $ _SESSION ["object var"] = $ object؛ _SESSION $ ["عدد صحيح مرة أخرى"] = 42 ؛

إذن ، ما الذي لم نحاوله بعد؟ هذا صحيح - لسرقة ملفات تعريف الارتباط ، دعنا نطلق متصفحًا آخر ونضيف ملفات تعريف الارتباط نفسها إليه. لقد كتبت لك جافا سكريبت بسيطًا لهذا ، انسخه في وحدة تحكم المتصفح وقم بتشغيله ، فقط لا تنس تغيير معرف الجلسة إلى معرفك الخاص:

جافا سكريبت: (الوظيفة () (document.cookie = "PHPSESSID = dap83arr6r3b56e0q7t5i0qf91؛ path = /؛"؛ window.location.reload ()؛)) ()

الآن لديك كلا المستعرضين ينظران إلى الجلسة نفسها. لقد ذكرت أعلاه أنني سأتحدث عن طرق الحماية ، ونفكر في أبسط طريقة - سنربط الجلسة بالمتصفح ، بشكل أكثر دقة ، بكيفية ظهور المتصفح للخادم - سنتذكر وكيل المستخدم ونتحقق منه في كل مرة:

Session_start () ، إذا (! isset ($ _ SESSION ["time"])) ($ _SESSION ["ua"] = $ _SERVER ["HTTP_USER_AGENT"]؛ $ _SESSION ["time"] = التاريخ ("H: i: s") ؛) إذا ($ _SESSION ["ua"]! = $ _SERVER ["HTTP_USER_AGENT"]) (يموت ("متصفح خاطئ")؛) صدى $ _SESSION ["الوقت"]؛

يصعب تزوير هذا ، ولكن لا يزال ممكنًا ، أضف هنا حفظ وفحص $ _SERVER ["REMOTE_ADDR"] و $ _SERVER ["HTTP_X_FORWARDED_FOR"] ، وسيبدو بشكل أو بآخر وكأنه حماية من المتطفلين الذين يتعدون على "ملفات تعريف الارتباط" الخاصة بنا.

الكلمة الرئيسية في الفقرة السابقة يبدو، في المشاريع الحقيقية ، تعمل ملفات تعريف الارتباط منذ فترة طويلة عبر بروتوكول HTTPS ، لذلك لا يمكن لأي شخص سرقتها دون الوصول المادي إلى جهاز الكمبيوتر أو الهاتف الذكي الخاص بك

يمارس
أضف فحصًا لعنوان IP الخاص بالمستخدم إلى الرمز ، إذا فشل الفحص ، فاحذف الجلسة المخترقة.

خطوة بخطوة

والآن سأشرح خطوة بخطوة خوارزمية كيفية عمل الجلسة في PHP ، باستخدام مثال الكود التالي (الإعدادات الافتراضية):

Session_start () ، _SESSION $ ["id"] = 42 ؛

  1. بعد استدعاء session_start () ، تبحث PHP عن معرف الجلسة في ملف تعريف الارتباط بالاسم المحدد في session.name - هذا هو PHPSESSID
  2. إذا لم يكن هناك معرف ، فسيتم إنشاؤه (انظر session_id ()) ، ويقوم بإنشاء ملف جلسة فارغ على طول مسار الجلسة. ملف تعريف الارتباط (اسم الجلسة ()) = (معرف الجلسة ())
  3. إذا كان المعرف موجودًا ، فإننا نبحث عن ملف الجلسة في مجلد session.save_path:
    • غير موجود - قم بإنشاء ملف فارغ باسم sess _ ($ _ COOKIE) (يمكن أن يحتوي المعرف فقط على أحرف من النطاقات a-z ، A-Z ، 0-9 ، الفاصلة وعلامة الطرح)
    • ابحث عن الملف واقرأه وفك ضغط البيانات (انظر session_decode ()) في المتغير الشامل الفائق $ _SESSION
  4. عندما ينتهي البرنامج النصي من عمله ، يتم تعبئة جميع البيانات من $ _SESSION باستخدام session_encode () في ملف على طول مسار session.save_path المسمى sess_ (session_id ())

يمارس
عيّن في المستعرض قيمة عشوائية لملف تعريف الارتباط المسمى PHPSESSID ، فليكن 1234567890 ، قم بتحديث الصفحة ، وتحقق من أنك قمت بإنشاء ملف جديد sess_1234567890

هل هناك حياة بدون ملفات تعريف الارتباط؟

يمكن أن تعمل PHP مع الجلسة حتى إذا تم تعطيل ملفات تعريف الارتباط في المتصفح ، ولكن بعد ذلك ستحتوي جميع عناوين URL على الموقع على معلمة بمعرف جلستك ، ونعم - لا يزال هذا بحاجة إلى التهيئة ، ولكن هل تحتاجه؟ لم أكن مضطرًا لاستخدامه ، ولكن إذا كنت أرغب حقًا في ذلك ، فسأخبرك فقط بمكان الحفر:

وإذا كنت بحاجة لتخزين الجلسة في قاعدة البيانات؟

لتخزين الجلسة في قاعدة البيانات ، تحتاج إلى تغيير تخزين الجلسة وإخبار PHP بكيفية استخدامها ؛ لهذا الغرض ، تم إنشاء واجهة SessionHandlerInterface ووظيفة session_set_save_handler.

بشكل منفصل ، ألاحظ أنك لست بحاجة إلى كتابة معالجات الجلسة الخاصة بك لـ redis و memcache - عندما تقوم بتثبيت هذه الإضافات ، فإن المعالجات المقابلة تتوافق معها ، لذا فإن RTFM هو كل شيء لدينا. حسنًا ، نعم ، يجب تحديد المعالج قبل استدعاء session_start () ؛)

يمارس
قم بتنفيذ SessionHandlerInterface لتخزين جلسة MySQL ، واختبر ما إذا كانت تعمل.
هذا هو تعيين علامة النجمة لأولئك الذين هم بالفعل على دراية بقواعد البيانات.

متى تموت الجلسة؟

سؤال مثير للاهتمام ، يمكنك طرحه على المطورين المخضرمين - متى تحذف PHP ملفات الجلسات منتهية الصلاحية؟ الجواب في الدليل الرسمي ، ولكن ليس بشكل صريح - لذا تذكر:

يمكن بدء تشغيل المجموعة المهملة عندما يتم استدعاء وظيفة session_start () ، ويعتمد احتمال التشغيل على توجيهين جلسة. هي 1 و 100 ، أي e. يبلغ احتمال بدء تشغيل المُجمع وحذف ملفات الجلسة حوالي 1٪.

يمارس
قم بتغيير قيمة التوجيه session.gc_divisor بحيث يبدأ برنامج تجميع البيانات المهملة في كل مرة ، وتأكد من أن هذا ما يحدث.

أبسط خطأ

خطأ بأكثر من نصف مليون نتيجة في نتائج بحث Google:

لا يمكن إرسال ملف تعريف ارتباط الجلسة - رؤوس مرسلة بالفعلبواسطة
لا يمكن إرسال محدد ذاكرة التخزين المؤقت للجلسة - رؤوس مرسلة بالفعل

للحصول على واحدة ، قم بإنشاء ملف جلسة. Error.phpبالمحتوى التالي:

صدى str_pad ("" ، ini_get ("output_buffering")) ؛ جلسة_ستارت () ،

في السطر الثاني ، هناك "سحر" غريب - هذه خدعة بمخزن إخراج مؤقت ، سأتحدث عنها في إحدى المقالات التالية ، في الوقت الحالي ، اعتبرها فقط سطرًا مكونًا من 4096 حرفًا ، في هذا هذه كلها مسافات

قم بتشغيل ، بعد حذف ملف تعريف الارتباط ، وستحصل على الأخطاء المذكورة أعلاه ، على الرغم من اختلاف نص الخطأ ، ولكن الجوهر هو نفسه - لقد غادر القطار - أرسل الخادم بالفعل محتوى الصفحة إلى المتصفح ، وهو كذلك أيضًا في وقت متأخر في إرسال الرؤوس ، لن يعمل هذا ، ولم يظهر معرّف الجلسة العزيزة في ملفات تعريف الارتباط. إذا عثرت على هذا الخطأ ، فابحث عن المكان الذي يتم عرض النص فيه
في وقت مبكر ، يمكن أن تكون مسافة قبل الأحرففي أحد الملفات المضمنة ، حسنًا ، إذا كانت مساحة ، فقد يكون هناك بعض الشخصيات غير القابلة للطباعة مثل BOM ، لذا كن حذرًا ، ولن تلمسك هذه العدوى (حسنًا ، ... ضحك منزلي).

يمارس
لاختبار هذه المعرفة ، أريد منك تنفيذ آلية الجلسة الخاصة بك وجعل الكود أعلاه يعمل:

Require_once "include / sess.php" ؛ sess_start () ، if (isset ($ _ SESS ["id"])) (echo $ _SESS ["id"] ؛) else ($ _SESS ["id"] = 42 ؛)

لتحقيق ذلك ، تحتاج إلى وظيفة register_shutdown_function ().

أخيرا

في هذه المقالة ، يتم تكليفك بست مهام ، وهي لا تتعلق فقط بالعمل مع الجلسات ، ولكنها تقدم لك أيضًا MySQL ووظائف العمل مع السلاسل. لإتقان هذه المادة - لست بحاجة إلى مقالة منفصلة ، فسيكون الدليل الموجود على الروابط المعطاة كافياً - لن يقرأها أحد نيابة عنك. أذهب خلفها!

ملاحظة. إذا تعلمت شيئًا جديدًا من المقالة - أشكر المؤلف - شارك المقالة في الشبكات الاجتماعية ؛)

إذا كنت مستخدمًا جديدًا لـ PHP ، فهناك بعض التعريفات التي تحتاج إلى معرفتها.
بادئ ذي بدء ، PHP هي لغة برمجة وتستخدم لكتابة أوامر (نصوص) موجهة إلى الخادم. لجعل الأمر أكثر بساطة ، باستخدام PHP يمكننا التواصل مع الخادم.
أوامر PHP سهلة التضمين في صفحات HTML. هذه الخاصية هي ميزة مهمة لـ PHP على لغات مثل Perl و C.

بناء جملة PHP

يبدأ كود البرنامج النصي PHP بعد فتح العلامة... تتم قراءة النص بين هاتين العلامتين بواسطة برنامج موجود على الخادم ، ويتم إخراج النتيجة إلى مستند HTML. لنأخذ مثالا:



مثال

تشمل ("sidebar.htm") ؛
?>


إذا احتجنا إلى إدخال شيء ما في كود html للصفحة ، فيجب علينا استخدام الأمر include. بعد ذلك ، نشير إلى عنوان الملف ، وينتهي السطر ، كما في CSS ؛

أدخل كود HTML في صفحات الموقع

كقاعدة عامة ، الشريط الجانبي ( الشريط الجانبي) والطابق السفلي ( تذييل) تبقى دون تغيير في جميع صفحات الموقع. ومن هنا جاءت الرموز

.....
و يمكن وضعها في صفحات htm منفصلة "sidebar.htm" و "footer.htm" وإدراجها في صفحات الموقع باستخدام الأمر include. إذا تم ، في نفس الوقت ، نقل المحتوى الرئيسي إلى ملف منفصل -
.....
، فسيبدو رمز صفحتنا بالشكل التالي:



مثال

تشمل ("sidebar.htm") ؛
تشمل ("content.htm") ؛
تشمل ("footer.htm") ؛
?>


محتوى sidebar.htm


هنا
المحتوى
الخاص بك
شريط جانبي

وبالمثل مع ملفات content.htm و footer.htm.

مع هذا الجيل من الصفحات ، تحتاج فقط إلى إجراء تغييرات على ملف واحد "sidebar.htm" لتغيير جميع صفحات الموقع. هذا مناسب جدًا إذا كان موقعك يتكون من مئات أو آلاف الصفحات.

PHP على جهاز الكمبيوتر الخاص بك

لكي تتمكن من العمل مع البرامج النصية PHP وعرض نتائج التنفيذ في المستعرض ، تحتاج إلى تثبيت خادم ويب يعمل باستخدام PHP على جهاز الكمبيوتر المحلي الخاص بك.
دنفر هي الأنسب لمثل هذه المهام. (الموقع الرسمي يوفر كل ما تحتاجه مجاني) تتضمن مجموعة التثبيت - Apache و php و MySQL. بمعنى آخر ، سيكون خادمًا كامل الوظائف لمواقع الاستضافة موجودًا على جهاز الكمبيوتر الخاص بك.

لكي يعمل كود PHP في صفحات HTML ، تحتاج إلى فتح الملف htaccessفي أي محرر نصوص واكتب ما يلي:

تطبيق AddHandler / x-httpd-php .html

يسمح هذا الإدخال بتنفيذ نصوص PHP في صفحات HTML.

أو قم بتغيير امتداد الملف. لغة البرمجةتشغيل. بي أتش بي

ميزات PHP

PHP قادرة على أكثر من مجرد عرض HTML. تتضمن قدرات PHP إنشاء صور وملفات PDF وحتى أفلام فلاش (باستخدام libswf و Ming) يتم إنشاؤها أثناء التنقل. PHP قادرة أيضًا على تقديم أي بيانات نصية مثل XHTML وملفات XML الأخرى. PHP قادرة على إنشاء مثل هذه الملفات تلقائيًا وتخزينها في نظام ملفات الخادم الخاص بك بدلاً من تقديمها للعميل ، وبالتالي تنظيم ذاكرة تخزين مؤقت من جانب الخادم للمحتوى الديناميكي.

تتمثل إحدى المزايا المهمة لـ PHP في دعمها لمجموعة واسعة من قواعد البيانات. باختصار ، PHP لديها الكثير لتقدمه لك! يمكن العثور على مزيد من التفاصيل حول فوائد PHP على www.php.su.

1 فبراير 2015


عند البدء في كتابة برامج للويب ، يواجه العديد من المبرمجين المبتدئين هذا الخطأ. إنهم ينظرون إلى نظام خادم المتصفح كتطبيق عادي. تفاعلي. ضغطت على الزر - رد النظام. رسمتها بالماوس - لقد تفاعلت. جميع المعلومات المتاحة للعميل متاحة أيضًا للبرنامج ، والبرنامج موجود في الذاكرة طوال الوقت.
لذلك ، في برمجة الويب هذا ليس صحيحا!.
في اللحظة التي يرى فيها المستخدم الصفحة التي أمامه ويبدأ في أداء بعض الإجراءات معها ، تم الخروج من PHP بالفعل! ولا يتفاعل المستخدم مع سكربت PHP ، بل يتفاعل مع صفحة HTML الخاصة به التي يتلقاها في المتصفح. في معظم الحالات ، تكون نتيجة نص PHP نصًا عاديًا. نص صفحة HTML. والتي يتم تقديمها للمتصفح وعرضها بتنسيق HTML عادي. يمكنك أن ترى بنفسك من خلال الكتابة في السيناريو
"مهلا، فاسيا!" ; ?> ;
ثم من خلال عرض النص المصدر للصفحة الناتجة في المتصفح. لا توجد علامات PHP هناك! فقط
مهلا، فاسيا!
لأن PHP يتم تنفيذه على الخادم!

يتواصل الخادم والمتصفح عن طريق إرسال الطلبات إلى بعضهما البعض باستخدام بروتوكول خاص - HTTP. يمكن للمتصفح فقط بدء الاتصال. يرسل طلبًا إلى الخادم لإظهار ملف كذا وكذا. يرسل الخادم الملف إلى العميل.
هذه هي الطريقة الوحيدة لحدوث ذلك. طلب العميل - تخلى عنها الخادم. ونسي العميل على الفور. من هنا يتضح إجابة السؤال عما إذا كان من الممكن معرفة عدد المستخدمين على الموقع بالضبط الآن. ممنوع. لأنه لا يوجد واحد "على الموقع". يتصلون ويطلبون صفحة ويفصلون. ليس لديك اتصال دائم بالخادم ، على سبيل المثال ، لاعبي Kwaku. يمكنك معرفة ذلك فقط عن طريق تسجيل وقت كل اتصال واختيار السجلات لفترة زمنية معينة.

مثال على الاتصال بين المتصفح والخادم:
ينقر المستخدم على الرابط ، ويرسل المتصفح طلبًا إلى الخادم وينتظر الرد:
المتصفح -> PHP
ينفذ PHP البرنامج النصي ، ويرسل النتيجة إلى المتصفح ويخرج:
PHP -> المتصفح
يعرض المتصفح الصفحة ، "يمسحها" بحثًا عن الروابط التي يجب طلبها من الخادم (العلامات ,