Fork me on GitHub

ยินดีต้อนรับ

ยังมีเว็บไซต์จำนวนมากที่ได้สอนการใช้ PHP ซึ่งไม่ได้ปรับปรุงข้อมุลให้ทันสมัยตรงกับมาตรฐานปัจจุบัน ด้วยเหตุผลดังนี้ จึงทำให้ผู้เริ่มต้นเรียนรู้ภาษา PHP ได้นำความรู้ที่ไม่ได้มาตรฐาน นำมาใช้พัฒนาภาษา PHP ที่ไม่ถูกต้องและก่อให้เกิดโปรแกรมที่ไม่ปลอดภัยอีกด้วย PHP: The Right Way เป็นเว็บไซต์ที่อ่านง่าย และสามารถที่จะนำมาใช้เป็นมาตรฐานอ้างอิงในการพัฒนาภาษา PHP ได้อย่างดี นอกจากนี้ยังรวบรวมบทความจากเว็บไซต์ต่างๆ ที่ผู้ร่วมพัฒนาภาษา PHP ได้ยอมรับว่าเป็นมาตรฐานปัจจุบัน ซึ่งสามารถนำมาใช้งานได้จริง

การพัฒนาภาษา PHP นั้น ยังไม่ได้มีวิธีใดที่เป็นที่ยอมรับอย่างกว้างขวาง เว็บไซต์นี้มีจุดมุ่งหมายที่จะแนะนำ การพัฒนาภาษา PHP ให้แด่ผู้เริ่มต้นในหัวข้อบางหัวข้อที่เขาไม่สามารถอ้างอิงได้จากที่ไหน ก่อนที่จะสายเกินไป นอกจากนี้สำหรับผู้ที่ได้พัฒนาภาษา PHP มานานแล้ว อาจจะมีบางหัวข้อที่พวกเขาสามารถที่จะนำแนวคิดใหม่ๆ ไปปรับปรุงการพัฒนาภาษา PHP ในหัวข้อนั้นๆได้อีกด้วย เว็บไซต์นี้จะไม่บอกคุณในทุกเรื่องที่ไม่ได้สำคัญ อย่างเช่น ควรจะใช้เครื่องมือไหนดีเวลาพัฒนาภาษา PHP แต่เว็บไซต์นี้จะแนะนำทางเลือกหลายๆทาง พร้อมทั้งยกตัวอย่าง และเหตุผลในแต่และทางเลือกนั้นๆ

เว็บไซต์นี้จะได้รับการปรับปรุงอยู่ตลอดเวลา โดยจะคอยเพิ่มเติมข้อมูลใหม่ๆที่มีประโยชน์ และจะคอยเพิ่มเติมตัวอย่าง เพื่อที่สามารถที่จะนำมาใช้งานได้จริง

ภาษาต่างๆ

PHP: The Right Way ได้ (หรือจะได้) ถูกนำมาแปลเป็นภาษา:

ต้องการเป็นส่วนร่วม?

ช่วยพัฒนาเว็บไซต์นี้ให้เป็นเว็บไซต์มาตรฐาน ที่สามารถให้ผู้ที่ต้องการเรียนรู้ภาษา PHP นำมาใช้เป็นที่อ้างอิงได้! เป็นส่วนร่วมได้ใน GitHub

ช่วยกันบอกต่อ!

PHP: The Right Way มีเว็บแบนเนอร์ที่คุณสามารถนำไปแสดงในเว็บไซต์ของคุณได้ ถ้าคุณต้องการที่จะช่วยสนับสนุนเว็บไซต์นี้ และแนะนำให้นักพัฒนาภาษา PHP ที่ต้องการจะเรียนรู้ ได้รู้จักกับเว็บไซต์นี้ ซึ่งนำเสนอข้อมูลที่ได้รับมาตรฐานปัจจุบัน!

ไปดูเว็บแบนเนอร์

Back to Top{.top}

มาเริ่มต้นเรียนรู้กันเลย

ควรที่จะใช้ PHP รุ่นปัจจุบันที่เสถียร (5.5)

ถ้าคุณพึ่งเริ่มต้นเรียนรู้ภาษา PHP คุณควรที่จะเริ่มต้นด้วยการใช้รุ่นปัจจุบันที่เสถียรของ PHP 5.5 PHP ได้เพิ่มประสิทธิภาพ คุณสมบัติใหม่ มาไม่นานนี้เอง อย่าให้รุ่นที่แตกต่างเล็กน้อยอย่าง 5.2 และ 5.5 มาหลอกคุณได้ ตัวเลขที่แตกต่างกันนี้ได้แสดงให้เห็นถึงความแตกต่างอย่างชัดเจน ถ้าคุณต้องการหาฟังก์ชันหรือวิธีการใช้ฟังก์ชัน คุณสามารถที่จะหาได้ใน php.net เว็บไซต์นี้จะมีคำตอบมากมายในนั้น

PHP นั้นได้มี web server ในตัวเอง

คุณสามารถที่จะเริ่มต้นเรียนรู้ภาษา PHP ได้อย่างง่ายดาย โดยไม่จำเป็นที่จะต้องติดตั้ง web server (อย่างเช่น Apache) แต่คุณจะต้องใช้ PHP รุ่น 5.4 เป็นต้นไป วิธีที่จะเริ่ม PHP server ทำได้โดยพิมพ์คําสั่งตัวอย่างข้างล่างนี้ใน terminal ของคุณใน project folder ของคุณ

> php -S localhost:8000

การติดตั้งใน Mac

OSX ได้ติดตั้ง PHP มาเรียบร้อยแล้ว แต่จะไม่ได้เป็นรุ่นปัจจุบัน อาจจะเป็นรุ่นที่ล้าหลังนิดหน่อย อย่างเช่น Lion นั้นได้ติดตั้ง PHP รุ่น 5.3.6 และ Mountain Lion นั้นมากับ PHP รุ่น 5.3.10

วิธีการ update PHP ใน OSX นั้นสามารถที่ทำได้โดยการติดตั้งผ่าน package managers ของ Mac ด้วย php-osx by Liip เป็นวิธีที่แนะนำ

อีกทางเลือกหนึ่งคือการ compile PHP ด้วยตัวคุณเอง โดยวิธีนี้คุณจะต้องมี Xcode หรือ “Command Line Tools for Xcode” ที่จะสามารถนำมาใช่้แทน Xcode ได้ โปรแกรมเหล่านี้สามารถ download ได้จาก Apple’s Mac Developer Center

ถ้่าคุณต้องการวิธีที่ง่ายที่สุด คือ “all-in-one” แพคเกจที่รวบรวม PHP, Apache web server และ MySQL database และยังมี GUI ที่สามารถควบคุมแพคเกจ ได้อย่างง่ายดาย คุณสามารถ download ได้จาก MAMP

การติดตั้งบน Windows

PHP นั้นสามารถติดตั้งได้หลายวิธีบน Windows คุณสามารถ download ไบนารี และเมื่อไม่นานมานี้คุณสามารถใช้ ‘.msi’ ในการติดตั้ง แต่ว่าการใช้ ‘.msi’ ในการติดตั้งนั้นได้ถูกหยุดพัฒนาใน PHP รุ่น 5.3.0

สำหรับผู้ที่ต้องการเรียนรู้หรือพัฒนาโปรแกรมในเครื่องคอมพิวเตอร์ของคุณนั้น คุณสามารถที่จะใช้ PHP รุ่น 5.4+ ซึ่งได้มีความสามารถที่จะใช้ webserver CLI ได้ ดังนั้นคุณไม่จำเป็นที่จะต้องเรียนรู้วิธีการติดตั้ง webserver ถ้าคุณต้องการที่จะใช้ “all-in-one” แพคเกจที่รวบรวม webserver และ MySQL ไว้แล้วในตัว คุณสามารถใช้แพคเกจอย่างเช่น Web Platform Installer, Zend Server CE, XAMPP และ WAMP แพคเกจเหล่านี้จะช่วยให้คุณสามารถที่จะเริ่มต้นใช้ภาษา PHP ได้อย่างรวดเร็ว แต่คุณยังที่จะต้องระวังถึงความแตกต่างระหว่างสภาพแวดล้อม เวลาคุณต้องการที่จะนำโปรแกรมที่คุณพัฒนานั้นไปใช้งานจริง ยกตัวอย่างเช่น ถ้าคุณพัฒนาโปรแกรมบน Windows แต่คุณต้องนำโปรแกรมนั้นไปใช้งานจริงใน Linux คุณจะต้องระวังสิ่งเหล่านี้ด้วย

ถ้าคุณต้องการใช้โปรแกรมที่คุณพัฒนาบน Windows คุณจะต้องใช้ IIS7 ซี่ง IIS7 จะทำให้โปรแกรมของคุณนั้นทำงานได้อย่างทีประสิทธิภาพมากที่สุด คุณยังสามารถที่จะใช้ phpmanager (ปลั๊กอิน GUI สำหรับ IIS7) จะช่วยให้การดูแลระบบ PHP ของคุณอย่างง่ายดาย IIS7 นั้นได้รวม FastCGI มาเรียบร้อย คุณเพียงแค่ตั้งค่าให้ PHP นั้นเป็นตัวจัดการ คุณสามารถหาข้อมูลเพิ้มเติมได้จาก ข้อมูลสำหรับการใช้ IIS สำหรับ PHP ใน iis.net

Vagrant

การใช้โปรแกรมในสภาพแวดล้อมที่แตกต่างกันนั้นในช่วงเวลาพัฒนากับเวลานำไปใช้งานจริง จะสามารถก่อให้เกิดข้อบกพร้องที่แปลกไปเมื่อนำไปใช้งานจริง นอกจากนั้นการที่จะคอยเก็บข้อมูลที่แตกต่างกันระหว่างสภาพแวดล้อมสำหรับการพัฒนากับการที่ไปใช่้งานจริง ในแต่ละรุ่นของโปรแกรมของเรา และยังต้องคอยบันทีก libraries ต่างๆที่เราได้ใช้กันภายในทีมงานของผู้พัฒนาโปรแกรมในแต่ละรุ่นของโปรแกรมของเรา นับว่าจะเป็นอะไรที่ซับซ้อนอยู่

ถ้าคุณทำการพัฒนาโปรแกรมใน Windows และนำไปใช้งานจริงที่ Linux (หรืออะไรก็ตามที่ไม่ใช่ Windows) หรือถ้าคุณพัฒนาโปรแกรมอย่างเป็นทีมงาน คุณน่าจะลองใช้ virtual machine ในการพัฒนาโปรแกรมดู วิธีนี้อาจจะดูเหมือนว่ามีขั้นตอนที่ยุ่งยาก แต่ถ้าได้ลองใช้ Vagrant ในการติดตั้ง virtual machine คุณจะสามารถที่จะติดตั้ง virtual machine ได้อย่างง่ายได้โดยทำเพียงไม่กี่ขั้นตอน นอกจากนี้คุณยังสามารใช้ “provisioning” โปรแกรมอย่างเช่น Puppet หรือ Chef ติดตั้งให้คุณ provisioning นั้นเป็นสิ่งที่สามารถช่วยทำให้การดูแลระบบ ในการพัฒนาโปรแกรมนั้นง่ายมากขี้น เพราะโปรแกรมนี้จะคอยควบคุมการติดตั้ง virtual machine หรือ สิ่งแวดล้อมนั้นให้ได้รับการติดตั้งที่เหมือนกัน คุณจีงไม่ต้องมาคอยติดตั้งสิ่งแวดล้อมของคุณทุกครั้งที่เครื่องแม่มีการเปลี่ยนแปลง และไม่ต้องมาคอยรวบรวมข้อมูลวิธีการติดตั้งทุกครั้ง แม้กระทั้งเครื่อง แม่ของคุณได้ศูนย์เสียข้อมูลไป คุณก็สามารถที่จะติดตั้งเครื่องแม่ใหม่ได้อย่างง่ายดายโดยการใช้โปรแกรมเหล่านี้

Vagrant จะสร้างโฟลเดอร์ที่สามารถใช้ในการส่งผ่านข้อมูลระหว่างเครื่องของคุณกับ virtual machine ด้วย นั้นก็หมายความว่าคุณสามารถที่จะสร้างหรือ แก้ไขไฟล์ของคุณบนเครื่องของคุณและคุณก็สามารถที่จะเรียกใช้โปรแกรมของคุณได้ใน virtual machine เพื่อที่จะทดสอบโปรแกรมของคุณ

Back to Top{.top}

สไตล์ในการเขียนโปรแกรม

ชุมชนของผู้เขียนโปรแกรม PHP นั้นมีอยู่กว้างขวางและมีความหลากหลาย ประกอบไปด้วย libraries, framework และ components มันเป็นเรื่องปรกติที่ผู้พัฒนาโปรแกรม PHP จะนำเอาสิ่งต่างๆเหล่านี้มารวมกันใช้ในการพัฒนาโปรแกรมนั้นๆ มันเป็นสิ่งที่สำคัญหรือมาตรฐาน ในการพัฒนาสไตล์เพื่อใช้ในการสร้างหรือรวบรวมโปรแกรมต่างๆเข้ามาใช้รวมกันได้อย่างง่ายดายและไม่มีปัญหา

Framework Interop Group ได้เสนอและได้รับการอนุมัติสไตล์ต่างๆที่ได้รับการยอมรับอย่างกว้างขวาง อย่างเช่น PSR-0, PSR-1 และ PSR-2 อย่าได้สับสนในชื่อที่แปลกเหล่านี้ ชื่อสไตล์เหล่านี้เป็นที่ยอมรับและแนะนำที่ใช้กันอย่างกว้างขวาง ในโครงการใหญ่ๆอย่างเช่น Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, และอื่นๆอีกมากมาย คุณสามารถนำสไตล์เหล่านี้มาใช้ในโครงการของคุณได้ หรือคุณอยากที่จะใช้สไตล์ของคุณเองก็ย่อมได้

