PHP للمبتدئين. الجلسة

ElePHPant. PHP للمبتدئين. الجلسة

أتمنى لك يومًا سعيدًا. هذه هي المقالة الأولى في سلسلة PHP للمطورين المبتدئين. ستكون هذه سلسلة من المقالات غير المعتادة ، ولن يكون هناك echo "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 Content-Length: 1983 Content-Type: text/html; charset=utf-8 <html> <head>...</head> <body>...</body> </html> 

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

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

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

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

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

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

طلب
 POST /login/ HTTP/1.1 Host: example.com Accept: text/html login=Username&password=Userpass 


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

الرد
 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Set-Cookie: KEY=VerySecretUniqueKey <html> <head>...</head> <body>...</body> </html> 

سوف تحتوي استجابة الخادم على رأس 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 في الوضع التلقائي ، ولكن في الوضع اليدوي ، وتحتاج إلى معرفة ما يجب الاتصال به وبأي ترتيب.
إليك مقالة حول الموضوع والمقصود به PHP ، أو أنه باللغة الروسية ، لكن من الأفضل وضعه في الإشارات "لاحقًا".

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

 <?php session_start(); 

قم بتشغيل خادم الويب PHP المدمج في المجلد باستخدام البرنامج النصي:

 php -S 127.0.0.1:8080 

قم بتشغيل المستعرض وافتح أدوات المطور (أو أي شيء آخر ) ، ثم انتقل إلى الصفحة http://127.0.0.1:8080/session.start.php - يجب أن تشاهد صفحة فارغة فقط ، لكن لا تتعجل في الإغلاق - انظر إلى الرؤوس التي أرسلها الخادم إلينا:

الكعكة

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

 Set-Cookie: PHPSESSID=dap83arr6r3b56e0q7t5i0qf91; path=/ 

عند رؤية هذا ، سيحفظ المتصفح ملف تعريف ارتباط باسم "PHPSESSID":

ملف تعريف ارتباط جلسة المتصفح

PHPSESSID - اسم الجلسة الافتراضي ، يتم ضبطه من تكوين php.ini مع توجيه session.name ، إذا لزم الأمر ، يمكن تغيير الاسم في ملف التكوين نفسه أو باستخدام دالة session_name ()

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

