เกี่ยวกับประสิทธิภาพการดำเนินการของ PHP มีบทความพิเศษมากมายบนอินเทอร์เน็ต ซึ่งส่วนใหญ่เป็นการถกเถียงกันระหว่างค่าย PHP และ Java ลักษณะการใช้งานที่แตกต่างกันและสภาพแวดล้อมการดำเนินการที่แตกต่างกันจะนำไปสู่ความแตกต่างในด้านประสิทธิภาพที่มากขึ้น แอปพลิเคชัน "ขนาดใหญ่" ที่กล่าวถึงในที่นี้ไม่ได้หมายถึงการใช้งานเว็บไซต์ขนาดใหญ่โดยเฉพาะ เช่น Google, eBay และ Yahoo ฉันเพียงหวังว่าระบบของคุณจะทำงานได้เร็วขึ้นและราบรื่นยิ่งขึ้น และหวังว่าจะสามารถโฮสต์ผู้ใช้ออนไลน์ได้มากขึ้น สามารถให้ความช่วยเหลือ PHP ได้เล็กน้อยสำหรับผู้เริ่มต้น
แอปพลิเคชัน "ขนาดใหญ่" ที่กล่าวถึงในที่นี้ไม่ได้หมายถึงการใช้งานเว็บไซต์ขนาดใหญ่โดยเฉพาะ เช่น Google, eBay และ Yahoo ฉันไม่ได้ตั้งใจที่จะชักชวนผู้อ่านให้ละทิ้งแนวคิดและความเชื่อของตน ฉันแค่หวังว่าระบบของทุกคนจะทำงานได้เร็วขึ้น และราบรื่นยิ่งขึ้น มันสามารถโฮสต์ผู้ใช้ออนไลน์ได้มากขึ้น และฉันหวังว่ามันจะสามารถช่วยผู้เริ่มต้น PHP ได้
เกี่ยวกับประสิทธิภาพการดำเนินการของ PHP มีบทความพิเศษมากมายบนอินเทอร์เน็ต ส่วนใหญ่เริ่มต้นด้วยการถกเถียงกันระหว่างค่าย PHP และ Java และจบลงด้วยความคาดหวังที่ไม่แน่นอน อันที่จริงประสิทธิภาพในการดำเนินการของโปรแกรมนั้นยากต่อการเปรียบเทียบ ลักษณะการใช้งานที่แตกต่างกันและสภาพแวดล้อมการดำเนินการที่แตกต่างกันจะนำไปสู่ประสิทธิภาพที่แตกต่างกันมากขึ้น และต้องชั่งน้ำหนักประสิทธิภาพด้วย ทุกคนรู้ดีว่าภาษา Assembly อยู่ในระดับต่ำมากและสามารถเขียนโปรแกรมที่มีประสิทธิภาพได้มาก อย่างไรก็ตาม ฉันไม่ค่อยเห็นใครใช้ Assembly ในการพัฒนาเว็บและมีความสามารถในการเขียนโปรแกรมใน Assembly โปรแกรมเมอร์ที่มีประสิทธิภาพดูเหมือนจะคู่ควรแก่การเคารพของทุกคน ฮ่าๆ~ เราไม่จำเป็นต้องพูดถึงความแตกต่างระหว่าง PHP และ Assembly ตราบใดที่เรารู้ความแตกต่างระหว่าง PHP ของเราเองกับ PHP ของคนอื่น
ก่อนอื่น เรามาทำความเข้าใจกับแนวคิดของบทความนี้ให้ชัดเจน: ต้องมีเซิร์ฟเวอร์อย่างน้อย 1 เซิร์ฟเวอร์ที่สามารถควบคุมได้ด้วยตัวเอง ไม่ใช่พื้นที่โฮสต์เสมือน ท้ายที่สุดแล้ว มีผลงานคลาสสิกและเฟรมเวิร์กที่สมบูรณ์มากมายสำหรับระบบอเนกประสงค์ที่สามารถทำงานบนโฮสต์เสมือนได้ การทำเหมืองอย่างมีประสิทธิภาพนั้นทำได้ดีมากจากรุ่นก่อน ๆ แนวคิดหลายอย่างก็ได้รับการสืบทอดและพัฒนาโดยผู้ใช้ PHP ในปัจจุบันจำนวนมาก ยิ่งเรียกว่า "กรอบ" มากขึ้นเรื่อยๆ ก็เหมือนดวงดาวบนท้องฟ้า ไม่อยากเขียนถึงมันแล้ว เพราะประการแรก ระดับของตัวเองไม่ดีนักก็เขียนอะไรไม่ได้เลย ใหม่และแม้ว่าฉันจะเขียนมัน มันจะทำให้ผู้คนหัวเราะ ประการที่สอง มีบทความที่เขียนเกี่ยวกับเรื่องนี้มากเกินไป และมีความคิดเห็นมากเกินไป ความสับสนเป็นสาเหตุที่ใหญ่ที่สุดที่ทำให้โปรแกรมเมอร์อัจฉริยะในอนาคตหลายคนเสียชีวิต
มีความแตกต่างอย่างมากในการเพิ่มประสิทธิภาพระหว่างโปรแกรมที่รันบนเซิร์ฟเวอร์เฉพาะกับโปรแกรมที่สามารถรันบนโฮสต์เสมือนได้ แน่นอน คุณสามารถติดตั้งชุด discuz บนเซิร์ฟเวอร์อิสระหนึ่งหรือหลายเซิร์ฟเวอร์โดยไม่ต้องดัดแปลง แต่มันได้รับการเพิ่มประสิทธิภาพสูงสุดจริง ๆ หรือไม่?
เซิร์ฟเวอร์อิสระหมายความว่าผู้ใช้สามารถควบคุมเครื่องได้อย่างสมบูรณ์ รวมถึงการติดตั้งและการลบซอฟต์แวร์ การกำหนดค่าพารามิเตอร์ของระบบ และแม้แต่การแก้ไขซอร์สโค้ด ด้วยแพลตฟอร์มฮาร์ดแวร์แบบเปิด ประสิทธิภาพไม่เพียงแต่สะท้อนถึงความเร็วเท่านั้น แต่ยังรวมถึงความปลอดภัย ความเสถียร และอื่นๆ ด้วย ต่างจากโฮสต์เสมือนตรงที่ผู้ใช้จะต้องกำหนดค่าพารามิเตอร์ของเว็บเซิร์ฟเวอร์ ติดตั้งและกำหนดค่า PHP ฐานข้อมูล และติดตั้งสิ่งที่ยุ่งเหยิงทุกประเภท (อย่างที่ฉันชอบพูด) ด้วยตัวเอง และแน่นอนว่าพวกเขาจะต้องรับผิดชอบมัน
ก่อนอื่น เรามาเสนอคำศัพท์สองสามคำ: เวลาดำเนินการ, เทมเพลต, การห่อหุ้มฐานข้อมูล, แคช, บัฟเฟอร์, แฮช, เดมอน และ crontab
ทุกคนรู้ดีว่าเวลาดำเนินการคือเวลาที่ใช้ในการรันโปรแกรมตั้งแต่ต้นจนจบ เนื่องจากเว็บเป็นแบบชั่วคราวและไม่มีสถานะ เวลาดำเนินการจึงเป็นตัวบ่งชี้ประสิทธิภาพการทำงานของโปรแกรมเว็บ จึงไม่เหมาะสำหรับการวัดโปรแกรม C/S หรือโปรแกรมแบ็คกราวน์เดมอน เนื่องจากหลายโปรแกรมทำงานอย่างต่อเนื่อง ตัวอย่างทั่วไปของเวลาดำเนินการหน้าคือเวลาที่แสดงที่ด้านล่างของหน้าฟอรั่ม Discuz โดยปกติ Discuz จะมีตั้งแต่สองสามมิลลิวินาทีถึงสิบมิลลิวินาที ขึ้นอยู่กับแพลตฟอร์มที่ใช้ ปริมาณข้อมูล และความกดดันของระบบในปัจจุบัน
ทุกคนคุ้นเคยกับเทมเพลต แม้ว่าหลายๆ คนจะใช้เทมเพลตเหล่านี้ แต่พวกเขาไม่รู้ว่าทำไมจึงใช้เทมเพลตเหล่านี้ เทมเพลตเป็นวิธีการแบ่งเลเยอร์แบบลอจิคัลแบบดั้งเดิม ในโครงสร้างด้านบน MVC จะแยกเลเยอร์การนำเสนอออกจากชั้นล่าง ในการใช้งานจริง จะอำนวยความสะดวกในการแบ่งงานระหว่างโปรแกรมเมอร์และผู้ออกแบบอินเทอร์เฟซ อย่างไรก็ตาม ในหลายกรณีตอนนี้ เนื่องจากการใช้เทมเพลตอย่างไม่เหมาะสม แทนที่จะส่งเสริมการแบ่งงานและความร่วมมือระหว่างโปรแกรมเมอร์และนักออกแบบอินเทอร์เฟซ มันจึงกลายเป็นต้นเหตุหลักของความเกลียดชังร่วมกันระหว่างโปรแกรมเมอร์และศิลปิน (ฉันคิดว่าฉันพูดแบบนี้ใน โพสต์ก่อนหน้า) หลายคนบ่นว่าต้องใช้เวลามากในการจัดระเบียบเทมเพลต
การห่อหุ้มฐานข้อมูลดูเหมือนจะเกี่ยวข้องกับ Java มากกว่า โดยจัดให้มีอินเทอร์เฟซการโทรแบบครบวงจรสำหรับระบบฐานข้อมูลต่างๆ ซึ่งโดยปกติแล้วคลาสที่ห่อหุ้มบางคลาสเหล่านี้บางครั้งยังทำงานบางอย่างให้เสร็จสิ้น เช่น การตรวจสอบ SQL การกรอง เป็นต้น บรรจุภัณฑ์ DB, PEAR DB, Adodb ฯลฯ ใน PHPLIB ล้วนแต่มีชื่อเสียงและใช้งานโดยคนจำนวนมาก
ดูเหมือนว่าแคชและบัฟเฟอร์จะเป็นสิ่งเดียวกัน แคชเรียกว่าแคช และบัฟเฟอร์เรียกว่าการบัฟเฟอร์ ในแนวคิดด้านฮาร์ดแวร์ จุดประสงค์ของแคชคือเพื่อเชื่อมต่ออุปกรณ์สองตัวที่มีความเร็วต่างกัน เช่น รีจิสเตอร์และหน่วยความจำ, CPU และ PCI-Bus, บัส IDE และฮาร์ดดิสก์ ความหมายดั้งเดิมของบัฟเฟอร์คือบัฟเฟอร์ที่มีลักษณะคล้ายสปริง ซึ่งใช้เพื่อลดหรือดูดซับแรงกระแทก บัฟเฟอร์เป็นวิธีการเข้าถึงข้อมูลล่วงหน้าซึ่งใช้ในการจัดเก็บข้อมูลชั่วคราวและส่งด้วยความเร็วที่แตกต่างจากความเร็วในการรับ วิธีการอัพเดตบัฟเฟอร์สามารถรีเฟรชได้โดยอัตโนมัติตามช่วงเวลา ในขณะที่แคชให้ความสำคัญกับ "อัตราการเข้าชม" มากขึ้นและนำข้อมูลจำนวนเล็กน้อยที่ใช้บ่อยในช่วงเวลาปัจจุบันไปไว้ในอุปกรณ์ความเร็วสูงเพื่อให้อ่านง่าย และการเขียน ในการพัฒนาโปรแกรม แม้ว่าจะไม่มีอุปกรณ์ความเร็วสูงหรือความเร็วต่ำ แต่แหล่งข้อมูลก็มีประสิทธิภาพการอ่านและการเขียนที่แตกต่างกัน สำหรับข้อมูลจำนวนเล็กน้อย การอ่านและเขียนไฟล์ข้อความมักจะมีประสิทธิภาพมากกว่าการเข้าถึงฐานข้อมูล และประสิทธิภาพในการอ่านและเขียนไฟล์ข้อความเดียวกันบน tmpfs นั้นดีกว่าประสิทธิภาพ IO ของดิสก์โดยตรง บัฟเฟอร์จะสะท้อนให้เห็นมากขึ้นในการสื่อสารกระบวนการและคิว ในหลายกรณี ไม่ใช่เพราะผู้รับไม่สามารถอ่านได้เร็วขึ้น แต่เป็นเพราะไม่จำเป็นต้องอ่านเร็วขึ้น
กระบวนการ daemon คือโปรแกรมที่ถูกดำเนินการอย่างต่อเนื่องในเบื้องหลัง โดยปกติจะมีบทบาทในการเฝ้าติดตาม ควบคุมกระบวนการ และให้บริการภายนอก ตัวอย่างเช่น สามารถเข้าใจ Apache เองได้ว่าเป็นกระบวนการ daemon แม้ว่าจริงๆ แล้วมันจะประกอบด้วยกระบวนการต่างๆ มากมายที่ได้รับการอัปเดตบ่อยครั้ง (กระบวนการหลักได้รับการแก้ไขแล้ว)
Crontab เป็นโปรแกรมตามกำหนดเวลาของ UNIX/Linux ซึ่งคล้ายกับ "งานตามกำหนดเวลา" ของ Windows โดยจะกำหนดช่วงเวลาหรือจุดเวลาที่แน่นอนเพื่อรันโปรแกรมเฉพาะ โดยปกติจะใช้เพื่อทำการอัปเดตอัตโนมัติ ล้างข้อมูลชั่วคราว และการดำเนินการอื่นๆ ที่ทำโดยอัตโนมัติในช่วงเวลาหนึ่ง
แนวคิดพิเศษอีกประการหนึ่ง (โดยเฉพาะสำหรับผู้ที่คุ้นเคยกับการพัฒนาระบบทั่วไป) คือหลังจากที่เรามีเซิร์ฟเวอร์อิสระแล้ว ก็ไม่จำเป็นต้องจำกัดตัวเองอยู่เพียงฟังก์ชันที่ PHP สามารถให้ได้ เมื่อเรากลายเป็นเจ้าแห่งระบบโดยไม่รู้ตัว ต้องทำงานอย่างหนักเพื่อที่จะตระหนักถึงสิ่งนี้ มีหลายสิ่งที่เราสามารถใช้ได้ PHP ไม่ได้มีอำนาจทุกอย่าง (แน่นอนว่าเป็นเช่นนั้น) และข้อบกพร่องด้านการทำงานของมันสามารถชดเชยได้อย่างสมบูรณ์โดย Perl ในฐานะภาษาทั่วไป Perl สามารถให้ตัวเลือกการทำงานได้มากกว่า และโมดูลของมันก็หนาแน่นพอ ๆ กับภาษาที่ไม่เป็นทางการและในทางที่ผิด พลังงาน. สำหรับข้อบกพร่องด้านประสิทธิภาพของ PHP สามารถใช้ C เพื่อชดเชยได้ รากฐานของ PHP นั้นสืบทอดมาจากภาษา C นอกจากนี้ PHP เองก็ได้รับการพัฒนาโดย C เช่นกัน ดังนั้นจึงสมเหตุสมผลอย่างยิ่งที่จะใช้ C เพื่อขยาย PHP
Linux เองได้รับการสนับสนุนโดย C และ Perl (ฉันบอกว่านี่จะไม่พูดเกินจริงสถานะของ Perl คุณสามารถดูได้ว่ามีสคริปต์ Perl จำนวนเท่าใดใน Linux มาตรฐานและดูว่าระบบรู้สึกเหมือนเป็นคนพิการที่ไม่มี Perl หรือไม่) PHP สืบทอดไวยากรณ์ส่วนใหญ่มาจากภาษา C และเรียนรู้คุณลักษณะเว็บ ฟังก์ชัน และสัญลักษณ์ "$" ส่วนใหญ่ซึ่งดูเหมือนจะขัดแย้งกับโอเพ่นซอร์สจาก Perl (PHP เป็นสคริปต์ Perl ในสมัยแรกๆ)
มาวิเคราะห์โค้ดบางส่วนที่ฉันใช้ (หมายเหตุ: ใช้ได้กับเซิร์ฟเวอร์สแตนด์อโลน Linux ดูเหมือนว่าฉันจะยอมแพ้กับการพัฒนาขนาดใหญ่สำหรับ Windows และโฮสต์เสมือนมาเป็นเวลานาน) โดยใช้วิธีการบางอย่างที่อาจคุ้นเคย ไม่คุ้นเคย หรือผิดปกติ ระบบของฉันคือ RedHat AS3 ไม่มีอะไรพิเศษ เวอร์ชัน PHP คือ 4.4.0, MySQL คือ 4.1 ฉันไม่เคยตั้งใจเขียนโค้ดที่ต้องใช้คุณสมบัติใหม่ของ PHP5 เว้นแต่จะมีความจำเป็นจริงๆ
ไดเร็กทอรีรูทเว็บของฉันอยู่ภายใต้ /www. Apache และ PHP ได้รับการติดตั้งภายใต้ /usr/local/ ตามค่าเริ่มต้น MySQL เป็นเวอร์ชันไบนารีที่ดาวน์โหลดและคอมไพล์แล้ว และฉันก็ทิ้งมันไว้ที่นั่นด้วย เนื่องจากเป็นเพียงการทดสอบ ฉันไม่อยากให้มันดูยุ่งเหยิง สำหรับโปรเจ็กต์จริง โดยเฉพาะอย่างยิ่งในกรณีของเซิร์ฟเวอร์หลายเครื่อง คุณต้องปรับใช้ระบบของคุณให้ดี
เพื่อให้โครงสร้างระบบชัดเจนขึ้น ฉันจึงใส่ไฟล์ทั้งหมดที่ฉันต้องการใช้ในไดเร็กทอรีรอง
ต่อไปนี้เป็นตัวอย่างบางส่วนจากไฟล์ส่วนหัวทั่วไป /includes/kernel/common.inc.php:
﹤?php
ถ้า (!กำหนด('IN_BSG')) {
ออก;
-
?
โค้ดด้านบนช่วยให้แน่ใจว่าสามารถเรียกได้โดยโปรแกรมกฎหมายเท่านั้น และจะไม่รวมอยู่ในไฟล์อื่น หากโปรแกรมที่รันไม่ได้กำหนดค่าคงที่ 'IN_BSG' โปรแกรมจะยุติลงหลังจากรวม common.inc.php นี้
﹤?php
list($usec, $sec) = explode(" ", microtime());
$page_time_start = $usec + $วินาที;
?
ทุกคนอาจคุ้นเคยกับสองบรรทัดนี้ซึ่งใช้ในการคำนวณเวลาเริ่มต้นการดำเนินการของโปรแกรม ก่อนที่โปรแกรมจะสิ้นสุด จะมีการคำนวณอีกครั้งเพื่อดูเวลาที่ใช้ในการรันโปรแกรม หากคุณไม่สนใจเรื่องนี้ คุณสามารถแสดงความคิดเห็นได้อย่างปลอดภัย