แต่จะเป็นสิ่งที่ดีกว่าถ้าคุณเขียนโปรแกรม PHP ในสไตล์ที่ได้รับการยอมรับว่าเป็นมาตรฐานของ PHP ซึ้งสไตล์เหล่านี้สามารถที่จะเกิดจากการ นำ PSR เหล่านี้มารวมกัน หรือสไตล์ที่ PEAR และ Zend ได้ใช้อยู่ ถ้าคุณใช้สไตล์มาตรฐานในการเขียน PHP นั้นจะทำให้นักพัฒนาโปรแกรมสามารถ ที่จะอ่านและเข้าใจโปรแกรมของคุณได้อย่างง่ายดาย โปรแกรมที่ใช้สไตล์มาตรฐานนั้นจะสามารถนำมาใช้ร่วมกับโปรแกรมอื่นได้อย่างไม่มีปัญหา

คุณสามารถที่จะใช้ PHP_CodeSniffer เพื่อที่จะใช้ในการตรวจสอบโปรแกรมของคุณกับสไตล์มาตรฐานเหล่านี้ นอกจากนี้ยังมีปลั๊กอินสำหรับ text editors อย่างเช่น Sublime Text 2 ที่สามารถที่จะตรวจสอบได้ในขณะที่คุณกำลังพิมพ์ PHP ได้อย่างทันที

ถ้าใช้ Fabien Potencier’s PHP Coding Standards Fixer เพื่อที่จะตรวจสอบไวยากรณ์ของโปรแกรมของคุณให้สอดคล้องกับ มาตรฐานเหล่านี้ เพื่อที่จะทำให้การทำงานของคุณง่ายดายขี้น

ภาษาอังกฤษเป็นภาษาหลักสำหรับตัวแปลต่างๆและโครงสร้างของโปรแกรม ข้อคิดเห็นนั้นสามารถที่จะเขียนในภาษาใดๆก็ได้ที่ทำให้ทางทีมงาน ของคุณและผู้ร่วมพัฒนาในอนาคต ที่จะสามารถเข้าใจโปรแกรมของคุณได้อย่างง่ายดาย

Back to Top{.top}

จุดเด่นของภาษา PHP

ต้นแบบอย่างของภาษา

PHP เป็นภาษาที่มีความยืดหยุนสูง, เป็นภาษาไดนามิกที่รองรับเทคนิคในการเขียนโปรแกรมทุกรูปแบบ PHP ได้รับการพัฒนาอย่างรวดเร็วในช่วงปีที่ผ่านมา โดยเฉพาะอย่างยิ่งได้เพิ่มเติมการเขียนโปรแกรมเชิงวัตถุที่ สมบูรณ์แบบใน PHP รุ่น 5.0 (2004) anonymous functions และ namespaces ใน PHP 5.3 (2009) และ traits ใน PHP 5.4 (2012)

การเขียนโปรแกรมเชิงวัตถุ

PHP ได้มีการรองรับการเขียนโปรแกรมเชิงวัตถุอย่างสมบูรณ์แบบ อย่างเช่น การใช้ classes, abstract classes, interfaces, inheritance, constructors, cloning, exceptions, และอื่นๆ

การเขียนโปรแกรมเชิงฟังก์ชั่น

PHP สนับสนุน first-class ฟังก์ชั่น หมายความว่า เราสามารถที่จะนำฟังก์ชั่นมากำหนดค่าให้แด่ตัวแปลได้ นั้นคือ เราสามารถนำฟังก์ชั่นที่ผู้ เขียนโปรแกรมสร้างขึ้น หรือฟังก์ชั่นที่มากับ PHP นำมาอ้างอิงจากตัวแปลหรือเรียกใช้แบบไดนามิกได้ ฟังก์ชั่นสามารถที่จะส่งผ่านได้ แบบอาร์กิวเมนต์ไปยังฟังก์ชั่นอื่นๆได้ (ความสามารถนี้เรียกว่า Higher-order ฟังก์ชั่น) และฟังก์ชั่นก็สามารถที่จะคืนค่าฟังก์ชั่นอื่นได้อีกด้วย

Recursion เป็นคุณลักษณะที่ฟังก์ชั่นสามารถที่จะเรียกฟังก์ชั่นของตัวเองได้ แต่ภาษา PHP จะมุ่งเน้นการใช้ iteration มากกว่า

anonymous ฟังก์ชั่น (ที่สนับสนุน closures) ที่มาใหม่นั้นได้ มีตั้งแต่ PHP รุ่น 5.3 (2009)

ใน PHP 5.4 ได้เพิ่มความสามารถในการใช้ closures ในขอบเขตของวัตถุและได้เพิ่มความสามารถให้กับ callables โดยสามารถที่จะนำมาใช้สลับ กับ anonymous ฟังก์ชั่น ได้เกือบทุกกรณี

เมทาโปรแกรมมิง

PHP สนับสนุนรูปแบบการเขียนเมทาโปรแกรมผ่านทางกลไกอย่าง Reflection API และ Magic Methods PHP ได้มี Magic Methods มากมาย อย่างเช่น __get(), __set(), __clone(), __toString(), __invoke() และอื่นๆ ที่สามารถช่วยให้นักพัฒนาโปรแกรมเขียน hook ในคลาสได้อย่างง่ายดาย นักพัฒนาภาษา Ruby ชอบบอกว่า PHP ขาดความสามารถ method_missing แต่แท้จริงแล้วมันคือ __call() และ __callStatic()

Namespaces

จากหัวข้อที่ได้กล่าวไว้ในข้างต้น ชุมชนของผู้พัฒนาภาษา PHP นั้นมีจำนวนมากและได้สร้างโปรแกรมเอาไว้่มากมาย นั้นหมายความว่า โอกาศที่ library หนึ่งของผู้พัฒนาคนหนึ่งอาจจะมีชื่อคลาสที่ไปเหมือนกับชื่อคลาสของผู้พัฒนาอีกคนหนึ่งใน library อีกอันหนึ่ง ทำให้เกิดปัญหาได้เพราะ PHP ไม่สามารถรู้ได้ว่าเราต้องการใช้คลาสไหนกันแน่

Namespaces ทำให้ปัญหานี้หมดไป จากตัวอย่างของคู่มือของ PHP namespaces สามารถนำมาเทียบได้กับระบบไดเรกทอรีของ ระบบไฟล์ใน operating system เช่น ชื่อไฟล์ที่เหมือนกันสามารถที่จะมีชื่อเหมือนกันได้ถ้าอยู่กันคนละไดเรกทอรี ในทำนองเดียวกัน กับภาษา PHP ชื่อคลาสที่เหมือนกันสามารถที่จะนำมาใช้ใน PHP ได้ถ้าอยู่กันคนละ namespaces นี้แหละที่ทำให้ PHP มีความยืดหยุ่นสูง

คุณจำเป็นที่จะต้อง namespace โปรแกรมของคุณ เพื่อที่จะทำให้โปรแกรมของคุณนำไปใช้กับโปรแกรมของผู้พัฒนาคนอื่นๆได้อย่างมี ประสิทธิภาพ

ข้อแนะนำที่สำคัญอันหนึ่งได้กล่าวไว้ใน PSR-0 เพื่อมีวัตถุประสงค์ในการเรียกใช้ไฟล์, คลาส, และ namespace ได้อย่างมีมาตรฐาน เพื่อที่จะทำให้การใช้โปรแกรมได้อย่างสอดคล้องกัน

Standard PHP Library

Standard PHP Library (SPL) เป็นแพคเกจของ PHP ที่รวบรวม classes และ interfaces เข้าด้วยกัน SPL ถูกสร้างขึ้นมาเพื่อรองรับพื่นฐานของ datastructure คลาสอย่างเช่น (stack, queue, heap, และอื่นๆ) และ iterators ที่สามารถที่จะอ่านค่าจาก datastructures เหล่านี้ได้ หรือจากคลาสที่คุณสร้างขึ้นมาเองที่เรียกใช้ SPL interfaces

Command Line Interface

PHP ได้ถูกสร้่างขื้นมาเพื่อสร้่างโปรแกรมบนเว็บ แต่ PHP นั้นยังสามารถนำมาสร้างโปรแกรมสคริปต์ command line interface (CLI) CLI สำหรับ PHP สามารถช่วยคุณสร้างโปรแกรมอัตโนมัติอย่างเช่น ทดสอบโปรแกรม, การติดตั้งโปรแกรมสำหรับไปใช้งานจริง, และ โปรแกรมสำหรับควบคุมระบบ

โปรแกรม CLI สำหรับ PHP นั้นมีความสามารถมาก เพราะว่าคุณสามารถที่จะใช้งานได้โดยตรง คุณไม่จำเป็นที่จะต้องมาสร้าง GUI และคอยดูแล ความปลอดภัยของเว็บ แค่อย่านำ CLI โปรแกรมไปติดตั้งไว้ในเว็บไดเรกทอรีที่สามารถเรียกได้โดยตรงจากเว็บไซต์!

ลองใช้ PHP CLI จาก command line:

> php -i

ตัวเลือก -i จะทำการแสดงค่าติดตั้งของ PHP เหมือนกับการเรียกใช้ฟังก์ชั่น phpinfo

ตัวเลือก -a จะทำให้ PHP เข้าสู่ interactive shell เหมือนกับ Ruby’s IRB หรือ Python’s interactive shell ยังมีตัวเลือกอื่นๆอีกมากที่มี ประโยชน์ ตัวเลือก command line

เรามาลองเขียน CLI โปรแกรมง่ายๆกันดีกว่าด้วย “Hello, $name” ถ้าจะลองโปรแกรมนี้ สร้างไฟล์ว่า hello.php ให้เหมือนกับไฟล์ข้างล่าง

