บทความนี้จะอธิบายรายละเอียดเกี่ยวกับกลไกการทำงานพื้นฐานของ PHP รวมถึงการทำงานของเนื้อหา PHP และอธิบายวงจรชีวิตทั้งหมดของ PHP ตั้งแต่เริ่มต้นจนถึงสิ้นสุดพร้อมตัวอย่าง
บทนำ
เราไม่เคยเริ่มกระบวนการที่เกี่ยวข้องกับ PHP ด้วยตนเอง มันทำงานพร้อมกับการเริ่มต้นของ Apache; PHP เชื่อมต่อกับ Apache ผ่านโมดูล mod_php5.so (โดยเฉพาะ SAPI ซึ่งเป็นอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันเซิร์ฟเวอร์
) เคอร์เนล เอ็นจิ้น Zend และเลเยอร์ส่วนขยาย เคอร์เนล PHP ใช้เพื่อจัดการคำขอ สตรีมไฟล์ การจัดการข้อผิดพลาด และการดำเนินการอื่น ๆ ที่เกี่ยวข้อง เอ็นจิ้น Zend (ZE) ใช้เพื่อแปลงไฟล์ต้นฉบับเป็นภาษาเครื่องแล้วรันบนเครื่องเสมือน เลเยอร์ส่วนขยายคือชุดของฟังก์ชัน ไลบรารี และสตรีมที่ PHP ใช้เพื่อดำเนินการเฉพาะ ตัวอย่างเช่น เราต้องการส่วนขยาย mysql เพื่อเชื่อมต่อกับฐานข้อมูล MySQL เมื่อ ZE รันโปรแกรม อาจจำเป็นต้องเชื่อมต่อกับส่วนขยายหลายรายการ ในเวลานี้ ZE มอบการควบคุมให้กับส่วนขยายและส่งคืนหลังจากประมวลผลงานเฉพาะ ;
ในที่สุด ZE จะส่งคืนผลลัพธ์ที่รันอยู่ให้กับโปรแกรมไปยังเคอร์เนล PHP ซึ่งจะส่งผลไปยังเลเยอร์ SAPI และส่งออกผลลัพธ์ไปยังเบราว์เซอร์ในที่สุด
มันไม่ง่ายเลยที่จะเจาะลึกถึง
ผลงานภายในของความเป็นจริง กระบวนการข้างต้นเป็นเพียงเวอร์ชันที่เรียบง่าย มาเจาะลึกลงไปอีกหน่อยเพื่อดูว่ามีอะไรอีกบ้างเบื้องหลัง
◆หลังจาก Apache เริ่มทำงาน ล่าม PHP ก็จะเริ่มทำงานเช่นกัน
◆กระบวนการเริ่มต้นของ PHP มีสองขั้นตอน:
ขั้นตอนแรกคือการเริ่มต้นตัวแปรสภาพแวดล้อมบางอย่าง ซึ่งจะมีผลตลอดวงจรชีวิตของ SAPI
ขั้นตอนที่สองคือการสร้างการตั้งค่าตัวแปรบางอย่างที่เฉพาะเจาะจงกับคำขอปัจจุบันเท่านั้น
ขั้นตอนแรก
และขั้นตอนที่สองคืออะไร? ไม่ต้องกังวล เราจะหารือเรื่องนี้โดยละเอียดต่อไป มาดูขั้นตอนแรกและขั้นตอนที่สำคัญที่สุดก่อน สิ่งที่ต้องจำไว้คือขั้นตอนแรกของการดำเนินการจะเกิดขึ้นก่อนที่คำขอใดๆ จะมาถึง
หลังจากเริ่ม Apache แล้ว ล่าม PHP ก็เริ่มทำงานเช่นกัน
PHP เรียกเมธอด MINIT ของแต่ละส่วนขยาย ดังนั้นจึงเปลี่ยนส่วนขยายเหล่านี้เป็นสถานะที่พร้อมใช้งาน ดูว่าส่วนขยายใดบ้างที่เปิดในไฟล์ php.ini MINIT หมายถึง "การเริ่มต้นโมดูล" แต่ละโมดูลจะกำหนดชุดของฟังก์ชัน ไลบรารีคลาส ฯลฯ เพื่อจัดการกับคำขออื่นๆ
วิธีการ MINIT ทั่วไปจะเป็นดังนี้:
PHP_MINIT_FUNCTION(extension_name){
/* เริ่มต้นฟังก์ชัน, คลาส ฯลฯ */
-
PHP เริ่มต้นขั้นตอนที่สอง
เมื่อมีการร้องขอเพจเกิดขึ้น เลเยอร์ SAPI จะส่งมอบการควบคุมให้กับเลเยอร์ PHP ดังนั้น PHP จึงตั้งค่าตัวแปรสภาพแวดล้อมที่จำเป็นในการตอบกลับคำขอนี้ ขณะเดียวกันก็ยังสร้างตารางตัวแปรเพื่อจัดเก็บชื่อตัวแปรและค่าที่สร้างขึ้นระหว่างการดำเนินการ
PHP เรียกเมธอด RINIT ของแต่ละโมดูล ซึ่งก็คือ "การร้องขอการเริ่มต้น" ตัวอย่างคลาสสิกคือ RINIT ของโมดูล Session หากเปิดใช้งานโมดูล Session ใน php.ini ตัวแปร $_SESSION จะถูกเตรียมใช้งานและเนื้อหาที่เกี่ยวข้องจะถูกอ่านเมื่อมีการเรียกใช้เมธอด
RINIT ถือเป็นกระบวนการเตรียมการที่เริ่มต้นโดยอัตโนมัติระหว่างการทำงานของโปรแกรม
วิธีการ RINIT ทั่วไปจะเป็นดังนี้:
PHP_RINIT_FUNCTION(extension_name) {
/* เริ่มต้นตัวแปรเซสชัน, เติมตัวแปรล่วงหน้า, กำหนดตัวแปรโกลบอลใหม่ ฯลฯ */
-
ขั้นตอนแรกของการปิดระบบ PHP
นั้นเหมือนกับการเริ่มต้น PHP การปิดระบบ PHP ยังแบ่งออกเป็นสองขั้นตอน:
เมื่อเพจถูกดำเนินการ (ไม่ว่าจะถึงจุดสิ้นสุดของไฟล์หรือถูกยกเลิกด้วยฟังก์ชัน exit หรือ die) PHP จะเริ่มทำงาน กระบวนการทำความสะอาด มันจะเรียกเมธอด RSHUTDOWN ของแต่ละโมดูลตามลำดับ
RSHUTDOWN ใช้เพื่อล้างตารางสัญลักษณ์ที่สร้างขึ้นเมื่อโปรแกรมกำลังทำงาน กล่าวคือ เพื่อเรียกใช้ฟังก์ชันที่ไม่ได้ตั้งค่าในแต่ละตัวแปร
วิธีการ RSHUTDOWN ทั่วไปจะเป็นดังนี้:
PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* จัดการหน่วยความจำ, ยกเลิกการตั้งค่าตัวแปรทั้งหมดที่ใช้ในการเรียก PHP ครั้งล่าสุด ฯลฯ */
-
ขั้นตอนที่สองของการปิดระบบ PHP
คำขอทั้งหมดได้รับการประมวลผลแล้ว และ SAPI พร้อมที่จะปิดระบบแล้ว PHP เริ่มดำเนินการขั้นตอนที่สอง:
PHP เรียกใช้เมธอด MSHUTDOWN ของแต่ละส่วนขยาย นี่เป็นโอกาสสุดท้ายสำหรับแต่ละโมดูล เพื่อปลดปล่อยความทรงจำ
วิธีการ RSHUTDOWN ทั่วไปจะเป็นดังนี้:
PHP_MSHUTDOWN_FUNCTION(extension_name) {
/* ตัวจัดการฟรีและหน่วยความจำถาวร ฯลฯ */
-
ด้วยวิธีนี้ วงจรชีวิตของ PHP ทั้งหมดจึงสิ้นสุดลง ควรสังเกตว่า "การเริ่มต้นขั้นตอนแรก" และ "การปิดขั้นตอนที่สอง" จะถูกดำเนินการเมื่อไม่มีการร้องขอจากเซิร์ฟเวอร์เท่านั้น