طلب متصفح مع ملف تعريف الارتباط

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

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

 session_start(); $_SESSION['time'] = date("H:i:s"); echo $_SESSION['time']; 

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

 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 ) ، افتحه في محرر نصوص:

 time|s:8:"16:19:51"; 

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

 time|s:13:"\m/ (@.@) \m/"; 

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

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

 $_SESSION['integer var'] = 123; $_SESSION['float var'] = 1.23; $_SESSION['octal var'] = 0x123; $_SESSION['string var'] = "Hello world"; $_SESSION['array var'] = array('one', 'two', [1,2,3]); $object = new stdClass(); $object->foo = 'bar'; $object->arr = array('hello', 'world'); $_SESSION['object var'] = $object; $_SESSION['integer again'] = 42; 


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

 javascript:(function(){document.cookie='PHPSESSID=dap83arr6r3b56e0q7t5i0qf91;path=/;';window.location.reload();})() 

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

 session_start(); if (!isset($_SESSION['time'])) { $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT']; $_SESSION['time'] = date("H:i:s"); } if ($_SESSION['ua'] != $_SERVER['HTTP_USER_AGENT']) { die('Wrong browser'); } echo $_SESSION['time']; 

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

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


تجدر الإشارة إلى توجيه session.cookie-httponly ، وبفضله ، يتعذر الوصول إلى ملف تعريف ارتباط الجلسة من JavaScript. بالإضافة إلى ذلك ، إذا نظرت إلى دليل وظائف setcookie () ، ستلاحظ أن المعلمة الأخيرة مسؤولة أيضًا عن HttpOnly. تذكر هذا - يتيح لك هذا الإعداد التعامل بفعالية مع هجمات XSS في جميع المتصفحات تقريبًا.

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

خطوة بخطوة


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

 session_start(); $_SESSION['id'] = 42; 

  1. بعد استدعاء session_start() يبحث PHP في ملف تعريف الارتباط عن معرف الجلسة بالاسم المحدد في session.name - وهذا هو PHPSESSID
  2. إذا لم يكن هناك مُعرّف ، فسيتم إنشاؤه (راجع session_id () ) ، ويقوم بإنشاء ملف جلسة فارغ على طول مسار session.save_path باسم sess_{session_id()} ، ستتم إضافة الرؤوس إلى استجابة الخادم لتعيين ملف تعريف الارتباط {session_name()}={session_id()}
  3. إذا كان المعرف موجودًا ، فابحث عن ملف الجلسة في مجلد session.save_path :
    • لم نعثر عليه - نحن ننشئ ملفًا فارغًا يحمل الاسم sess_{$_COOKIE[session_name()]} (يمكن أن يحتوي المعرف على أحرف فقط من النطاقات az و AZ و 0-9 وعلامة الفاصلة وعلامة الطرح)
    • ابحث عن الملف واقرأه وقم بفك ضغط البيانات (انظر session_decode () ) في المتغير الفائق $_SESSION (الملف مؤمن للقراءة / الكتابة)
  4. عندما ينتهي البرنامج النصي من عمله ، $_SESSION تعبئة جميع البيانات من $_SESSION باستخدام session_encode() في ملف على طول مسار الجلسة. sess_{session_id()} باسم sess_{session_id()} (يتم تحرير القفل)

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

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


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


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


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

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


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


التوجيه session.gc_maxlifetime مسؤول عن عمر الجلسة. بشكل افتراضي ، فإن هذا التوجيه يساوي 1440 ثانية (24 دقيقة) ، يجب فهمه بحيث إذا لم يتم الوصول إلى جلسة لفترة محددة ، فسيتم اعتبار الجلسة "فاسدة" وستنتظر حتى يحذف دورها.

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

يمكن بدء مجموعة البيانات المهملة عندما يتم استدعاء الدالة session_start() ، ويعتمد احتمال البدء على توجيهين session.gc_probability و session.gc_divisor ، والأفعال الأولى بمثابة توزيعات الأرباح ، والأفعال الثانية كمقسمة ، وهذه القيم هي 1 و 100 افتراضيًا. ه. احتمال أن يتم إطلاق أداة التجميع وسيتم حذف ملفات الجلسة هو 1٪ تقريبًا.

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


الخطأ الأكثر تافهة


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

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

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

 echo str_pad(' ', ini_get('output_buffering')); session_start(); 

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

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

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

 require_once 'include/sess.php'; sess_start(); if (isset($_SESS["id"])) { echo $_SESS["id"]; } else { $_SESS["id"] = 42; } 

لتنفيذ خطتك ، ستحتاج إلى وظيفة register_shutdown_function ()



قفل


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

ولكن لنأخذ الخطوات مرة أخرى:

  1. session_start() لا يقوم فقط بإنشاء / قراءة ملف ، ولكن أيضًا يقوم بتأمينه بحيث لا يستطيع أي شخص إجراء تغييرات في الوقت الذي يتم فيه تنفيذ البرنامج النصي ، أو قراءة بيانات غير متسقة من ملف الجلسة
  2. يتم تحرير القفل في نهاية البرنامج النصي


"الالتصاق" بهذا الخطأ سهل للغاية ، قم بإنشاء ملفين:

 // start.php session_start(); echo "OK"; 


 // lock.php session_start(); sleep(10); echo "OK"; 


الآن ، إذا قمت بفتح صفحة lock.php في المستعرض ، ثم فتحت start.php في علامة تبويب جديدة ، سترى أن الصفحة الثانية لن تفتح إلا بعد تنفيذ البرنامج النصي الأول ، الذي يحظر ملف الجلسة لمدة 10 ثوانٍ.

هناك خياران لتجنب مثل هذه الظاهرة - "الخرقاء" و "مدروس".

"الفأس"
استخدم معالج جلسة مخصص حيث "تنسى" تطبيق القفل :)
الخيار الأفضل قليلاً هو اتخاذ خيار جاهز وتعطيل القفل (على سبيل المثال ، يحتوي memcached على مثل هذا الخيار - memcached.sess_locking ) O_o
قضاء ساعات في تصحيح أخطاء التعليمات البرمجية بحثًا عن خطأ منبثق نادر ...

"مدروس"
أين هي أفضل طريقة - لمراقبة قفل الجلسة بنفسك وإزالتها عندما لا تكون مطلوبة:

- إذا كنت متأكدًا من أنك لست بحاجة إلى إجراء تغييرات على بيانات الجلسة ، read_and_close خيار read_and_close عند بدء الجلسة:

 session_start([ 'read_and_close' => true ]); 


وبالتالي ، سيتم إطلاق القفل فور قراءة بيانات الجلسة.

- إذا كنت لا تزال بحاجة إلى إجراء تغييرات على الجلسة ، فبعد إغلاقها من التسجيل:

 session_start(); // some changes session_write_close(); 


المهمة
كانت قائمة الملفين start.php و lock.php أعلى قليلاً ، قم read-close.php المزيد من ملفات read-close.php و write-close.php ، حيث يمكنك التحكم في القفل بالطرق المدرجة. تحقق من كيفية عمل القفل (أو لا يعمل).


في الختام


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

ملاحظة: إذا تعلمت شيئًا جديدًا من المقالة - أشكر المؤلف - شارك المقالة في الشبكات الاجتماعية ؛)
PPS نعم ، هذه مقالة مشتركة من مدونتي ، لكنها لا تزال ذات صلة :)

سلسلة من المقالات "PHP للمبتدئين":

Source: https://habr.com/ru/post/ar437972/


All Articles