<?php
if ($argc != 2) {
    echo "Usage: php hello.php [name].\n";
    exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";

PHP ได้มีตัวแปลพิเศษสองตัวแปล ที่จะรับอาร์กิวเมนต์เข้ามาในสคริปต์ $argc เป็นตัวแปล integer ที่จะบอกจำนวนอาร์กิวเมนต์ที่มี ในสคริปต์ และ $argv เป็นตัวแปล array ที่มีค่าของอาร์กิวเมนต์ที่อยู่ในสคริปต์ อาร์กิวเมนต์แรกจะเป็นชื่อของ PHP สคริปต์เสมอ ในตัวอย่างนี้คือ hello.php

เมื่อใช้ exit() ร่วมกับจำนวนตัวเลขที่ไม่ใช่ศูนย์ จะเป็นการบอก shell ให้ทราบว่า PHP สคริปต์นี้ล้มเหลว มาตรฐานการใช้ตัวเลขกับ exit() นี้สามารถอ้างอิงได้จากที่นี่

การเรียกใช้โปรแกรมจาก command line:

> php hello.php
Usage: php hello.php [name]
> php hello.php world
Hello, world

XDebug

เครื่องมือที่มีความสำคัญมากที่สุดในการพัฒนาโปรแกรมนั่นก็คือ debugger ที่ดี debugger จะช่วยให้คุณสามารถที่จะตรวจสอบการดำเนินการ ของโปรแกรมของคุณและสามารถตรวจสอบข้อมูลใน stack ได้ XDebug เป็นโปรแกรมดีบักของ PHP ที่สามารถนำไปใช้ร่วมกับ IDEs ต่างๆได้ เพื่อที่จะให้คุณสามารถตั้งค่าจุดหยุดพักการทำงานของโปรแกรม (breakpoints) และตรวจสอบ stack ได้ XDebug ยังสามารถใช้ร่วมงานได้กับ PHPUnit และ KCacheGrind เพื่อช่วยคุณตรวจสอบคุณภาพและประสิทธิภาพของโปรแกรม

ถ้าคุณพบว่า คุณเองไม่สามารถแก้ไขความผิดพลาดในโปรแกรมด้วย var_dump หรือ print_r ได้ คุณน่าจะลองใช้ debugger ดูอย่าง XDebug

การติดตั้ง XDebug นั้นเป็นอะไรที่อาจจะไม่ง่ายนัก แต่สิ่งที่สำคัญที่สุดคือ “Remote Debugging” ถ้าคุณพัฒนาโปรแกรมใน เครื่องของคุณ และนำไปทดสอบโปรแกรมผ่านทาง virtual machine (VM) หรือ เซิร์ฟเวอร์เครื่องอื่น Remote Debugging เป็นคุณสมบัติที่คุณ ต้องเปิดใช้งานในทันที

โดยปรกติแล้ว คุณจะต้องแก้ไข Apache VHost หรือ .htaccess ไฟล์ ด้วยค่าเหล่านี้

php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000

ค่าของ “remote host” และ “remote port” จะสอดคล้องกับเครื่องคอมพิวเตอร์ของคุณและค่าของพอร์ตที่คุณตั้งใน IDE ของคุณที่ตั้งให้ฟังอยู่ที่ พอร์ตไหน และคุณก็จะต้่องกำหนดให้ IDE ของคุณ ใช้โหมด “listen for connections” และคุณก็เริ่มโหลด URL

http://your-website.example.com/index.php?XDEBUG_SESSION_START=1

หลังจากนั้น IDE ของคุณก็จะสามารถที่จะเข้าไปมีส่วนร่วมในการทำงานของโปรแกรมที่กำลังทำงานอยู่ได้ ทำให้คุณสามารถที่จะตั้งจุดที่ทำให้โปรแกรม หยุดทำงานชั่วคราว (breakpoints) และทำการตรวจสอบค่าต่างๆในหน่อยความจำในขณะนั้นได้

debuggers ที่เป็นกราฟิก (GUI) จะทำให้การตรวจสอบโปรแกรมเป็นไปได้ง่ายขึ้น คุณสามารถที่จะตรวจสอบโปรแกรมในทีละบรรทัดได้ และทำการ ตรวจสอบค่าตัวแปลต่างๆ และ eval โปรแกรมได้ในขณะที่โปรแกรมกำลังทำงานอยู่ IDE’s มากมายได้มีกราฟิก debuggers ด้วย XDebug ติดตั้งหรือไม่ก็มีปลั๊กอินเสริมเข้ามา นอกจากนี้ยังมี MacGBDp ซึ่งเป็นฟรีโปรแกรม, โอเพนซอร์ส และเป็น XDebug GUI โปรแกรมสำหรับ Mac

Back to Top{.top}

Dependency Management

PHP มี libraries, frameworks, และ components ให้นำมาใช้ได้อย่างมากมาย โครงการในการเขียนโปรแกรมของคุณสามารถที่จะนำสิ่งเหล่านี้มาใช้ได้ การนำโปรแกรมย่อยต่างๆมาใช้ร่วมกัน เราเรียกว่า “project dependencies” ก่อนหน้านี้ PHP ไม่ได้มีวิธีการที่จะสามารถจัดการ project dependencies ได้อย่างง่าย ทำให้คุณจะต้องทำการควบคุม project dependencies ด้วยตัวคุณเอง นอกจากนั้นคุณจะต้องดูแลการนำ project dependencies มาใช้ในโปรแกรมของคุณ (autoloaders) แต่ในเวลานี้เราได้มีวิธีการควบคุมจัดการ project dependencies ได้

ในขณะนี้เรามีวิธีการจัดการ project dependencies หรือที่เรียกว่า “package management systems” โดย package management systems ที่ใช้กันในอยู่ขณะนี้มีอยู่สองวิธี คือ “Composer” และ “PEAR” ทั้งสองแบบนี้แตกต่างกันอย่างไร? เรามาเปรียบเทียบได้ว่า

โดยทั้วไป Composer แพคเกจจะสามารถใช้ได้ในเฉพาะโครงการที่คุณได้กำหนดค่าเอาไว้เท่านั้น แต่ PEAR แพคเกจจะสามารถใช้ได้ในทุก PHP โครงการที่อยู่บนระบบเดียวกัน คุณคงคิดว่าการใช้ PEAR น่าจะดีกว่า เพราะว่าคุณไม่ต้องมาคอยกำหนดค่า dependencies ทุกๆโครงการ แต่แท้จริงแล้ว การใช้ Composer หรือ กำหนดค่า dependencies ที่ละโครงการจะมีข้อได้เปรียบมากกว่า

Composer และ Packagist

Composer เป็น dependency manager ที่ดีมากสำหรับ PHP คุณสามารถที่จะรวบรวม dependency ที่คุณใช้ในโครงการของคุณได้ โดยรวมรวมไว้ใน composer.json ไฟล์และคุณก็สามารถที่จะคำสั้งง่ายๆในการใช้ Composer เพื่อที่จะให้ Composer ดาวน์โหลด dependency ให้คุณโดยอัตโนมัติ และนอกจากนั้น Composer ยังทำการติดตั้ง autoloading ให้ในโครงการของคุณทันที

PHP ได้มี libraries จะนวนมากที่รองรับการใช้งานร่วมกับ Composer และนั้นก็หมายความว่า libraries เหล่านี้ก็พร้อมให้คุณนำ มาใช้งานได้ทันทีในโครงการของคุณ คุณสามารถที่จะหาแพคเกจแหล่านี้ได้ใน Packagist (ศูณย์รวม PHP libraries ที่สามารถนำมาใช้ได้กับ Composer อย่างเป็นทางการ)

จะติดตั้ง Composer ได้อย่างไร?

คุณสามารถที่จะติดตั้ง Composer ได้ในเครื่องคอมพิวเตอร์ของคุณ (ในไดเรกทอรีที่คุณใช้ทำงาน แต่เราไม่แนะนำให้ใช้วิธีนี้) หรือ คุณสามารถติดตั้งในสภาพแวดล้อมทั่วไปของคุณ (อย่างเช่น ใน Unix, Linux หรือ Mac จะติดตั้งใน /usr/local/bin) ยกตัวอย่างว่า ถ้าคุณต้องการที่จะติดตั้งในไดเรกทอรีที่คุณใช้งาน เราจะไปที่ root ไดเรกทอรีของโครงการของเรา:

curl -s https://getcomposer.org/installer | php

คำสั่งนี้จะทำการดาวน์โหลด composer.phar (*.phar ไฟล์เป็น PHP binary archive) คุณสามารถที่จะใช้คำสั่ง command line php ในการจัดการ dependencies ของโครงการคุณ หมายเหตุ: ถ้าคุณใช้ pipe (|) คำสั่งใน terminal แล้วให้ส่ง output ออกไปที่ interpreter อย่างในตัวอย่างนี้ command | php คุณจะต้องมั่นใจว่าโปรแกรมที่คุณส่งไปให้ interpreter นั้นปลอดภัย แต่ตัวอย่างข้างบน ที่เราใช้ curl ในการ download โปรแกรมจาก Composer นั้นปลอดภัยเพราะ Composer ได้รับการยอมรับจากชุมชน PHP เรียบร้อยแล้วว่าปลอดภัย

จะติดตั้ง Composer ได้อย่างไร? (ด้วยตัวคุณเอง)

จากติดตั้ง Composer ด้วยตัวคุณเองนั้นจะต้องใช้วิธีขั้นตอนมากมายในการติดตั้ง แต่มีเหตุผลที่ผู้พัฒนาโปรแกรมส่วนมากใช้วิธีนี้ในการติดตั้ง Composer มากกว่าที่จะใช้โปรแกรมติดตั้งให้คุณ สาเหตุนั้นก็คือ การใช้โปรแกรมติดตั้งให้นั้นจะตรวจสอบว่า

แต่การติดตั้งด้วยตัวคุณเองนั้น คุณไม่จำเป็นที่จะต้องตรวจสอบสิ่งต่างๆเลย คุณจึงมีอิสรภาพในการติดตั้งค่าต่างๆในระบบของคุณได้ด้วยตัวคุณเอง

curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

path $HOME/local/bin (หรือคุณจะเปลี่ยนเป็นไดเรกทอรีใดๆก็ได้ที่คุณต้องการ) หลังจากนั้นคุณจะต้องนำ path นี้ไปติดตั้งใน $PATH environment variable ของคุณ ถ้าคุณได้ติดตั้งอย่างถูกต้อง คุณจะสามารถเรียกใช้ composer ใน command ได้ทันที

ถ้าคุณเห็นบางตัวอย่างหรือบทความที่อ้างอิงถึงการเรียกใช้ Composer ดังนี้ php composer.phar install คุณสามารถที่จะใช้คำสั่งนี้แทนได้ ในทันที

composer install

จะทำการกำหนดค่าและติดตั้ง Dependencies เหล่านี้ได้อย่างไร?

Composer จะมีไฟล์ที่เรียกว่า composer.json ไฟล์นี้จะมีข้อมูลของ dependencies ของที่โครงการเราใช้ คุณสามารถที่จะจัดการระบบด้วยตัวคุณเองอย่างง่ายดาย ในไฟล์นี้ หรือคุณจะใช้ Composer ก็ได้ คำสั่งนี้ php composer.phar require จะทำการเพิ่ม dependencies ให้คุณเอง และถ้าคุณไม่มีไฟล์ composer.json คำสั่งนี้ก็จะสร้างไฟล์นี้ให้คุณทันที เรามาลองใช้คำสั่งนี้ในการเพิ่ม Twig เข้าไปใน dependency ของโครงการคุณ คุณจะต่้องใช้คำสั่งนี้ใน root directory ของ โครงการคุณที่คุณได้ดาวน์โหลด composer.phar มา:

php composer.phar require twig/twig:~1.8

หรือถ้าคุณใช้คำสั่ง php composer.phar init นี้ คำสั่งนี้จะมีตัวเลือกให้คุณได้ทำการสร้างไฟล์ composer.json ให้ในโครงการของคุณ ไม่ว่าคุณใช้วิธีไหน ก็ตาม คุณก็จะมี composer.json ไฟล์ในโครงการของคุณ และคุณสามารถที่จะให้ Composer ดาวน์โหลดและติดตั้ง dependencies เหล่านี้ให้คุณในไดเรกทอรี vendors/ นอกจากนี้บางโครงการที่มี composer.json ไฟล์ติดตั้งมาด้วย คุณก็สามารถที่จะเรียกใช้งานได้เช่นกัน

php composer.phar install

ขั้นต่อไป คุณแค่เพียงนำบรรทัดข้างล่างนี้ไปใส่ในยังไฟล์โปรแกรมหลักของโครงการคุณ เพียงเท่านี้ Composer’s autoloader จะคอยเรียก dependencies ของโครงการคุณให้เอง

<?php
require 'vendor/autoload.php';

เพียงเท่านี้คุณก็สามารถที่จะเรียกใช้ dependencies ของโครงการคุณได้ และ dependencies เหล่านี้จะเรียกใช้เมื่อเราต้องการ

การอัปเดต dependencies ของคุณ

Composer จะสร้างไฟล์ composer.lock ให้ ไฟล์นี้จะเก็บรุ่นแพ็กเกจที่คุณได้ดาวน์โหลดเมื่อเรียกใช้คำสั่ง php composer.phar install และถ้าคุณได้ร่วมใช้โครงการของคุณกับนักพัฒนาอื่นๆและโครงการคุณนั้นได้มีไฟล์ composer.lock ติดไปด้วย เมื่อเขาได้ใช้คำสั่ง php composer.phar install เขาก็จะได้ดาวน์โหลด dependencies รุ่นเดียวกับที่คุณใช้ในโครงการของคุณ ถ้าคุณต้องการที่จะอัปเดต dependencies ของคุณ คุณเพียงแค่ใช้คำสั่ง php composer.phar update คำสั่งนี้จะมีประโยชน์อย่างมากเมื่อคุณได้เลือกใช้รุ่นของ dependencies ที่ไม่ได้เจาะจง อย่างเช่น คุณเลือกใช้รุ่นที่ ~1.8 ก็หมายความว่า “รุ่นอะไรก็ได้ที่ใหม่กว่า 1.8.0 แต่ น้อยกว่า 2.0.x-dev” คุณยังสามารถที่จะใช้ * wildcard ใน 1.8.* เมื่อคุณใช้ตัวเลือกนี้ แล้วใช้คำสั่ง php composer.phar update Composer จะทำการปรับปรุง dependencies ของคุณให้เป็นรุ่นใหม่ที่สอดคล้องกับตัวเลือกที่คุณเลือก

ตรวจสอบความปลอดภัยของ dependencies เหล่านั้น

Security Advisories Checker เป็น web service และ คำสั่ง command-line ทั้งสองทางนี้จะทำการตรวจสอบไฟล์ composer.lock และจะเตือนคุณเมื่อ dependencies ที่คุณใช้นั้นสมควรที่จะได้รับการอัปเดต

PEAR

PEAR เป็น package manager อีกอันหนึ่งที่นักพัฒนา PHP ส่วนมากชอบใช้ การทำงานของ PEAR นั้นจะคล้ายๆกับ Composer แต่จะมีส่วนแตกต่างกัน อย่างเห็นได้ชัด

PEAR นั้นจะบังคับให้โครงสร้างของแพ็กเกจนั้นเหมือนกับที่ PEAR ต้องการ นั้นหมายความว่า ผู้พัฒนาแพ็กเกจนั้นๆจะต้องจัดโครงสร้างเพื่อให้ใช้ได้ใน PEAR ถ้าคุณต้องการใช้แพ็กเกจที่ไม่ได้มีโครงสร้างตามที่ PEAR ต้องการ คุณก็ไม่สามารถที่จะใช้แพ็กเกจนั้นใน PEAR ได้

PEAR จะทำการติดตั้งแพ็กเกจในทั้งระบบ นั่นหมายความว่า ถ้าคุณได้ติดตั้งแพ็กเกจแล้ว คุณสามารถที่จะเรียกใช้แพ็กเกจนั้นได้ในทุกๆโครงการของคุณในระบบนั้น นั่นก็อาจจะเป็นสิ่งที่ดีถ้าโครงการของคุณใช้แพ็กเกจเดียวกันและรุ่นเดียวกัน แต่ก็อาจจะก่อให้เกิดปัญหาได้ถ้าแพ็กเกจเหล่านั้นขัดแย้งกัน

ติดตั้ง PEAR ได้อย่างไร?

คุณสามารถที่จะทำการติดตั้ง PEAR โดนการดาวน์โหลดตัวติดตั้งโดย phar และเรียกใช้โปรแกรมนั้น คู่มือการใช้ PEAR ได้บอกวิธีการใช้อย่างละเอียด วิธีการติดตั้ง PEAR สำหรับ OS ทุกตัว

ถ้าคุณใช้ Linux คุณสามารถที่จะใช้วิธีการติดตั้งได้จาก package manager ของคุณได้ด้วย อย่าง Debian และ Ubuntu จะมีแพคเกจ apt php-pear

การติดตั้งแพคเกจ

ถ้าแพคเกจนั้นได้แสดงอยู่ใน PEAR packages list คุณสามารถที่จะติดตั้งแพคเกจนั้นได้โดยใช้ชื่อที่ PEAR ใช้

pear install foo

ถ้าแพคเกจนั้นได้ host อยู่คนละ channel คุณจะต้องใช้คำสั่ง discover เพื่อที่จะทำการค้นหา channel นั้นก่อนและคุณจะต้องทำการบอก channel นั้นด้วยเวลา จะทำการติดตั้ง ดูเพิ่มเติม คู่มือวิธีการใช้ channel

การใช้ Composer ในการควบคุม PEAR dependencies

ถ้าคุณได้ใช้ Composer และคุณอยากที่จะติดตั้ง PEAR โปรแกรมด้วยนั้น คุณสามารถที่จะใช้ Composer ในการจัดการ PEAR dependencies ได้ ดังตัวอย่างนี้จะทำการติดตั้งโปรแกรมจาก pear2.php.net:

{
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}

ส่วนแรก "repositories" จะทำการบอกให้ Composer ทราบว่า Composer นั้นสมควรที่จะทำการ “initialise” PEAR repo (หรือ “discover” ถ้าเทียบกับคำศัพท์ที่ PEAR ใช้) หลังจากนั้น ส่วนต่อมา "require" จะทำการเพิ่มเติมชื่อของแพคเกจข้างหน้า อย่างนี้

pear-channel/Package

การเพิ่มเติมชื่อข้างหน้านั้นจะทำให้ไม่เกิดการขัดแย้งเวลาเรียกใช้โปรแกรม สาเหตุที่เพิ่มเติมชื่อข้างหน้าก็เพราะว่า ใน PEAR channel นั้นอาจจะสามารถมีชื่อ packages ที่เหมือนกับ packages อื่นๆได้ ดังนั้นการใช้ชื่อ channel หรือ ชื่อของ URL นั้นสามารถที่จะนำมาใช้เพื่อป้องกันความขัดแย้งของชื่อได้และก็สามารถที่จะนำมาใช้เพื่อค้นหา channel นั้นๆ

เมื่อโปรแกรมนี้ได้ทำการติดตั้งแล้ว จะได้ทำการติดตั้งที่ vendor ไดเรกทอรีและได้ติดตั้ง packages นี้อัตโนมัติใน Composer autoloader ไฟล์

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php

การที่จะเรียกใช้ package นี้ใน PHP นั้นสามารถทำได้โดย:

$request = new pear2\HTTP\Request();

Back to Top{.top}

มาตรฐานในการเขียนโปรแกรมให้ดี

พื้นฐาน

PHP เป็นภาษาที่มีความคล่องตัวสูง ที่นักเขียนโปรแกรมทุกความสามารถ สามารถเขียนโปรแกรมได้อย่างรวดเร็วและมีประสิทธิภาพ แต่เมื่อได้เริ่มพัฒนาต่อๆไปแล้ว ส่วนมากนักพัฒนาก็จะลืมพื้นฐานที่ได้เรียนรู้มา หรือไม่ได้สนใจที่จะเรียนรู้ สาเหตุเหล่านี้เกิดจากที่ความเคยตัวที่ผิดหรือต้องการที่จะเร่งพัฒนาโปรแกรมให้เสร็จ ในบทเรียนนี้จะช่วยแก้ปัญหาพื้นฐานเหล่านี้ และสนับสนุนให้นักพัฒนาได้เรียนรู้มาตรฐานในการเขียนโปรแกรม PHP

วันและเวลา

PHP ได้มี class ที่ชื่อว่า DateTime เพื่อที่จะช่วยคุณในการอ่าน, เขียน, เทียบและคำนวนค่าต่างๆที่เกี่ยวกับวันและเวลา PHP ยังมี functions อื่นๆอีกมากมาย ที่เกี่ยวกับวันและเวลานอกจาก class DateTime แต่ class DateTime จะมี interface ที่สามารถนำมาใช้ได้ในการแก้ปัญหาต่างๆทั่วไป ยังสามารถที่จะนำมาแก้ เวลาใน zones ต่างๆทั่วโลก แต่เราจะไม่นำมาอธิบายในบทความนี้

การเริ่มต้นใช้ DateTime นั้น เราจะต้องแปลงค่าวันและเวลาจาก string ไปเป็น object ด้วย createFromFormat() factory method หรือใช้ new \DateTime สำหรับการตั้งค่าเวลาในปัจจุบัน และใช้ format() method ในการเปลี่ยนค่าจาก object ไปเป็น string สำหรับการแสดงค่า output

<?php
$raw = '22. 11. 1968';
$start = \DateTime::createFromFormat('d. m. Y', $raw);

echo 'Start date: ' . $start->format('m/d/Y') . "\n";

การคำนวนค่าของ DateTime นั้นสามารถทำได้โดยใช้ DateInterval class DateTime จะมี methods อย่างเช่น add() และ sub() แต่จะใช้ DateInterval เป็น argument อย่าเขียนโปรแกรมที่คำนวนเวลาโดยใช้วินาทีในการคำนวนทุกๆวัน เพราะว่า daylight saving และ timezone จะทำให้การคำนวนนี้ผิดพลาดได้ คุณสมควรที่จะใช้ date intervals แทน การคำนวนวันเวลาที่แตกต่างกันนั้น ใช้diff() method จะคืนค่า new DateInterval และสามารถที่จะนำมาแสดงได้อย่างง่ายดาย

<?php
// create a copy of $start and add one month and 6 days
$end = clone $start;
$end->add(new \DateInterval('P1M6D'));

$diff = $end->diff($start);
echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n";
// Difference: 1 month, 6 days (total: 37 days)

ใน DateTime objects นั้นคุณสามารถใช้การเปรียบเทียบพื้นฐานได้:

<?php
if ($start < $end) {
    echo "Start is before end!\n";
}

ตัวอย่างสุดท้ายนี้จะแสดงการใช้ DatePeriod class ซี้งจะนำมาใช้ในการหาค่าเหตุการณ์ที่เหมือนกัน class นี้จะรับค่า DateTime objects สองค่า (ค่าเริ่มต้นและค่าสุดท้าย) และระยะเวลาที่เราต้องการให้ class นี้คืนค่าเหตุการณ์ในระหว่างนั้น

<?php
// output all thursdays between $start and $end
$periodInterval = \DateInterval::createFromDateString('first thursday');
$periodIterator = new \DatePeriod($start, $periodInterval, $end, \DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
    // output each date in the period
    echo $date->format('m/d/Y') . ' ';
}

Design Patterns

เมื่อคุณเริ่มต้นคิดที่จะพัฒนาโปรแกรมนั้น การใช้ patterns พื้นฐานในการเขียนโปรแกรมนั้นจะช่วยคุณได้อย่างมาก การใช้ patterns พื้นฐานนั้นมีประโยชน์ เพราะว่าจะช่วยให้คุณดูแลควบคุมโปรแกรมของคุณได้ง่ายและทำให้ผู้ร่วมพัฒนาโปรแกรมสามารถที่จะเข้าใจโปรแกรมของคุณทำงานอย่างไรได้อย่างง่าย

ถ้าคุณได้ใช้ framework ในการพัฒนาโปรแกรมนั้น โปรแกรมของคุณก็จะอ้่างอิงตาม framework ที่คุณใช้ ดังนั้น patterns ต่างๆได้ออกแบบมาเรียบร้อยแล้ว แต่คุณก็สามารถที่จะเลือกวิธีในการเลือกใช้ patterns ในการพัฒนาเพิ่มเติมต่อจาก framework นั้น แต่ถ้าคุณตัดสินใจที่จะไม่ใช้ framework ในการพัฒนาโปรแกรม คุณจะต้องเลือกที่จะใช้ patterns ที่เหมาะสมมากที่สุดในการพัฒนาโปรแกรมนั้น

Back to Top{.top}

Databases

เวลาคุณพัฒนาโปรแกรมภาษา PHP นั้น ส่วนมากเราจะต้องมีวิธีที่จะทำการเก็บข้อมูลไว้เพื่อที่จะนำมาใช้ได้อีก ดังนั้นคุณจำเป็นที่จะต้องใช้ฐานข้อมูล คุณสามารถที่จะเลือกวิธีการติดต่อกับฐานข้อมูลได้ แต่เราแนะนำว่าวิธีการติดต่อกับฐานข้อมูลนั้นจนถึงรุ่น PHP 5.1.0 ควรที่จะใช้ native drivers อย่างเช่น mysql, mysqli, pgsql, และอื่นๆ.

Native drivers นั้นดีมากถ้าคุณเลือกที่จะใช้ฐานข้อมูลระบบเดียวเท่านั้นในโปรแกรมคุณ ถ้าคุณต้องทำการใช้ฐานข้อมูลทั้ง MySQL, MSSQL และ Oracle นั้น คุณจะต้อง สามารถที่จะใช้ drivers ตัวเดียวกันได้ หรือแม้กระทั้งคุณจะต้องเรียนรู้วิธีการใช้ drivers เหล่านั้นสำหรับแต่ละฐานข้อมูล นั้นถือว่าเป็นทางเลือกที่ไม่ดี

และนอกจากนั้น mysql native drivers สำหรับ PHP นั้นได้เลิกทำการพัฒนาแล้ว และมาตรฐานของ PHP 5.4.0 นั้นสำหรับโครงการนี้คือ “Long term deprecation” นั้นหมายความว่า PHP จะไม่นำ mysql native drivers มาอยู่ใน PHP แล้ว คาดว่า PHP รุ่น 5.6 (หรือรุ่นที่มาหลังจาก 5.5) อาจจะถูกนำออกไปแล้วก็ได้ ดังนั้นถ้าคุณใช้ mysql_connect() และ mysql_query() ในโปรแกรมของคุณนั้น คุณจะต้องแก้ไขโปรแกรมของคุณใหม่อย่างแน่นอน ดังนั้นทางเลือกที่ดีที่สุดคือ ใช้ mysqli หรือ PDO ในโปรแกรมของคุณแทน คุณจะได้ไม่ต้องมาแก้ไขโปรแกรมของคุณในภายหลัง ถ้าคุณเริ่มโปรแกรมของคุณตั้งแต่ต้น คุณสมควรที่จะใช้ MySQLi หรือ PDO ห้ามใช้ mysql เด็ดขาด อ่าน MySQLi extension เพิ่มเติม,

PDO

PDO เป็น database connection abstraction library — สร้างขึ้นสำหรับ PHP ตั้งแต่รุ่น 5.1.0 — ที่จะสามารถให้นำไปใช้ในการติดต่อกับฐานข้อมูล ต่างๆมากมาย PDO จะไม่แปล SQL queries หรือช่วยเพิ่มเติมความสามารถให้ฐานข้อมูล PDO นั้นจะทำการติดต่อกับฐานข้อมูลต่่างๆเท่านั้น โดยใช้ API เดียวกันในการติดต่อ

แต่ที่สำคัญมากที่สุด PDO จะช่วยป้องกันข้อมูลภายนอกต่างๆที่จะเข้ามาในฐานข้อมูลของเราได้อย่างปลอดภัย หรือที่เรียกว่า database SQL injection attacks เราสามารถป้องกันได้โดยเรียกใช้ PDO statements และ bound parameters

เรามายกตัวอย่างว่า เรามี PHP script ที่รับ ID ที่เป็นตัวเลขใน query นั้น ดังนั้น ID นี้สามารถที่จะเรียกหาข้อมูล user ในฐานข้อมูลได้ ตัวอย่างนี้ เป็นตัวอย่างที่ผิดในการติดต่อฐานข้อมูล:

<?php
$pdo = new PDO('sqlite:users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

ตัวอย่างโปรแกรมนี้เป็นสิ่งที่ผิดมาก! คุณเรียกใช้ $_GET['id'] ใน SQL query แบบนี้ คุณจะสามารถโดนขโมยข้อมูลได้โดยง่าย พวก hacker สามารถที่จะผ่านค่า ID ใน URL เข้าไปได้แบบนี้ http://domain.com/?id=1%3BDELETE+FROM+users ดังนั้น $_GET['id'] จะได้รับค่า 1;DELETE FROM users คำสั่งนี้จะทำให้ฐานข้อมูลของคุณลบข้อมูลทุกอย่างใน users table! วิธีการแก้นั้นสามารถทำได้โดยตรวจสอบ input และทำการแก้ไข input นั้น โดยใช้ PDO bound parameters

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO
$stmt->execute();

ตัวอย่างข้างบนนี้ถูกต้อง คุณได้เรียกใช้ bound parameter ใน PDO statement ดังนั้น PDO จะทำการ escapes input จาก ID ก่อนที่จะนำไปติดต่อกับฐานข้อมูล เพื่อที่จะทำการป้องกัน SQL injection attacks!

คุณควรที่จะทราบว่าการติดต่อฐานข้อมูลในแต่ละครั้งนั้นจะเรียกใช้ทรัพยากรอย่างมากและแต่ใน PHP นั้นเราจะไม่เคยได้ยินว่า ถ้าเราไม่เรียกปิดฐานข้อมูลเมื่อเลิกใช้นั้น จะทำให้เกิดการเสียทรัพยากรได้ แต่ว่าเราจะพบเหตุการณ์นี้ได้ในภาษาอื่นๆ การใช้ PDO นั้นคุณสามารถที่จะทำการเลิกการเชื่อมต่อกับฐานข้อมูลได้โดยทำลาย PDO object นั้นโดยการลบ references กับ PDO object ได้โดยการตั้งค่า NULL ถ้าคุณไม่ทำการตั้งค่านี้ให้เป็น NULL แล้วละก็ PHP จะทำการปิดการเชื่อมต่อกับฐานข้อมูลเมื่อ โปรแกรม PHP ของคุณได้จบการทำงาน นอกจากคุณได้ทำการติดต่อด้วยวิธีแบบ persistent PHP จะไม่ทำการปิดฐานข้อมูลให้คุณ

Abstraction Layers

Frameworks ส่วนมากจะได้ทำการ abstraction layer ร่วมกับ PDO มาแล้ว ดังนั้นจะสามารถที่จะใช้ PHP methods ในการเพิ่มเติมประสิทธิภาพให้แด่ฐานข้อมูล ต่างๆให้ดีขึ้น ทำให้เกิดการ abstraction จากฐานข้อมูลโดยสิ้นเชิง แต่วิธีการนี้จะเพิ่ม overhead ให้กับโปรแกรมของเรา แต่ข้อดีคือ ถ้าคุณต้องการที่จะสร้างโปรแกรมที่รองรับ ฐานข้อมูลต่่างๆ อย่างเช่น MySQL, PostgreSQL และ SQLite นั้น การเพิ่ม overhead เล็กน้อยเหล่านี้ย่อมที่จะคุ้มค่ากับโปรแกรมที่สามารถดูแลได้ง่ายขึ้น

abstraction layers บางตัวนั้นได้ถูกสร้างโดยใช้มาตรฐานแบบ PSR-0 namespace ดังนั้นคุณจึงสามารถนำมาใช้ในโครงการคุณได้อย่างง่ายดาย:

Back to Top{.top}

Errors และ Exceptions

Errors

PHP นั้นได้มีการแบ่งแยกระดับของการแสดง error อยู่หลายระดับ แต่มีสามระดับที่ถือว่าเป็นสิ่งที่พบบ่อย นั่นก็คือ errors, notices และ warnings ในสามระดับนั้นจะสามารถแบ่งแยกได้โดย; E_ERROR, E_NOTICE, และ E_WARNING: Errors นั้นคือ fatal run-time errors และโดย จะเกิดสาเหตุมาจากโปรแกรมของคุณที่ไม่ถูกต้อง และคุณจะต้องแก้ไขโปรแกรมคุณให้ถูกต้องไม่เช่นนั้น โปรแกรมของคุณจะไม่สามารถทำงานต่อไปได้, Warnings จะเป็น non-fatal errors ซี้งจะยอมให้โปรแกรมของคุณทำงานต่อไปได้, Notices เป็นคำแนะนำที่เกิดจากโปรแกรมของคุณ ซึ่งอาจจะ ก่อให้เกิดหรือไม่เกิดปัญหาก็ได้ แต่โปรแกรมของคุณจะไม่หยุดทำงาน

error message อีกแบบหนึ่งที่จะเตือนเมื่อโปรแกรมทำงาน นั้นเรียกว่า E_STRICT ข้อความนี้จะแนะนำให้คุณแก้ไขโปรแกรมของคุณเพื่อที่จะให้โปรแกรมของคุณ สามารถทำงานร่วมกันได้ดีและรองรับกับ PHP รุ่นต่อๆไปในอนาคต

Exceptions

Exceptions เป็นมาตรฐานของภาษาโปรแกรมส่วนใหญ่ แต่สำหรับนักพัฒนาภาษา PHP นั้นจะมากข้ามไป ภาษาอย่าง Ruby นั้นจะใช้ Exception อย่างมากมาย ถ้าเกิดเหตุการณ์ที่ไม่คาดคิดเกิดขึ้นนั้น เช่น การเรียกใช้ HTTP ที่ผิดพลาด หรือการเชื่อมต่อกับฐานข้อมูลที่ผิดพลาด แม้กระทั้งการที่ไม่สามารถหา image asset ได้ Ruby (หรือ gems ที่กำลังใช้) จะ throw exception ให้กับผู้เรียกใช้ให้เห็นข้อผิดพลาดได้อย่างทันที

สำหรับ PHP นั้น จะไม่ได้ให้ความสำคัญกับการ throw exception มากนัก อย่างเช่น ถ้าคุณใช้ file_get_contents() จะให้ค่า FALSE และ warning เท่านั้น โดยเฉพาะ PHP frameworks เก่าอย่าง CodeIgniter จะให้ค่า false เท่านั้น และจะทำการ log ข้อความเหล่านั้นใน logs และอาจจะให้คุณ ตรวจสอบข้อผิดพลาดได้โดยใช้ $this->upload->get_error() แต่ปัญหาที่ใช้วิธีนี้นั้น คือคุณจะต้องตรวจสอบหาข้อผิดพลาดเองและต้องอ่านคู่มือวิธีการเรียกใช้ method เหล่านี้สำหรับ class นั้นๆ แทนที่จะมีมาตรฐานในการตรวจหาข้อผิดพลาดได้ทันที

ปัญหาอีกอย่างก็คือ ถ้า class นั้นทำการ throw ข้อผิดพลาดไปที่หน้าจอและหยุดการทำงานทันทีนั้นจะไม่ดีเท่าการที่จะสามารถจัดการข้อผิดพลาดเหล่านี้ได้ทันทีที่เกิดขี้น และก็สามารถทำให้โปรแกรมทำงานต่อไปได้จนจบอย่างไม่มีการติดขัด เราสมควรที่จะ throw Exceptions เพื่อที่จะให้ผู้พัฒนาโปรแกรมสามารถที่จะทราบถึงข้อผิดพลาด ได้ทันที และก็สามารถที่จะจัดการกับข้อผิดพลาดได้ด้วย ดังเช่น ตัวอย่างโปรแกรมนี้

<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');

try
{
    $email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
    // The validation failed
}
catch(Fuel\Email\SendingFailedException $e)
{
    // The driver could not send the email
}
finally
{
    // Use this to let user know email was sent
}

SPL Exceptions

Exception class ที่มากับ PHP นั้นได้ให้ข้อความที่สามารถนำมาใช้ในการ debug ได้น้อยมาก แต่อย่างไรก็ตาม เราสามารถที่จะแก้และปรับปรุงที่จะสร้าง Exception class ชนิดพิเศษได้ โดยการสร้าง class จาก Exception class ได้

<?php
class ValidationException extends Exception {}

นั้นก็หมายความว่า คุณสามารถที่จะมี catch blocks ได้หลายแบบ เพื่อที่จะคอยดักจับ Exceptions ต่างๆกันได้อย่างง่าย นั่นก็จะส่งผลให้เราสามารถที่จะสร้าง Exceptions class ได้อย่างมากมาย แต่แท้จริงแล้ว เราสามารถใช้ SPL Exceptions แทนที่ได้ คุณสามารถที่จะเลือก SPL extension เพื่อนำมาใช้ได้เลย

ยกตัวอย่างเช่น ถ้าคุณใช้ Magic Method __call() และ ได้ส่งค่า method ที่ผิดไปนั้น PHP จะ throw new BadFunctionCallException; ให้เรา ดังนั้นคุณก็ไม่จำเป็นที่จะต้องสร้าง custom Exception เพีื่อที่จะรองรับ Exception นี้ หรือเรียกใช้ Exception class เบื้องต้น ซึ้งไม่ได้บอกรายละเอียดของ Exception ได้อย่างเจาะจงมากพอ

Back to Top{.top}

Security

Web Application Security

ในโลกของการเขียนโปรแกรมนั้น จะมีกลุ่มคนที่ชอบที่จะทดสอบและพยายามหาข้อบกพร้องใน web application ของคุณ ความปลอดภัยนั้นเป็นสิ่งที่สำคัญมากของ web application คุณจะต้องคอยตรวจสอบและระวังตรงความปลอดภัยให้มากที่สุด แต่นับว่าเราโชคดีที่ได้มีชุมนุมของนักพัฒนาโปรแกรม The Open Web Application Security Project (OWASP) ที่ได้รวมตัวกันเรียบเรียงบทความที่เกี่ยวกับปัญหาต่างๆที่เกิดขี้นด้านความปลอดภัย และ วิธืการป้องกันปัญหาเหล่านี้ นักพัฒนาโปรแกรมสมควรที่จะอ่านเพื่อที่จะเรียนรู้และป้องกันปัญหาเหล่านี้

Password Hashing

สำหรับนักพัฒนาโปรแกรม PHP แล้ว ก็จะมีวันหนี่งที่จะต้องสร้างโปรแกรม PHP ที่จะต้่องมีระบบ user login ในการ login นั้นคุณจะต้องมีการเก็บข้อมูล usernames และ passwords ในฐานข้อมูลของคุณ และคุณก็จะต้องนำข้อมูลเหล่านี้มาใช้ในการ authenticate users เวลาที่เขา login ด้วย

ดังนั้น สิ่งที่สำคัญที่สุดคือการเก็บข้อมูลของ passwords ด้วย hash ให้ถูกต้อง ก่อนที่จะบันทึกลงในฐานข้อมูล สาเหตุที่เราใช้ hash ในการ บันทึกข้อมูล passwords ก็เพราะว่าการ hashing นั้น เมื่อ hash ข้อมูลไปแล้วจะไม่สามารถที่จะหาข้อมูลเดิมก่อนที่จะ hash ได้ นั่นก็หมายความว่า เราไม่สามารถที่จะทราบว่า passwords นั้นคืออะไร นอกจากนั้นเมื่อ hash ข้อมูลแล้ว เราก็จะได้ string ที่มีความยาวที่เท่ากันเสมอ ดังนั้น คุณจึงสามารถที่จะเปรียบเทียบค่า hash สองค่าได้ว่ามาจาก string ตัวเดียวกันหรือเปล่า แต่คุณไม่สามารถที่จะหาค่า string เดิมนั้นได้ ถ้าคุณไม่ได้ทำการ hash passwords ไว้แล้ว และฐานข้อมูลของคุณนั้นได้ถูกจู่โจม ข้อมูลของ users ของคุณจะถูกขโมยไปได้ และเขาก็สามารถที่จะเห็น passwords ของ users ของคุณได้ทันที และนอกจากนั้น users ส่วนมากก็จะใช้ password อันเดียวกันนี้กับที่อื่นๆด้วย ดังนั้นเราจะต้องคิดว่าความปลอดภัยเป็นสิ่งที่สำคัญมาก

Hashing passwords ด้วย password_hash

ใน PHP รุ่น 5.5 นั้นได้เพิ่มเติม password_hash ฟังก์ชั่นเข้ามา และในฟังก์ชั่นนี้ได้ใช้ BCrypt ซึ่งถือว่าเป็น algorithm ที่ปลอดภัยมากที่สุดในขณะนี้ที่ PHP รองรับ แต่ PHP ก็จะคอยเพิ่มเติม algorithms ต่างๆเข้ามาในรุ่นต่อๆไป คุณยังสามารถใช้ password_compat library ได้ เพราะว่า library นี้รองรับตั้งแต่ PHP >= 5.3.7

ตัวอย่างข้างล่างนี้จะแสดงการ hash string และหลังจากนั้นจะทำการตรวจค่า hash กับ string อันใหม่นี้ แต่เมื่อค่า string สองค่านี้ต่างกัน (‘secret-password’ vs. ‘bad-password’) จึงทำให้การ login ไม่ประสบความสำเร็จ

<?php
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    //Correct Password
} else {
    //Wrong password
}

Data Filtering

คุณจะต้องไม่เชื่อว่าค่าต่างๆที่ถูกผ่านเข้ามาใน PHP โปรแกรมนั้นมีค่าถูกต้องอย่างเด็ดขาด คุณจะต้องตรวจสอบและแก้ไขข้อมูลเหล่านั้นเสมอก่อนที่จะนำมาใช้ในโปรแกรมของคุณ ใน PHP นั้นได้มี filter_var และ filter_input ฟังก์ชั่นที่สามารถตรวจสอบค่าและทำการแก้ไขค่าเหล่านั้นให้ถูกต้องได้ (เช่น ข้อมูล email addresses เป็นต้น)

ข้อมูลที่ได้รับมาจากภายนอกนั้นสามารถเป็นอะไรก็ได้ ข้อมูลเหล่านั้นคือ $_GET และ $_POST ที่ได้มาจาก form ของคุณ นอกจากนั้น ค่า $_SERVER บางค่า และ HTTP request body จาก fopen('php://input', 'r') คุณต้องจำไว้ว่า ข้อมูลภายนอกเหล่านี้ไม่ได้มาจาก form เพียงอย่างเดียวเท่านั้น การ upload และ download ไฟล์ต่างๆ, ข้อมูลจาก session, ข้อมูล cookie, และ ข้อมูลจากเว็บไซต์ต่างๆนั้นก็ถือว่าเป็นข้อมูลภายนอกทั้งนั้น

โดยข้อมูลภายนอกเหล่านั้น คุณสามารถที่จะนำมาใช้ในโปรแกรมของคุณได้ เราก็ถือว่าข้อมูลเหล่านั้นเป็นข้อมูลที่เราเชื่อถือไม่ได้ ทุกๆครั้งที่เรานำข้อมูลเหล่านั้นมาใช้ไม่ว่าจะนำมาใช้ อย่างไรก็ตามในโปรแกรมของคุณ คุณจะต้องถามตัวคุณเองทุกครั้งว่า คุณสามารถเชื่อถือข้อมูลเหล่านั้นได้หรือไม่ ข้อมูลเหล่านั้นได้รับการตรวจสอบและแก้ไขหรือยัง

ข้อมูลแต่ละข้อมูลนั้นอาจจะมีวิธีการตรวจสอบและแก้ไขที่ต่างกันไปตามจุดประสงค์ที่จะนำมาใช้ ยกตัวอย่างเช่น เมื่อข้อมูลภายนอกที่ไม่ได้รับการตรวจสอบและแก้ไขและได้ถูกนำไปใช้ใน หน้า HTML นั้น ก็จะสามารถที่จะใช้คำสั่ง HTML และ JavaScript ในหน้าเว็บไซต์ของเราได้ ข้อผิดพลาดนี้เราเรียกว่า Cross-Site Scripting (XSS) attack ซึ่งอันตราย สำหรับเว็บไซต์ของเราอย่างมาก วิธีการป้องกัน XSS นั้นสามารถทำได้โดยตรวจสอบและแก้ไขค่าภายนอกต่างๆที่เราได้รับมาแล้วถึงนำมาใช้ในโปรแกรมของเรา PHP นั้นได้มีฟังก์ชั่น ที่สามารถป้องกัน XSS ได้คือ strip_tags ที่จะทำการลบ HTML tag ออก หรือ htmlentities (หรือ htmlspecialchars) ที่จะทำการ escaping characters ที่มีความหมายพิเศษใน HTML entities ได้

อีกตัวอย่างหนึ่งก็คือ การที่รับข้อมูลภายนอกจาก command line ผ่านทาง options สิ่งนี้ก็ถือเป็นสิ่งที่อันตรายอย่างมาก (และก็ถือว่าเป็นสิ่งที่ไม่สมควรทำ) แต่ถ้าจำเป็นแล้ว คุณสามารถที่จะใช้ escapeshellarg ฟังก์ชั่นในการตรวจสอบและแก้ไขข้อมูลที่ได้รับมาจาก command line ได้

ตัวอย่างสุดท้ายก็คือ การที่เรายอมรับข้อมูลภายนอกเพื่อที่จะหาไฟล์ที่จะนำมาใช้ในระบบไฟล์ของเรา สิ่งนี้ก็ถือว่าเป็นสิ่งที่สามารถก่อให้เกิดอันตรายต่อระบบของเราได้ เพราะถ้า ข้้อมูลนั้นสามารถที่จะถูกเปลี่ยนจากชื่อไฟล์ให้เป็นไฟล์ path แทนแล้วละก็ ผู้จู่โจมสามารถที่จะหาไฟล์สำคัญต่างๆได้ ดังนั้นคุณจะต้องลบ “/”, “../”, null bytes หรือ characters ต่างๆจากไฟล์ path เพื่อที่จะป้องกันไม่ให้ไฟล์สำคัญต่างๆถูกจู่โจมได้

Sanitization

Sanitization คือการลบ (หรือที่เรียกว่า escapes) characters ต่างๆที่ไม่ปลอดภัยจากข้อมูลที่ได้รับจากภายนอกโปรแกรมของเรา

ยกตัวอย่างเช่น คุณสมควรที่จะ sanitize ข้อมูลที่ได้รับจากภายนอกโปรแกรมของคุณทุกครั้ง ก่อนที่จะนำข้อมูลเหล่านั้นมาใช้ใน HTML หรือนำไปใช้ใน SQL query ทันที แต่ถ้าคุณได้ใช้การ bind parameters ด้วย PDO แล้วข้อมูลนั้นก็จะได้ผ่านการตรวจสอบให้คุณก่อนที่จะนำไปใช้ในฐานข้อมูลของคุณได้อย่างปลอดภัย

ในบางครั้งคุณต้องการอนุญาติให้ข้อมูลภายนอกสามารถที่จะส่ง tag ของ HTML บางอย่างที่ปลอดภัยเข้ามาใช้ในโปรแกรมของคุณได้ วิธีนี้เป็นวิธีที่ยากพอสมควร นักพัฒนาส่วนมาก เลือกที่จะใช้ Markdown หรือ BBCode แทน HTML เพราะว่าจะปลอดภัยกว่าและสะดวกกว่า แต่ถ้าคุณใช้อยากที่จะใช้ HTML ในโปรแกรมของคุณ คุณก็สามารถที่จะใช้ libraries อย่าง HTML Purifier และคุณก็สามารถที่จะกำหนดค่า whitelist ต่างๆได้เลย

อ่านเพิ่มเติมเกี่ยวกับ Sanitization Filters

Validation

การตรวจสอบข้อมูลนั้นจะใช้กับข้อมูลที่ได้รับจากภายนอกโปรแกรม เพื่อตรวจสอบว่าข้อมูลเหล่านั้นคือสิ่งที่คุณต้องการ ยกตัวอย่างเช่น คุณต้องการที่จะตรวจสอบข้อมูลนั้นซึ่งเป็น email address, เบอร์โทรศัพท์, หรือ อายุ เป็นต้น เมื่อมีค่าที่ส่งมาจากฟอร์มของคุณ

อ่านเพิ่มเติม Validation Filters ต่างๆ

Configuration Files

เมื่อคุณต้องการที่จะสร้าง configuration ไฟล์ในโปรแกรมของคุณนั้น วิธีการปฏิบัติที่ดีที่สุดก็คือ คุณสมควรที่จะทำตามหัวข้อดังต่อไปนี้

Register Globals

NOTE: ใน PHP รุ่น 5.4.0 ค่า register_globals นั้นได้ถูกนำออกและไม่สามารถที่จะนำมาใช้ได้อีกต่อไป ต้องการที่จะเตือนทุกคนที่จะทำการอัพเกรดโปรแกรมเก่า

เมื่อคุณเรียกใช้ค่า register_globals แล้วนั้น จะทำให้ค่าตัวแปลต่างๆ (รวมถึง $_POST, $_GET และ $_REQUEST) นั้นได้นำมาใช้ได้ใน global scope ของโปรแกรมของคุณทันที การใช้ค่านี้นั้นจะทำให้เกิดปัญหาเกี่ยวกับความปลอดภัยได้ เพราะในโปรแกรมของคุณจะไม่สามารถแยกได้ว่าข้อมูลนั้นได้มาจากที่ใด

ยกตัวอย่างเช่น $_GET['foo'] จะถูกทำให้เป็นค่าตัวแปล $foo ซึ่งยังสามารถที่จะไปแทนที่ค่าตัวแปลที่ยังไม่ได้สร้างขึ้นมา ถ้าคุณใช้ PHP < 5.4.0 คุณจะต้อง มั่นใจว่า register_globals ได้มีค่าเป็น off

Error Reporting

การบันทึกข้อผิดพลาดนั้นจะมีประโยชน์อย่างมากในการหาข้อผิดพลาดในโปรแกรมของคุณ แต่ข้อเสียนั้นก็คืออาจจะเป็นเผยข้อมูลเกี่ยวกับโครงสร้างโปรแกรมของคุณสู่โลกภายนอกได้ ดังนั้นการที่จะปกป้องโปรแกรมของคุณจากปัญหาที่อาจจะเกิดขึ้นได้จากการแสดงข้อผิดพลาดเหล่านั้น คุณจะต้องทำการกำหนดค่าของเซิร์ฟเวอร์แตกต่างกันระหว่างกำลังพัฒนา และนำไปใช้งานจริงใน production

ระหว่างการพัฒนา

สำหรับการแสดงข้อผิดพลาดระหว่างการพัฒนานั้น เราต้องการที่จะแสดงข้อผิดพลาดทุกอย่างออกมาทั้งหมด, เราสามารถที่จะตั้งค่าเหล่านี้ได้ใน php.ini:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

การผ่านค่า -1 เข้าไป จะทำให้ PHP แสดงค่าผิดพลาดต่างๆออกมา ไม่ว่าจะเป็นค่าใหม่ๆที่จะได้รับเพิ่มเติมเข้ามา PHP รุ่นอนาคต การใช้ค่าคงที่ E_ALL ใน PHP รุ่น 5.4 ก็จะเป็นเหมือนกัน - php.net

การตั้งค่า E_STRICT ในการแสดงข้อผิดพลาดนั้น ได้เริ่มใช้ใน PHP รุ่น 5.3.0 และค่านี้จะไม่ได้รวมอยู่ใน E_ALL ด้วย แต่ในรุ่น 5.4.0 นั้น จะถูกรวมอยู่ใน E_ALL ด้วย นั่นก็หมายความว่า ถ้าคุณได้ใช้ PHP รุ่น 5.3 นั้นและคุณต้องการที่จะแสดงข้อผิดพลาดทั้งหมดแล้วละก็จะต้องใช้คำสั่ง -1 หรือ E_ALL | E_STRICT

รวมรวมค่าที่ใช้ในการแสดงข้อผิดพลาดทั้งหมดโดยแยกตามรุ่นของ PHP

Production

สำหรับการใช้การแสดงข้อผิดพลาดใน production นั้น คุณสมควรที่ซ่อนข้อผิดพลาดโดยการตั้งค่าเหล่านี้ใน php.ini:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

โดยการตั้งค่าเหล่านั้นใน production ข้อผิดพลาดทั้งหลายก็ยังคงเก็บไว้ใน error logs ในเว็บเซิร์ฟเวอร์ของคุณ แต่ข้อผิดพลาดเหล่านี้จะไม่แสดงออกมาให้ผู้ใช้ โปรแกรมของคุณได้เห็น, สำหรับข้อมูลเพิ่มเติมเกี่ยวการตั้งค่าเหล่านี้ คุณสามารถอ่านได้จากคู่มือของ PHP:

Back to Top{.top}

Testing

การเขียนโปรแกรมเพื่อทดสอบโปรแกรมของคุณโดยอัตโนมัตินั้นถือว่าเป็นสิ่งที่ดีที่สุดและสามารถทำให้โปรแกรมของคุณนั้นถือได้ว่าเป็นโปรแกรมที่ได้ถูก การสร้างมาอย่างดีเยี่ยม โปรแกรมที่ใช้ทดสอบโปรแกรมโดยอัตโนมัตินั้น ถือว่าเป็นเครื่องมือที่ดีที่สุดที่สามารถทำการทดสอบโปรแกรมของคุณว่าจะไม่มีข้อผิดพลาด เมื่อคุณได้เปลืี่ยนหรือเพิ่มเติมฟังก์ชันการทำงานใหม่ๆเข้าไป ซึ่งถือว่าเป็นสิ่งที่สำคัญ

PHP ได้มีเครื่องมือ (หรือ frameworks) หลากหลายที่สามารถที่จะทำการทดสอบโปรแกรมโดยอัตโนมัตินั้นให้คุณได้ ซึ่งแต่ละเครื่องมือนั้นจะมีวิธีใช้ที่แตกต่างกัน แต่ก็จะมีจุดประสงค์เดียวกันคือ จะทำการหลีกเลี่ยงการทดสอบโปรแกรมด้วยตัวคุณเอง และก็จะลดภาระ (หรือจำนวนพนักงาน) ให้แด่ Quality Assurance teams ซึ่งการทดสอบโปรแกรมโดยอัตโนมัตินั้นก็จะแก้ปัญหาเมื่อเราได้แก้ไขโปรแกรมไปแล้ว จะไม่ส่งผลให้สิ่งอื่นๆหยุดทำงานนั้นเอง

Test Driven Development

จาก Wikipedia:

Test-driven development (TDD) คือกระบวนการพัฒนาซอฟต์แวร์ที่จะใช้หลักการที่เป็นระบบโดยมีระบบสั้นๆในแต่ละช่วงของการพัฒนาโปรแกรม: ขั้นตอนแรกนั้น นักพัฒนาโปรแกรมจะต้องเขียน test case ที่จะทำให้ฟังก์ชั่นหรือสิ่งที่ต้องการเพิ่มเติมเข้าไปในโปรแกรมของคุณไม่สามารถผ่าน test case เหล่านี้ได้ และหลังจากนั้นก็เขียนโปรแกรมให้สามารถผ่าน test case เหล่านั้นได้และในที่สุดก็ใช้การ refactors โปรแกรมเหล่านั้นให้เหมาะสมกับมาตรฐานและเป็นที่ยอมรับ Kent Beck, ได้คิดค้นระบบ TDD ในปี 2003 โดยมีแนวคิดพื้นฐานว่า จะส่งเสริมการออกแบบโปรแกรมที่เรียบง่ายและจะเพิ่มเติมความเชื่อถือให้กับโปรแกรมของคุณ

กระบวนการทดสอบโปรแกรมนั้นได้มีอยู่หลายแบบ และคุณก็สามารถนำการทดสอบเหล่านั้นมาใช้ในโปรแกรมของคุณได้

Unit Testing

Unit Testing เป็นวิธีการเขียนโปรแกรมที่จะรับรองว่าฟังก์ชั่น, classes, และ methods ต่างๆสามารถที่จะทำงานได้ตามที่ต้องการ ตั้งแต่คุณได้เริ่มสร้างจนกระทั้ง โปรแกรมพัฒนาจนเสร็จสิ้น โดยการตรวจสอบค่าที่ผ่านเข้าไปในฟังก์ชั่นและ methods ต่างๆ และค่าที่คืนออกมาเหล่านั้นด้วย ดังนั้นคุณจึงสามารถมั่นใจได้ว่าโปรแกรมของคุณ นั้นทำงานได้อย่างถูกต้อง โดยการใช้ Dependency Injection และการใช้ “mock” classes ในการที่จะตรวจสอบโปรแกรมของคุณ และคุณก็สามารถที่จะมั่นใจ ได้ว่า dependencies ของคุณนั้นได้ใช้ได้อย่างถูกต้อง ทำให้ test โปรแกรมของคุณนั้นได้ครบถ้วนมากขึ้น

เมื่อคุณสร้าง class หรือ ฟังก์ชั่น คุณสมควรที่จะสร้าง unit test สำหรับพฤติกรรมต่างๆที่จะต้องมี แต่อย่างน้อยคุณจะต้องมั่นใจว่า unit test เหล่านั้นจะแสดงข้อความ ผิดพลาดเมื่อคุณส่งค่า arguments ที่ผิดและจะผ่าน unit test ถ้าคุณส่ง arguments ที่ถูกต้อง การที่ตั้ง unit test ขึ้นมาก็เพื่อที่จะให้เรามีความมั่นใจมากขึ้น เมื่อคุณทำการแก้ไข class หรือฟังก์ชั่นต่างๆในระหว่างการพัฒนาแล้วจะไม่ทำให้โปรแกรมเกิดข้อผิดพลาดขึ้นและยังทำงานได้อย่างปรกติ แต่ก็ยังมีอีกวิธีหนึ่งที่เราจะทำการ ตรวจสอบได้ก็คือใช้ var_dump() ใน test.php แต่การใช้วิธีนี้นั้นจะไม่สามารถที่จะนำไปสร้างโปรแกรมได้เลยไม่ว่าโปรแกรมขนาดใหญ่หรือเล็ก

ในการนำ unit tests ไปใช้ได้อีกวิธีหนึ่งก็คือการร่วมมือใน open source โปรแกรม ถ้าคุณสามารถที่จะเขียน test โปรแกรม ที่แสดงว่าโปรแกรมนั่นมีข้อบกพร่อง และ คุณได้ทำการแก้ไขได้เรียบร้อยและสามารถที่จะแสดงได้ว่าผ่าน test case เหล่านั้น โปรแกรมที่คุณได้แก้นั้นก็จะเป็นที่ยอมรับได้ง่าย และถ้าคุณได้สร้างโครงการขึ้นมา ที่จะยอมรับ pull requests แล้วละก็คุณก็สมควรที่จะบังคับใช้วิธีนี้เหมือนกัน

PHPUnit เป็น testing framework ที่ใช้ในการเขียน unit tests สำหรับโปรแกรม PHP แต่ก็ยังมีโปรแกรมอื่นๆอีก

Integration Testing

From Wikipedia:

Integration testing (หรือที่เรียกว่า Integration และ Testing, คำย่อว่า “I&T”) เป็นประโยคที่ใช้ในการทดสอบโปรแกรมที่ทดสอบโปรแกรมทั้งระบบ โดยจะเป็นการทดสอบหลังจาก unit testing และก่อนที่จะทำการ validation testing โดย Integration testing นั้นจะรวบรวมโปรแกรมย่อยต่างๆที่ได้ผ่าน การ unit tested เรียบร้อยแล้ว โดยนำมารวมกัน และก็ทำการตรวจสอบตาม integration test plan และถ้าผ่านการตรวจสอบนี้ไปได้ก็ โปรแกรมของคุณก็พร้อม ที่จะทดสอบด้วย system testing

คุณสามารถที่จะใช้เครื่องมือเดียวกับที่คุณใช้ใน unit testing ได้ใน integration testing เพราะว่าจะมีวิธีการตรวจสอบที่คล้ายกัน

Functional Testing

หรือที่ถูกเรียกว่า acceptance testing, functional testing นั้นจะเป็นการใช้เครื่องมือต่างๆในการสร้างโปรแกรมตรวจสอบอัตโนมัติ โดยจะทำการตรวจสอบ โปรแกรมของคุณทั้งโปรแกรม แทนที่จะตรวจสอบเป็นหน่วยๆไปว่า หน่วยต่างๆทำงานได้ถูกต้องหรือไม่และสามารถทำงานร่วมกันได้หรือไม่ โดยทั่วไปแล้ว เครื่องมือเหล่านี้จะ ใช้ข้อมูลจริงและจะทำการจำลองการใช้งานจริงของผู้ใช้งานของโปรแกรมนั้น

Functional Testing Tools

Behavior Driven Development

ในการพัฒนาโปรแกรมแบบ Behavior-Driven Development (BDD) จะมีอยู่สองวิธีนั่นก็คือ SpecBDD และ StoryBDD SpecBDD นั่นจะเน้นในเรื่องของพฤติกรรมทางเทคนิคหรือโปรแกรม โดย StoryBDD นั่นจะเน้นเรื่องของพฤติกรรมที่เกี่ยวข้องกับธุรกิจหรือพฤติกรรมที่สำคัญ PHP ได้มี frameworks มากมายที่รองรับ BDD ทั้งสองแบบนี้

สำหรับ StoryBDD นั้น คุณสามารถที่จะเขียนเรื่องราวที่บุคคลทั่วไปอ่านได้ง่าย โดยเนื้อเรื่องนั้นจะอธิบายพฤติกรรมต่างๆของโปรแกรมของคุณ เรื่องที่คุณได้ เขียนขึ้นนั้นคุณสามารถที่จะนำมาใช้ในการทดสอบโปรแกรมของคุณได้อีกด้วย framework ที่ใช้ทดสอบโปรแกรมแบบ StoryBDD ใน PHP นั้น ก็คือ Behat โดย ได้รับแนวคิดมาจากโครงการ Cucumber จาก Ruby และได้ใช้ Gherkin DSL สำหรับการบรรยายพฤติกรรมที่สำคัญต่างๆ

สำหรับ SpecBDD นั้น คุณจะเขียนข้อกำหนดต่างๆของโปรแกรมว่าสมควรที่จะทำงานอย่างไร แทนที่จะทดสอบฟังก์ชั่นหรือ method คุณนั้นจะเขียนข้อกำหนดว่า ฟังก์ชั่นหรือ method นั้นสมควรที่จะประพฤติอย่างไร PHP ได้มี PHPSpec framework สำหรับการทดสอบแบบนี้ framework นี้ได้รับแนวคิดมาจาก RSpec project สำหรับ Ruby

Complementary Testing Tools

นอกจากการทดสอบทีละหน่วยแล้วและการทดสอบความประพฤติ frameworks แล้ว ยังมี frameworks ทั่วๆไปอีกมากมายและ libraries ต่างๆที่คอยช่วยเพิ่มเติมความ สามารถให้ frameworks เหล่านั้นอีกด้วย

Back to Top{.top}

Servers และ Deployment

PHP โปรแกรมสามารถที่จะนำไปติดตั้งและเรียกใช้ใน web servers ที่ทำงานจริงได้หลายทาง

Platform as a Service (PaaS)

PaaS ได้จัดการติดตั้งระบบและเครือข่ายต่างๆให้พร้อมที่คุณจะสามารถเรียกใช้ PHP ได้ในทันทีบนเว็บ นี้ก็หมายความว่า คุณไม่จำเป็นที่จะต้องติดตั้งและตั้งค่าต่างๆ เมื่อคุณต้องการที่จะใช้โปรแกรม PHP หรือ frameworks ต่างๆ

เมื่อไม่นานมานี้ PaaS ได้เป็นที่นิยมอย่างมากสำหรับการติดตั้ง, เรียกใช้ และในการกระจายโปรแกรมของ PHP ทุกขนาด คุณสามารถที่จะหารายชื่อของ ผู้ให้บริการ PHP PaaS “Platform as a Service” ใน หัวข้อ resources.

Virtual หรือ Dedicated Servers

ถ้าคุณมีความสามารถที่จะบริหารและจัดการ หรืออยากที่จะเรียนรู้ ดังนั้นการใช้ virtual หรือ dedicated servers จะทำให้คุณสามารถที่จะควบคุมและจัดการ สภาพแวดล้อมของโปรแกรมของคุณได้

nginx และ PHP-FPM

PHP, ที่เรียกใช้ผ่าน PHP’s built-in FastCGI Process Manager (FPM) นั้นสามารถนำมาใช้คู่กับ nginx ได้อย่างดี โดย nginx เป็นเว็บเซิร์ฟเวอร์มีคุณสมบัติที่เล็กและประสิทธิภาพสูง nginx นั้นจะใช้หน่วยความจำที่น้อยมากกว่า Apache และสามารถที่จะ มีระบบจัดการ concurrent requests ที่ดีกว่า สิ่งนี้เป็นสิ่งที่สำคัญมากบน virtual servers ที่ไม่ได้มีหน่วยความจำมากพอที่จะนำมาแบ่งใช้ได้

Apache and PHP

PHP และ Apache นั้นได้ทำการร่วมกันมายาวนานมาก Apache นั้นสามารถที่จะเพิ่มเติม modules ต่างๆเพื่อเพิ่ม ความสามารถได้อย่างง่าย สำหรับ shared servers แล้ว Apache นั้นได้ถือว่าเป็นที่นิยมอย่างมาก และก็สามารถที่จะติดตั้ง PHP frameworks และ open source โปรแกรม อย่าง WordPress ได้ง่าย แต่ข้อเสียนั้น Apache จะใช้ทรัพยากรที่มากกว่า nginx และไม่สามารถที่จะรองรับการเรียกใช้จากหลายผู้เรียกใช้ได้พร้อมกัน

Apache นั้นได้มีการติดตั้งได้หลายรูปแบบเพื่อที่จะเรียกใช้ PHP วิธีที่ง่ายและใช้กันอย่างมากที่สุดก็คือการใช้ prefork MPM ด้วย mod_php5 การใช้ระบบการติดตั้งแบบนี้นั้นจะไม่ได้เป็นระบบติดตั้งที่บริหาร ทรัพยากรได้ดีที่สุด แต่วิธีนี้เป็นวิธีที่ง่ายที่สุดที่ทำให้ใช้ PHP ได้อย่างง่าย ถ้าคุณไม่ต้องการที่จะจัดการ server ด้วยตัวคุณเอง วิธีนี้ก็ถือว่าเป็นวิธีที่ดีที่สุด คำเตือนถ้าคุณใช้ mod_php5 คุณจะต้องใช้ prefork MPM ด้วย

อีกทางเลือกหนึ่งก็คือ ถ้าคุณต้องการที่จะเพิ่มประสิทธิภาพและความเสถียรให้กับ Apache นั้น คุณก็สมควรที่จะใช้ระบบ FPM ดังที่ nginx ใช้ และเรียกใช้ worker MPM หรือ event MPM ด้วย mod_fastcgi หรือ mod_fcgid การตั้งค่าเหล่านี้นั้นรับรองว่าจะทำให้ Apache ใช้หน่วยความจำได้อย่างมีประสิทธิภาพที่มากขึ้นและรวดเร็วขึ้น แต่คุณจะต้องทราบวิธีใน การติดตั้งและจะใช้เวลาในการติดตั้งนานกว่า

Shared Servers

PHP ได้มี shared servers ส่วนมากรองรับเพราะในความเป็นที่นิยม เป็นไปได้ยากมากที่คุณจะไม่สามารถหา host ที่ไม่มี PHP ติดตั้งอยู่ แต่คุณจะต้องมั่นใจว่าเป็น รุ่นที่ใหม่ล่าสุด shared servers จะอนุญาติให้คุณและผู้พัฒนาโปรแกรมต่างๆได้ติดตั้งเว็บไซต์ลงบนเครื่องเดียวกัน ข่้อดีของ shared servers นั้นก็คือ ค่าใช้จ่ายที่ถูกลง ข่้อเสียก็คือ คุณจะไม่สามารถทราบได้ว่าโปรแกรมที่ผู้พัฒนาโปรแกรมคนอื่นๆนั้น ได้ติดตั้งจะเป็นอย่างไร จะทำให้เครื่อง server นั้นช้าลงหรือเป็นช่องทางให้ระบบไม่ ปลอดภัย นี้ก็คือสิ่งที่น่ากลัวมากที่สุด ถ้าโครงการของคุณสามารถที่จะมีงบประมาณมากพอ คุณสมควรที่จะหลีกเลี่ยงการใช้ shared server

Building และ Deploying โปรแกรมของคุณ

ถ้าคุณได้ค้นพบว่า คุณได้ทำการเปลี่ยนโครงสร้างของฐานข้อมูลหรือทำการทดสอบโปรแกรมด้วยตัวของคุณเอง ลองคิดดูให้ดีว่าการที่คุณต้องทำกระบวนการเหล่านี้ ด้วยตัวเองนั้น ยิ่งมีกระบวนการที่มากเท่าไหร่ ก็ยิ่งมีโอกาศเสี่ยงต่อข้อผิดพลาดได้มากขึ้นเท่านั้น ไม่ว่าคุณจะต้องการที่จะอัพเดตไ​​ฟล์ง่ายๆเพียงนั้น คุณสมควรที่จะ ใช้กระบวนการ build หรือ continuous integration strategy ดังนั้น build automation คือสิ่งที่คุณสมควรใช้

นอกเหนือจากที่ได้กล่าวมาข้างต้นแล้ว หัวข้อเหล่านี้ก็สมควรที่จะเรียกใช้อัตโนมัติเช่นกัน

Build Automation Tools

Build tools สามารถเรียกได้ว่าเป็นศูนย์รวมสคริปต์ต่างๆที่สามารถที่จะรองรับงานทั่วไปในการพัฒนาโปรแกรม build tool นั้นไม่ได้เป็นส่วนหนึ่งของโปรแกรม แต่เป็นเครื่องมือที่จะช่วยในการทำงานต่างๆในโปรแกรมของคุณแทนที่คุณ

สำหรับเครื่องมือในการ build automation นั้นได้มีโครงการ open source อยู่มากมาย มีบางโครงการได้เขียนโดยใช้ PHP และบางโครงการก็ใช้ภาษาอื่นแทน แต่ถ้าการที่ build tools ที่ไม่ได้เขียนในภาษา PHP นั้นได้มีความสามารถที่ดีกว่า คุณก็อย่านำจุดนั้นมาเป็นข้ออ้างที่จะไม่ใช้เครื่องมือนั้นในโปรแกรมของคุณ นี้คือตัวอย่างเครื่องมือเหล่านั้น:

Phing เป็นวิธีที่ง่ายที่สุดที่จะเริ่มต้นการใช้ automated deployment ในโลกของ PHP โดยการใช้ Phing นั้น คุณสามารถควบคุม กระบวนการเหล่านี้ packaging, deployment และ testing จาก build XML ไฟล์ได้อย่างง่าย Phing (ได้แนวคิดมาจาก Apache Ant) นั้นได้มีคำสั่งมากมายที่เราสามารถนำมาใช้ในการติดตั้งหรือเพิ่มเติมโปรแกรมของคุณและสามารถที่จะเพิ่มเติมคำสั่งต่างๆที่คุณต้องการได้อีกด้วย เขียนด้วยภาษา PHP

Capistrano เป็นระบบสำหรับ intermediate-to-advanced programmers เพื่อที่จะเรียกใช้ คำสั่งที่เป็นโครงสร้าง, เหมือนๆกันในหนึ่งหรือหลายๆเครื่อง เครื่องมือนี้ได้ตั้งค่ามาเพื่อสำหรับการติดตั้งโปรแกรม Ruby on Rails, แต่อย่างไรก็ตาม ผู้ใช้เครื่องมือนี้ ก็สามารถที่จะ ติดตั้งระบบ PHP ได้สำเร็จ การที่จะใช้เครื่องมือนี้ได้อย่างดีนั้น คุณจะต้องมีพื้นฐานของ Ruby และ Rake

Dave Gardner’s blog post PHP Deployment with Capistrano เป็นจุดเริ่มต้นการศึกษาที่ดีสำหรับผู้พัฒนาภาษา PHP ที่ต้องการที่จะใช้ Capistrano

Chef เป็นมากกว่าเครื่องมือในการติดตั้ง ยังเป็นเครื่องมือของระบบ Ruby ที่นอกจากทำการติดตั้งโปรแกรมของคุณแล้วยังช่วยในการ ติดตั้งสภาพแวดล้อมของ server ของคุณและยังสามารถติดตั้งระบบ virtual ได้อีกด้วย

ข้อมูลสำหรับ Chef เพื่อนักพัฒนาภาษา PHP:

อ่านเพิ่มเติม:

Continuous Integration

Continuous Integration นั้นคือรูปแบบของการพัฒนาโปรแกรมที่สมาชิกของทีมจะต้องของนำงานที่เขาได้ทำมารวมกันในโครงการอยู่บ่อยๆ อย่างน้อยคุณจะต้องนำงาน ที่คุณทำอยู่นั้นมารวมในโครงการวันละครั้ง ในทึ่สุดก็ในผู้ร่วมทำงานของคุณก็จะนำงานเข้ามาในโครงการบ่อยมากขึ้น สาเหตุที่ต้องนำงานที่คุณทำเข้ามารวมในโครงการบ่อยๆ นั้น ก็เพราะว่าจะช่วยลดปัญหาการที่โปรแกรมเหล่านั้นมาทำงานร่วมกัน และยังทำให้ผู้ร่วมงานของคุณได้ร่วมพัฒนาโปรแกรมที่ทำงานร่วมกันได้อย่างดีมาก

– Martin Fowler

สำหรับ PHP แล้วนั้นได้มีวิธีมากมายในการใช้หลักการ continuous integration เมื่อไม่นานมานี้ Travis CI ได้ช่วยให้การ ใช้ continuous integration นั้นใช้งานได้จริงแม้ว่าจะเป็นโครงการเล็กๆก็ตาม Travis CI เป็น host สำหรับ open source project ที่ใช้ continuous integration และยังได้ทำงานร่วมกับ GitHub และได้มีการสนับสนุนให้ความช่วยเหลือสำหรับภาษาต่างๆ รวมถึง PHP อีกด้วย

อ่านเพิ่มเติม:

Back to Top{.top}

Caching

PHP ได้ทำงานได้เร็วอยู่แล้ว, แต่ bottlenecks สามารถเกิดขึ้นได้เมื่อคุณได้ทำการเชื่อมต่อด้วย remote connections, อ่านไฟล์, และอื่นๆ ต้องขอขอบคุณที่ได้มีเครื่องมือต่างๆมากมายที่คอยช่วยเพิ่มความเร็วให้กับ PHP ในการทำงานในแต่ละช่วงของโปรแกรมของคุณ หรือ แม้กระทั้งจะ ลดการทำงานของคำสั่งบางคำสั่งที่ใช้เวลานานมากในการเรียกใช้คำสั่งเหล่านั้น

Bytecode Cache

เมื่อ PHP ไฟล์ได้ทำการเรียกใช้ การทำงานของ PHP ในระบบนั้นแล้ว จะเริ่มจาก compiled ลงเป็น bytecode (หรือที่เรียกว่า opcode) และคอมพิวเตอร์ก็จะนำ bytecode เหล่านี้ไปใช้ในการทำงาน ถ้า PHP ไฟล์ไม่ได้ถูกแก้ไขแล้ว bytecode นี้ก็จะเหมือนเดิม นั่นก็หมายความว่าการ compilation นั้นจะทำให้เสียทรัพยากรเวลาของ CPU

นั้นก็ถึงเวลาที่ bytecode cache ได้เข้ามามีส่วนช่วยเหลือทำให้ bytecode ที่ได้ถูก compiled ก่อนหน้านี้แล้ว สามารถที่จะถูกเก็บให้อยู่ในหน่วยความจำได้และก็สามารถที่จะ bytecode เหล่านี้มาใช้ได้อีกต่อๆไปเมื่อถูกเรียกใช้ การติดตั้ง bytecode cache นั้นใช้เวลาไม่นาน และโปรแกรมของคุณก็จะทำงานได้เร็วมากขึ้นด้วย นั่นจึงไม่มีเหตุผลเลย ที่คุณจะไม่ใช้ bytecode cache ในโครงการของคุณ

ตั้งแต่ PHP รุ่น 5.5, ได้มี bytecode cache ที่ได้ติดตั้งมาอยู่ใน PHP อยู่แล้ว นั่นก็คือ OPcache แต่ PHP รุ่นก่อนหน้านี้ก็สามารถที่จะนำ OPcache มาใช้ได้

Bytecodes caches ที่เป็นที่นิยม:

Object Caching

ในบางครั้งการที่เราสามารถที่ cache objects ในโปรแกรมของเรานั้นก็จะมีประโยชน์กับโปรแกรมของเราได้ อย่างเช่นการที่เราต้องการเรียกใช้ข้อมูล ที่จะต้องใช้เวลานานในการติดต่ออย่างเช่น การติดต่อกับฐานข้อมูล ซึ่งข้อมูลที่เราได้รับมานั้นจะมีโอกาศที่จะเปลี่ยนได้น้อยมาก คุณจึงสามารถที่จะใช้โปรแกมในการ object caching ได้ในหน่วยความจำที่รวดเร็วที่เราสามารถนำมาใช้ได้ต่อไป ถ้าคุณได้ทำการเก็บข้อมูลใน cache หลังจากที่คุณได้รับมาจากฐานข้อมูลแล้ว ก็จะสามารถเพิ่มความเร็วได้อย่างมากในการเรียกใช้ครั้งต่อๆไป และยังลดการเรียกใช้ติดต่อกับฐานข้อมูลอีกด้วย

นอกจากนี้ bytecode caching ต่างๆที่เป็นที่นิยมนั้น ยังสามารถที่จะช่วยคุณ cache ข้อมูลได้อีกด้วย นั้นก็หมายความว่าเราสามารถนำมาใช้ได้เลย APCu, XCache, และ WinCache ต่างก็ได้มี APIs ที่ใช้ในการเก็บข้อมูลจากโปรแกรม PHP ของคุณเข้าไปใช้ใน cache ของหน่วยความจำอีกด้วย

APCu และ memcached ได้เป็นที่นิยมมากที่สุด APCu นั้นได้เหมาะสมอย่างมากในการใช้ object caching, ได้มี API ที่ใช้งานได้ง่ายในการเพิ่มข้อมูลของ คุณเข้าไปในหน่วยความจำ และยังมีการติดตั้งที่ง่ายและใช้งานได้ง่ายอีกด้วย แต่ APCu นั้นได้มีข้อจำกัดอยู่ที่เซิร์ฟเวอร์ที่ได้ติดตั้งเท่านั้น ส่วน Memcached นั้นจะติดตั้ง เป็น service และสามารถที่จะนำมาเรียกใช้ได้ในเครือข่ายของคุณ นั้นก็หมายความว่า คุณสามารถที่จะเก็บข้อมูลได้ในหน่วยความจำที่ไวมากที่สุดและก็ให้ระบบต่างๆ นั้นเรียกใช้ข้อมูลได้ทันที

แต่ถ้าคุณได้ใช้ PHP ในการทำงานแบบ (Fast-)CGI ในเว็บเซิร์ฟเวอร์ของคุณแล้วละก็ PHP process จะมี cache ในตัวของ PHP process เอง นั้นก็หมายความว่า ข้อมูลจาก APCu นั้นจะไม่สามารถนำมาใช้ระหว่าง processes ต่างๆได้ ในกรณีนี้นั้น คุณจะต้องพิจารณาใช้ memcached แทน เพราะว่า memcached จะไม่เกี่ยวข้องกับ PHP processes

ในการใช้ในเครือข่ายนั้น APCu จะมีความรวดเร็วในการเข้าถึงข้อมูลกว่า memcached แต่ memcached นั้นสามารถที่จะ scale ได้มากและรวดเร็วกว่า ถ้าคุณไม่ได้ใช้ เว็บเซิร์ฟเวอร์หลายๆอันในการใช้โปรแกรมของคุณแล้วละก็ APCu น่าจะเป็นตัวเลือกที่ดีกว่า สำหรับ object caching

ตัวอย่างโปรแกรมในการเรียกใช้ APCu:

<?php
// check if there is data saved as 'expensive_data' in cache
$data = apc_fetch('expensive_data');
if ($data === false) {
    // data is not in cache; save result of expensive call for later use
    apc_add('expensive_data', $data = get_expensive_data());
}

print_r($data);

โปรดทราบว่าใน PHP รุ่นก่อน 5.5 นั้น, APC ได้มีระบบ object cache และ bytecode cache แต่โครงการ APCu นั้นได้สร้่างขึ้นเพื่อนำมาใช้ในรุ่น 5.5 เป็นต้นไป เพราะว่า PHP ได้มี bytecode cache ติดตั้งอยู่แล้วในตัวเอง (OPcache)

เรียนรู้เกี่ยวกับระบบการ object caching ที่เป็นที่นิยม:

Back to Top{.top}

Resources

จาก Source หลัก

บุคคลที่สมควรที่จะติดตาม

Mentoring

PHP PaaS Providers

Frameworks

ผู้พัฒนาโปรแกรมภาษา PHP ส่วนมากได้ใช้ frameworks ในการสร้างโปรแกรมสำหรับเว็บแทนที่จะต้องมาสร้าง framework ใช้เอง Frameworks นั้นจะทำการรวบรวม สิ่งที่มีประโยชน์และเครื่องมือต่างๆให้คุณได้นำมาใช้ในการเขียนโปรแกรมของคุณได้ง่ายมากขึ้น

คุณไม่จำเป็นที่จะต้องใช้ framework ในทุกโครงการของคุณ ในบางครั้งเพียงแค่ PHP โปรแกรมธรรมดาก็สามารถที่จะนำไปใช้งานได้แล้ว แต่ถ้าคุณต้องการที่จะใช้ framework นั้น ก็จะแบ่งได้เป็นสามจำพวก:

Micro-frameworks ส่วนมากจะทำการ route HTTP request ไปยังโปรแกรมของคุณ ผ่านทาง callback, controller, method, และอื่นๆ ให้รวดเร็วที่สุด ในบางครั้ง อาจจะมี libraries อยู่ด้วย เพื่อมาช่วยในการพัฒนาโปรแกรม อย่างเช่น database wrappers อย่างง่ายๆ ส่วนมากจะนำมาใช้ในใน remote HTTP services

แต่ frameworks ส่วนมากก็จะเพิ่มความสามารถให้มากขึ้นไปอีกมากกว่า micro-framework นั้นก็จะทำให้กลายเป็น Full-Stack Frameworks โดยจะได้มี ORMs, Authentication packages และ อื่นๆอีก

Component-based frameworks นั้นจะเป็นการนำ libraries ต่างๆที่มีหน้าที่เดียวนำมารวมกันให้กลายเป็น framework และเราก็สามารถนำ component-based frameworks มารวมกันเพื่อให้กลายเป็น micro- หรือ full-stack framework

Components

ดังที่ได้กล่าวไว้ข้างต้น “Components” คือเป้าหมายในการสร้าง, แจกจ่าย, และการนำโปรแกรมมาใช้ โดย component repositories สำหรับ PHP นั้นได้มีอยู่สองที่ คือ

โดย repositories ทั้งสองที่นั้นได้มีเครื่องมือใน command line ติดตัั้งมาด้วยในการช่วยในการติดตั้งและเพิ่มเติมการทำงานของคุณ และได้อธิบายในหัวข้อ Dependency Management

นอกจากนั้นก็ยังมี component-based frameworks ที่จะยอมให้คุณได้นำมาใช้โดยไม่มีหรือมีข้อกำหนดที่น้อยมาก ยกตัวอย่างเช่น คุณสามารถที่จะใช้ FuelPHP Validation package โดยที่คุณไม่จำเป็นที่จะต้องใช้ FuelPHP framework เลย โครงการเหล่านี้นับว่าเป็น repository สำหรับนำ components มาใช้ในโครงการของคุณอีกด้วย

Back to Top{.top}

Community

ชุมชนผู้พัฒนาภาษา PHP นั้นได้มีจำนวนมากและพร้อมที่จะช่วยเหลือผู้พัฒนาภาษา PHP ที่พึ่งเริ่มต้นที่จะเรียนรู้ คุณสมควรคิดที่จะเข้าร่วม PHP user group (PUG) ในเมืองของคุณ หรือเข้าร่วม PHP conferences ต่างๆเพื่อที่จะเรียนรู้วิธีการเขียนโปรแกรม PHP ที่ถูกต้อง นอกจากนั้นถ้าคุณได้เข้าไปใน IRC ใน #phpc channel บน irc.freenode.com และได้ติดตาม @phpc ใน twitter นอกจากนั้นการที่ได้ออกไปพบผู้พัฒนาภาษา PHP ต่างๆก็จะได้เรียนรู้หัวข้อใหม่ๆ และก็จะได้รู้จักกับเพื่อนหน้าใหม่ต่างๆอีกด้วย นอกจากนั้น ยังมีชุมชมใน Google+ PHP Programmer community และ StackOverflow

อ่านปฏิทินของ the Official PHP Events

PHP User Groups

ถ้าคุณได้อยู่ในเมืองใหญ่ๆแล้วละก็ โอกาศที่ PHP user group อยู่ในเมืองคุณนั้นค่อนข้างมาก แต่ถ้าในที่ๆคุณอยู่นั้นยังไม่มี PUGs นั้น คุณก็สามารถที่จะหา PUGs ได้จาก Google หรือ Meetup.com ถ้าคุณอาศัยอยู่ในเมืองเล็กแล้วละก็ และยังไม่มี PUGs คุณก็สามารถที่จะสร้าง PUGs ได้เลย

อ่านเกี่ยวกับ User Groups บน PHP Wiki

PHP Conferences

ชุมชน PHP นั้นได้ทำการจัดการประชุมขึ้นในระดับภูมิภาคและระดับชาติทั่วโลก ผู้ที่เป็นที่รู้จักอย่างกว้างขวางในชุมชนของ PHP นั้นก็จะมาพูดและแสดงความคิดเห็นในการประชุม ใหญ่ๆอีกด้วย นับว่าเป็นโอกาศที่ดีที่คุณจะได้เรียนรู้โดยตรงจากผู้นำในชุมชนของ PHP

ค้นหา PHP Conference ต่างๆ

Back to Top{.top}