تشرح هذه المقالة بالتفصيل آلية التشغيل الأساسية لـ PHP، بما في ذلك تشغيل محتوى PHP، وتشرح دورة حياة PHP بأكملها منذ بدء التشغيل وحتى التوقف مع الأمثلة.
مقدمة
لم نبدأ أبدًا العملية المتعلقة بـ PHP يدويًا، فهي تعمل مع بدء تشغيل Apache؛ PHP متصل بـ Apache من خلال الوحدة mod_php5.so (على وجه التحديد، SAPI، واجهة برمجة تطبيقات الخادم
PHP تحتوي على إجمالي ثلاث وحدات: النواة ومحرك Zend وطبقة الامتداد؛ يتم استخدام PHP kernel لمعالجة الطلبات وتدفقات الملفات ومعالجة الأخطاء والعمليات الأخرى ذات الصلة؛ ويستخدم محرك Zend (ZE) لتحويل الملفات المصدر إلى لغة الآلة ثم تشغيلها على جهاز افتراضي؛ طبقة الامتداد عبارة عن مجموعة من الوظائف والمكتبات والتدفقات التي تستخدمها PHP لتنفيذ عمليات محددة. على سبيل المثال، نحتاج إلى امتداد mysql للاتصال بقاعدة بيانات MySQL؛ عندما تقوم ZE بتنفيذ البرنامج، قد تحتاج إلى الاتصال بعدة امتدادات. في هذا الوقت، تقوم ZE بتسليم التحكم إلى الامتداد وإعادته بعد معالجة المهمة المحددة وأخيرًا
، تقوم ZE بإرجاع نتائج تشغيل البرنامج إلى PHP kernel، والتي تنقل بعد ذلك النتائج إلى طبقة SAPI وتخرجها في النهاية إلى المتصفح.
ليس من السهلالخوض في
الأعمال الداخلية للواقع. العملية المذكورة أعلاه هي مجرد نسخة مبسطة، دعونا نتعمق قليلاً لنرى ما يحدث خلف الكواليس.
◆بعد بدء تشغيل Apache، يبدأ مترجم PHP أيضًا؛
◆تتكون عملية بدء تشغيل PHP من خطوتين:
الخطوة الأولى هي تهيئة بعض متغيرات البيئة، والتي ستصبح سارية المفعول طوال دورة حياة SAPI؛
الخطوة الثانية هي إنشاء بعض الإعدادات المتغيرة الخاصة بالطلب الحالي فقط.
الخطوة الأولى عند بدء PHP
ما هي الخطوات الأولى والثانية؟ لا تقلق، سنناقش هذا بالتفصيل لاحقًا. دعونا نلقي نظرة على الخطوة الأولى والأكثر أهمية أولاً. الشيء الذي يجب تذكره هو أن الخطوة الأولى من العملية تحدث قبل وصول أي طلبات.
بعد بدء تشغيل Apache، يبدأ مترجم PHP أيضًا؛
ويستدعي PHP طريقة MINIT لكل ملحق، وبالتالي تحويل هذه الامتدادات إلى حالة متاحة. ألقِ نظرة على الامتدادات المفتوحة في ملف php.ini؛ MINIT تعني "تهيئة الوحدة النمطية". تحدد كل وحدة مجموعة من الوظائف ومكتبات الفئات وما إلى ذلك للتعامل مع الطلبات الأخرى.
طريقة MINIT النموذجية هي كما يلي:
PHP_MINIT_FUNCTION(extension_name){
/* تهيئة الوظائف والفئات وما إلى ذلك */
}
تبدأ PHP الخطوة الثانية
عند حدوث طلب صفحة، تقوم طبقة SAPI بتسليم التحكم إلى طبقة PHP. لذلك تقوم PHP بتعيين متغيرات البيئة اللازمة للرد على هذا الطلب. وفي الوقت نفسه، يقوم أيضًا بإنشاء جدول متغير لتخزين أسماء المتغيرات والقيم التي تم إنشاؤها أثناء التنفيذ.
تستدعي PHP طريقة RINIT لكل وحدة، وهي "تهيئة الطلب". المثال الكلاسيكي هو RINIT لوحدة الجلسة إذا تم تمكين وحدة الجلسة في php.ini، فسيتم تهيئة المتغير $_SESSION وسيتم قراءة المحتوى ذي الصلة عند استدعاء RINIT للوحدة
؛ يمكن اعتبارها عملية إعداد تبدأ تلقائيًا بين عمليات تنفيذ البرنامج.
طريقة RINIT النموذجية هي كما يلي:
PHP_RINIT_FUNCTION(extension_name) {
/* تهيئة متغيرات الجلسة وملء المتغيرات مسبقًا وإعادة تعريف المتغيرات العامة وما إلى ذلك */
}
الخطوة الأولى لإيقاف تشغيل PHP
هي نفسها عند بدء تشغيل PHP. وينقسم إيقاف تشغيل PHP أيضًا إلى خطوتين:
بمجرد تنفيذ الصفحة (سواء وصلت إلى نهاية الملف أو تم إنهاؤها باستخدام وظيفة الخروج أو الموت)، ستبدأ PHP. عملية التنظيف. سوف يستدعي أسلوب RSHUTDOWN لكل وحدة بالتسلسل.
يتم استخدام RSHUTDOWN لمسح جدول الرموز الذي تم إنشاؤه عند تشغيل البرنامج، أي لاستدعاء الدالة غير المحددة على كل متغير.
طريقة RSHUTDOWN النموذجية هي كما يلي:
PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* قم بإدارة الذاكرة، وقم بإلغاء تعيين كافة المتغيرات المستخدمة في آخر استدعاء PHP وما إلى ذلك */
}
الخطوة الثانية من إيقاف تشغيل PHP
، تمت معالجة جميع الطلبات وأصبح SAPI جاهزًا للإيقاف. تبدأ PHP في تنفيذ الخطوة الثانية:
تستدعي PHP الأسلوب MSHUTDOWN لكل ملحق، وهذه هي الفرصة الأخيرة لكل وحدة لتحرير الذاكرة.
طريقة RSHUTDOWN النموذجية هي كما يلي:
PHP_MSHUTDOWN_FUNCTION(extension_name) {
/* معالجات مجانية وذاكرة ثابتة وما إلى ذلك */
}
بهذه الطريقة، تنتهي دورة حياة PHP بأكملها. تجدر الإشارة إلى أن "بدء الخطوة الأولى" و"إغلاق الخطوة الثانية" لن يتم تنفيذهما إلا في حالة عدم وجود طلب من الخادم.