เอ็นจิ้น
Smarty - PHP
จาก
: cjjer ทำการเปลี่ยนแปลงบางอย่าง
เพื่อใช้ PHP เพื่อใช้เลเยอร์ลอจิกและเลเยอร์การนำเสนอของโมเดลการพัฒนา MVC มีเอ็นจิ้นเทมเพลตหลากหลายให้เลือก แต่หลังจากเกิด ของเครื่องยนต์อย่างเป็นทางการ SMARTY ทางเลือกมีการเปลี่ยนแปลง แนวคิดและการนำไปปฏิบัติค่อนข้างล้ำสมัย บทความนี้จะกล่าวถึงคุณลักษณะต่างๆ ของ SMARTY เป็นหลักเมื่อเปรียบเทียบกับเอ็นจิ้นเทมเพลตอื่นๆ แนะนำการติดตั้งและการใช้งานเอ็นจิ้นโดยย่อ และใช้กรณีทดสอบขนาดเล็กเพื่อเปรียบเทียบความเร็วและความง่ายในการใช้งานของ SMARTY และ PHPLIBtemplate
1. MVC ต้องใช้เทมเพลต
MVC ได้รับการสรุปเป็นครั้งแรกในระหว่างกระบวนการพัฒนาภาษา SmallTalk MVC แสดงถึงโมเดล มุมมอง และการควบคุมตามลำดับ โครงการ ในการพัฒนาแอปพลิเคชันเครือข่าย สามารถใช้ไดอะแกรมต่อไปนี้เพื่อแสดงความสัมพันธ์ระหว่างแนวคิด
รูปนี้แสดงแอปพลิเคชันเว็บแบบง่าย ข้อมูลที่ผู้ใช้เห็นบนเบราว์เซอร์คือเนื้อหาบนเซิร์ฟเวอร์ฐานข้อมูล แต่แอปพลิเคชันเซิร์ฟเวอร์เคยประมวลผลมาก่อน นักพัฒนามีหน้าที่รับผิดชอบในการสร้างโครงสร้างข้อมูล ตรรกะในการประมวลผลข้อมูล และวิธีการแสดงข้อมูล
เมื่อ CGI ได้รับความนิยมในประเทศจีนในปี 1996 โปรแกรมเมอร์เว็บยุคแรกๆ ล้วนเรียนรู้ด้วยตนเองจาก HTML ไม่ใช่เรื่องยากในการพิมพ์บรรทัด HTML ใน PERL อย่างไรก็ตาม เมื่อความเร็วเครือข่ายเพิ่มขึ้นทีละขั้นตอน ขนาดหน้าก็เพิ่มขึ้นด้วย จากเดิมที่ 20 ถึง 30 K มันเพิ่มขึ้นเป็นสิบเท่า การเขียนโปรแกรม CGI ทำให้เกิดข้อกำหนดเร่งด่วน: เพื่อแยกซอร์สโค้ด PERL และ HTML ดังนั้นความก้าวหน้าทางสังคมจึงสะท้อนให้เห็นในการแบ่งงานภายในทีมพัฒนา เนื่องจากศิลปินและโปรแกรมเมอร์ไม่ค่อยคุ้นเคยกับงานของกันและกัน พวกเขาจึงจำเป็นต้องใช้ภาษาที่ตกลงกันในการสื่อสารระหว่างการทำงานร่วมกัน
ภาษานี้ไม่ใช่ภาษาแม่หรือภาษาอังกฤษของเรา คำนี้เรียกว่า เทมเพลต และตรรกะและการนำเสนอขึ้นอยู่กับภาษานั้น เป็นวิธีนิพจน์ที่รวมคุณลักษณะของ HTML และภาษาสคริปต์เข้าด้วยกัน ด้วยวิธีนี้ เลเยอร์การนำเสนอสามารถแสดงข้อมูลที่ประมวลผลโดยเลเยอร์ลอจิกในรูปแบบที่ผู้ใช้ต้องการ หากคุณมีประสบการณ์ในการพัฒนา MFC ภายใต้แพลตฟอร์ม Windows คุณจะคุ้นเคยกับการห่อหุ้ม Document/DocumentTemplate/View อย่างแน่นอน นี่เป็นตัวอย่าง MVC ทั่วไป สำหรับเว็บแอปพลิเคชัน โดยส่วนตัวแล้วฉันคิดว่า EJB/servlets/JSP ใน J2EE นั้นทรงพลังที่สุด และแน่นอนว่ามีโครงสร้างที่เรียบง่ายและสวยงาม การใช้งานที่รู้จักกันดีอีกอย่างหนึ่งคือ COM/DCOM+ASP ชุดค่าผสมนี้ถูกใช้โดยคนส่วนใหญ่ในประเทศของเรา
ด้วยการเปรียบเทียบการใช้งาน MVC หลายรายการในแอปพลิเคชัน WEB เราจะได้รับแนวคิดเกี่ยวกับเทมเพลต: ชุดของสคริปต์ที่แทรกลงใน HTML หรือสคริปต์ HTML ซึ่งเนื้อหาที่แทรกแสดงถึงการเปลี่ยนแปลงข้อมูลที่ ต่อไปนี้คือตัวอย่างไฟล์เทมเพลต หลังจากประมวลผลแล้ว เทมเพลตนี้จะแสดง Hello, world!
วิธีการประมวลผล$greetings
ถูกละไว้ในขณะนี้ และจะมีการหารือในภายหลังเพื่อการเปรียบเทียบ
2. เหตุใดจึงเลือก SMARTY
สำหรับ PHP มีเอ็นจิ้นเทมเพลตมากมายให้เลือก เช่น PHPLIB เทมเพลตแรกสุดและ Fasttemplate ที่กำลังเติบโต หลังจากอัปเกรดหลายครั้ง พวกมันก็ค่อนข้างเติบโตและมีเสถียรภาพ หากคุณพอใจกับเครื่องมือเทมเพลตที่คุณมีอยู่ในปัจจุบันมาก...โปรดอ่านต่อ ฉันเชื่อว่าในฐานะผู้ชื่นชอบซอฟต์แวร์ฟรีหรือนักพัฒนาที่แสวงหาประสิทธิภาพและความสง่างาม คำแนะนำ SMARTY ต่อไปนี้จะค่อนข้างน่าสนใจ
นอกเหนือจากอิทธิพลของความชอบส่วนตัวแล้ว ฉันมักจะใช้การใช้งานมาตรฐานอย่างเป็นทางการ เช่น Axis เอ็นจิ้น XML ของ APACHE ข้อดีคือคุณจะได้รับความเข้ากันได้ที่ดีที่สุด (เช่น ความเข้ากันได้ของ MFC รุ่นแรกๆ กับ Win3x นั้นดีกว่าเฟรมเวิร์กแอปพลิเคชันอื่นๆ และแน่นอนว่าตอนนี้ทุกเวอร์ชันมีความสมบูรณ์มาก) ก่อนที่ SMARTY จะออก ฉันเคยใช้ Integrated Template eXtension ใน PEAR เอ็นจิ้นนี้เกือบจะเข้ากันได้กับ PHPLIBtemplate และ Fasttemplate ตั้งแต่ไวยากรณ์ของเทมเพลตไปจนถึงการประมวลผลเทมเพลต เทมเพลตจะถูกอ่านในหน่วยความจำ จากนั้นฟังก์ชัน parse() จะถูกเรียกใช้เพื่อแทนที่แท็กที่กำหนดไว้ล่วงหน้าด้วยข้อมูล
มาดูกันว่า SMARTY ทำอย่างไร หลังจากได้รับคำขอแล้ว ให้พิจารณาว่ามีการร้องขอ url เป็นครั้งแรกหรือไม่ หากเป็นเช่นนั้น ให้คอมไพล์ไฟล์เทมเพลตที่จำเป็นสำหรับ url ลงในสคริปต์ php แล้วเปลี่ยนเส้นทาง หากไม่ใช่ แสดงว่าเทมเพลตของ url นั้นถูกร้องขอแล้ว คอมไพล์แล้ว ตรวจสอบ คุณสามารถเปลี่ยนเส้นทางได้ทันทีโดยไม่ต้องคอมไพล์ใหม่ เงื่อนไขการคอมไพล์ใหม่สามารถกำหนดเป็นกำหนดเวลาคงที่ได้
มันดูคุ้นเคยยังไงล่ะ? ลองคิดดูสิ──นี่ไม่ใช่หลักการของ JSP หรอกเหรอ! อันที่จริง การคอมไพล์ประเภทนี้ดูน่าทึ่งเมื่อใช้กับเอ็นจิ้นการเขียนสคริปต์แบบตีความ เช่น PHP แต่ถ้าคุณลองคิดดูให้ดี JVM จะไม่ตีความและดำเนินการ JAVA ด้วยใช่หรือไม่ ซึ่งหมายความว่าไม่มีสิ่งใดที่เป็นไปไม่ได้ มีเพียงสิ่งที่จินตนาการไม่ได้เท่านั้น
หลังจากที่เราได้พูดคุยเกี่ยวกับ JAVA แล้ว ผมขอแสดงความคิดเห็นเกี่ยวกับอนาคตของ PHP กันก่อน เว็บไซต์ PHP อย่างเป็นทางการประกาศว่าเวอร์ชัน PHP 5.0 จะเปิดตัวในปลายปี 2546 เวอร์ชันนี้มีคุณสมบัติใหม่มากมาย เช่น การจัดการข้อยกเว้น เนมสเปซ เชิงวัตถุมากขึ้น เป็นต้น เรียกได้ว่าใกล้จะถึง JAVA มากขึ้นแล้ว และ SMARTY ก็เป็นหนึ่งในฟีเจอร์ใหม่ที่ทำให้ PHP เหมาะสมกับการพัฒนาโครงการขนาดใหญ่และขนาดกลางมากขึ้น แต่ดูเหมือนว่าจะห่างไกลจากเหตุผลที่ฉันเลือกมันตั้งแต่แรกมากขึ้นเรื่อยๆ นั่นก็คือความยืดหยุ่นและความสะดวกในการใช้งาน แต่จากมุมมองของวงจรชีวิตของซอฟต์แวร์ PHP อยู่ในช่วงการเติบโต และข้อดีมีมากกว่าข้อเสียสำหรับนักพัฒนาที่จะมอบฟังก์ชันเพิ่มเติมให้กับมัน ด้วยความหวังว่ามันจะมีความสามารถในการใช้งานเชิงพาณิชย์ได้ ในฐานะผู้ใช้ PHP ตัวยง คุณไม่ต้องการให้ PHP ถูกกล่าวหาว่ามีความสามารถไม่เพียงพอเสมอไปใช่ไหม?
เหตุใดจึงเลือก SMARTY เพียงเพราะมันเหมือนกับ JSP มีเหตุผลที่ดีกว่าอย่างแน่นอน ประการแรก นอกเหนือจากค่าใช้จ่ายที่ค่อนข้างสูงในการคอมไพล์ครั้งแรก ตราบใดที่ไฟล์เทมเพลตไม่ได้รับการแก้ไข สคริปต์แคชที่คอมไพล์จะพร้อมใช้งานได้ตลอดเวลา ซึ่งช่วยประหยัดเวลาในการแยกวิเคราะห์ได้มาก ประการที่สอง SMARTY มี ไลบรารีฟังก์ชันที่หลากหลาย เช่น PHP คุณสามารถใช้งานได้โดยตรงตั้งแต่การนับคำไปจนถึงการเยื้องอัตโนมัติ การตัดข้อความ และนิพจน์ทั่วไป หากคุณรู้สึกว่ายังไม่เพียงพอ เช่น คุณต้องใช้ฟังก์ชันการแสดงเพจของชุดผลลัพธ์ข้อมูล SMARTY ยังมีความสามารถในการขยายที่แข็งแกร่ง ซึ่งสามารถขยายได้ผ่านปลั๊กอิน
ข้อเท็จจริงดังกว่าคำพูด ฉันออกแบบโปรแกรมทดสอบและเปรียบเทียบ SMARTY และ PHPLIBtemplate โดยพิจารณาจากปัจจัยสองประการคือความเร็วและความยากในการพัฒนา เหตุผลที่ฉันเลือก PHPLIBtemplate ก็คือในบทความของ Patrick เรื่อง "การเลือกเทมเพลตที่เหมาะสมที่สุดในโลก PHP" มีการเปรียบเทียบระหว่าง PHPLIB เทมเพลตและ Fasttemplate การแข่งขัน PHPLIBtemplate ได้รับชัยชนะอย่างมาก ซึ่งทำให้ SMARTY เป็นคู่ต่อสู้ที่ดี ก่อนการทดสอบ เรามาพูดถึงปัญหาที่ต้องให้ความสนใจในระหว่างกระบวนการติดตั้งกันดีกว่า
3. ปัญหาที่คุณอาจพบ
บนเว็บไซต์ทางการของ SMARTY มีคู่มือผู้ใช้โดยละเอียด และคุณสามารถเลือกเวอร์ชันออนไลน์ในรูปแบบ HTML และ PDF ได้ เราจะไม่ครอบคลุมเนื้อหาที่มีอยู่ในคู่มือนี้ แต่จะอธิบายปัญหาที่คุณอาจพบระหว่างการใช้งานครั้งแรกเท่านั้น
คำถามแรกร้ายแรงมาก: มันบอกว่าไม่พบไฟล์ที่ต้องการใช่ไหม ไม่ใช่ทุกคนที่เขียนแอปพลิเคชันตามโครงสร้างไดเร็กทอรีเริ่มต้นของ SMARTY จำเป็นต้องระบุด้วยตนเอง สมมติว่าโครงสร้างไดเร็กทอรีเป็นดังนี้:
คุณต้องระบุโครงสร้างไดเร็กทอรีใน index.php:
$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c/";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";
ปัญหาแรกได้รับการแก้ไขแล้ว และปัญหาที่สองก็มาถึง: เหตุใดจึงใช้เทมเพลตที่สวยงามที่ฉันเพิ่งสร้างด้วย Dreamweaver ไม่ได้ ไม่ใช่ว่ามีอะไรผิดปกติกับไฟล์เทมเพลต เนื่องจากตัวคั่นแท็กเริ่มต้นของ SMARTY คือ {} และน่าเสียดายที่ Javascript มีแท็กนี้อย่างแน่นอน โชคดีที่เราสามารถใช้อักขระใดก็ได้เป็นตัวคั่น บวกกับสองประโยคนี้:
$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";
ตอนนี้การติดตั้งเสร็จสมบูรณ์แล้ว ไม่มีปัญหา
4. คอนทราสต์และการเปรียบเทียบ
ขั้นแรก ให้คิดถึงการออกแบบการทดสอบ ปัจจัยตัดสินหลักคือความเร็วของหลักสูตร สำหรับการทดสอบความเร็วจะใช้ค่าเฉลี่ยเลขคณิต ทำซ้ำการสร้างเพจ N ครั้งบนเพจทดสอบ จากนั้นเปรียบเทียบเวลาการสร้างเพจทั้งหมด ปัจจัยสำคัญอีกประการหนึ่งคือความง่ายในการใช้งาน (สำหรับความสามารถในการขยาย ไม่จำเป็นต้องเปรียบเทียบผลลัพธ์) ดังนั้นเทมเพลตที่ใช้ต้องไม่เล็กเกินไป ฉันใช้หน้าโฮมเพจส่วนตัวของฉัน ซึ่งเป็นไฟล์ HTML ที่สร้างด้วย Firework+Dreamweaver ซึ่งมีขนาดประมาณ 7K การตั้งค่าตัวแปรยังใช้บล็อกที่ใช้บ่อยที่สุด ซึ่งเรียกว่าบล็อกในเทมเพลต PHPLIB และส่วนต่างๆ ใน SMARTY อย่าดูถูกความแตกต่างในเรื่องชื่อ เกณฑ์การใช้งานแบ่งออกเป็น 2 ส่วน คือ ไวยากรณ์ของไฟล์เทมเพลตและไฟล์สคริปต์มีความกระชับและใช้งานง่ายหรือไม่
มาดำดิ่งสู่การทดสอบกันดีกว่า ก่อนอื่น มาดูไวยากรณ์ของไฟล์เทมเพลตทั้งสองไฟล์กันก่อน: ด้านซ้ายของแถบสีน้ำเงินคือเทมเพลต PHPLIB และด้านขวาเป็นของ SMARTY ความชอบส่วนตัวนั้นแตกต่างกันไป ดังนั้นฉันจะไม่แสดงความคิดเห็นที่นี่ เน้นที่การเปรียบเทียบคำสั่งการประมวลผลในสคริปต์ ขั้นแรกให้ดูที่เทมเพลต PHPLIB:
$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows');
for ($j = 0; $j < 10; $j++){
$tpl->set_var('tag' ,"$j");
$tpl->parse('rows', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');
ต่อไปนี้คือ SMARTY:
$smart->assign('row',$row);
$smart->display('bigfile.htm');
SMARTY ใช้เพียงสองตัวแปร แท็ก และแถว ในขณะที่เทมเพลต PHPLIB มีตัวจัดการไฟล์เทมเพลตเพิ่มเติมและส่วนที่ไม่สามารถอธิบายได้ พูดตามตรง ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นเมื่อฉันเรียนรู้มันครั้งแรก ตอนนี้ก็ยังดูน่าอึดอัดใจอยู่ เหตุใด SMARTY จึงมีใบแจ้งยอดการดำเนินการน้อยนัก คำตอบก็คืองานจะเสร็จสิ้นโดยเครื่องยนต์ หากคุณต้องการเจาะลึกโปรแกรมต้นฉบับ คุณจะพบว่ามีฟังก์ชันชื่อ _compile_tag() ใน Smarty_compiler.class.php ซึ่งมีหน้าที่ในการแปลงแท็กส่วนให้เป็นคำสั่ง PHP นี่ไม่ใช่ป้ายกำกับทั่วไป แต่มีพารามิเตอร์และข้อมูลซึ่งช่วยประหยัดปริมาณงานในการเขียนโปรแกรมสคริปต์
ตอนนี้ถึงตาเราที่จะมุ่งเน้นไปที่ความเร็ว ท้ายที่สุดแล้ว สำหรับนักพัฒนาเว็บที่มีทักษะ มันเป็นเพียงเรื่องของเวลาที่จะเชี่ยวชาญเครื่องมือที่ยากที่สุด ไม่ต้องพูดถึงเครื่องมือเทมเพลต ซึ่งเป็นเทคโนโลยีที่มีช่วงการเรียนรู้ที่นุ่มนวล ความเร็วคืออายุการใช้งานของเว็บแอปพลิเคชัน โดยเฉพาะอย่างยิ่งเมื่อมีการใช้เทมเพลตเอ็นจิ้นบนไซต์ที่มีการเข้าชมพร้อมกันจำนวนมาก ซึ่งมีความสำคัญยิ่งกว่า ก่อนการทดสอบเริ่มต้น ฉันคิดว่าเทมเพลต PHPLIB จะชนะในด้านนี้เนื่องจากมีการอัพเกรดมาหลายครั้งและโดยพื้นฐานแล้วไม่มีข้อบกพร่อง ยิ่งกว่านั้น เอ็นจิ้นของ SMARTY นั้นใหญ่เกินไป ไม่เหมือนคู่ต่อสู้ที่มีเพียงสองไฟล์
ผลการทดสอบดังที่แสดงด้านล่าง เทมเพลต PHPLIB มีข้อได้เปรียบด้านความเร็ว 25%:
แต่มันจะไม่เป็นเช่นนี้เสมอไป ฉันกดรีเฟรชอีกครั้ง และครั้งนี้ฉันได้ผลลัพธ์ที่แตกต่างออกไป:
โดยพื้นฐานแล้ว PHPLIB ไม่มีการเปลี่ยนแปลง แต่ SMARTY ได้เพิ่มความเร็วขึ้น 25% รีเฟรชต่อไป แล้วคุณจะได้ผลลัพธ์คล้ายกับครั้งที่สอง: SMARTY เร็วกว่าเทมเพลต PHPLIB เกือบ 10% ฉันคิดว่านี่คือสาเหตุที่เวอร์ชันที่คอมไพล์เร็วกว่าเวอร์ชันที่ตีความ กลไก SMARTY นั้นมีขนาดใหญ่มากและจำเป็นต้องรวบรวมเทมเพลตเป็นไฟล์ php ดังนั้นความเร็วจึงไม่เร็วเท่ากับเทมเพลต PHPLIB ขนาดกะทัดรัดอย่างแน่นอน แต่นี่เป็นเพียงครั้งแรกเท่านั้น เมื่อได้รับคำขอเป็นครั้งที่สอง SMARTY พบว่ามีการรวบรวมเทมเพลตแล้ว จึงข้ามขั้นตอนที่ใช้เวลานานที่สุดไป และฝ่ายตรงข้ามต้องทำการค้นหาและแทนที่ทีละขั้นตอน นี่เป็นตัวอย่างคลาสสิกของ "การแลกเปลี่ยนพื้นที่กับเวลา" ที่กล่าวถึงในหลักการเรียบเรียง
5. Conclusion
สรุปคือถ้าหลงรัก SMARTY แล้วรออะไรล่ะ? แน่นอนว่านี่ไม่ได้หมายความว่ามันจะมีอำนาจทุกอย่าง เช่นเดียวกับเมื่อฉันใช้โมเดล MVC ในการเขียนเว็บไซต์ส่วนตัวของฉัน ไม่เพียงแต่จะไม่ลดภาระงานเท่านั้น แต่ฉันยังต้องกังวลเกี่ยวกับการเชื่อมโยงระหว่างระดับต่างๆ อีกด้วย
SMARTY ไม่เหมาะกับอะไร? ใช้ตัวอย่างคลาสสิกจากคู่มือ: เว็บไซต์พยากรณ์อากาศ อีกสิ่งหนึ่งที่อยู่ในใจ: ตลาดหุ้น การใช้ SMARTY บนเว็บไซต์ประเภทนี้จะไม่มีประสิทธิภาพเนื่องจากการคอมไพล์ซ้ำบ่อยครั้ง ดังนั้นเทมเพลต PHPLIB จึงเหมาะสมกว่า
บทความนี้ไม่ได้มีวัตถุประสงค์เพื่อเปรียบเทียบทั้งสองเครื่องยนต์ แต่เพื่อแสดงให้เห็นถึงข้อดีของ SMARTY สิ่งที่มีความหมายที่สุดเกี่ยวกับการใช้งานก็คือมันเป็นส่วนหนึ่งของระบบ PHP ใหม่ นอกเหนือจาก 2 ระบบหลักอย่าง .NET และ JAVA ONE แล้ว ยังมีตัวเลือกอื่นๆ สำหรับการพัฒนาเว็บไซต์ขนาดใหญ่และขนาดกลางอีกด้วย สำหรับโครงการ GNU ความสำคัญของมันไม่ต่างจากกองทัพของ Liu และ Deng ที่กระโดดเป็นระยะทางหลายพันไมล์เข้าไปในเทือกเขา Dabie
ผู้เขียน: หยู โปเซียง