XHProf คืออะไร?
สั้นๆ คือมันเป็นเครื่องมือกลุ่ม Profiler หรือ Performance analysis ซึ่งไว้ใช้ตรวจสอบว่าโค้ด PHP ของเราทำงานช้าตรงไหน มันสามารถบอกได้ในระดับ Function หรือ Method โดยบอกได้ว่าถูกเรียกกี่ครั้ง ใครเป็นคนเรียก ใช้เวลาในการทำงานส่วนนั้นนานเท่าไร และสามารถออกเป็นกราฟเพื่อดูได้ง่ายขึ้น เป้าหมายคือใช้ดูว่าโค้ดส่วนไหนเขียนดีหรือไม่ดี ยังสามารถปรับ pattern ได้ไหม คุ้มไหมที่จะทำ อะไรที่มันช้า คุณสามารถใช้สิ่งนี้กับพวก Legacy code ได้ โดยไม่ต้องไปงมโข่งว่าอะไรที่ช้า
โดยส่วนประกอบของ XHProf มี 2 ส่วน คือ ส่วน PHP Extension กับส่วน Report ซึ่งในบทความนี้จะบอกวิธีการติดตั้งทั้งหมดให้ใช้งานได้จริงและง่ายที่สุด
คำเตือน เจ้าของบล็อกเป็นพวกชอบ Ubuntu ดังนั้นใครใช้ OS อื่นก็เอาตัวรอดกันเองนะครับ และผมมักจะไม่ sudo su เพราะถือว่าเป็นคำสั่งที่หลวมมากๆ คุณควรใช้สิทธิ์ root เมื่อจำเป็นเท่านั้น
วิธีการติดตั้ง XHProf ส่วน PHP Extension
คำเตือน หวังว่าคนอ่านจะสามารถโหลด PHP Extension เป็นนะ
ก่อนอื่น โปรดมั่นใจก่อนว่าสามารถรันคำสั่ง pecl ได้ ซึ่งถ้ารันไม่ได้ให้พิมพ์คำสั่งดังนี้
sudo apt-get install pear sudo apt-get install php5-dev
จากนั้นให้ติดตั้ง XHProf ผ่านทาง PECL ด้วยคำสั่งนี้
sudo pecl install -f xhprof
เมื่อติดตั้งเสร็จก่อนเราจะโหลด extension เข้า PHP ให้เราสร้างโฟลเดอร์สำหรับเก็บ log ที่ตัว XHProf มันสร้างขึ้นมา ในที่นี้ผมจะสร้างไว้ในโฟลเดอร์ home ของ account ของเราเอง และกำหนด permission ให้มัน
mkdir ~/xhprof
เสร็จแล้ว ให้ทำการสร้างไฟล์ mod สำหรับ load เข้า PHP ซึ่งวิธีการผมจะไม่บอกนะ เพราะบางคนใช้ Apache โหลด PHP Module บางคน PHP-FPM หรืออะไรก็ตาม สรุปข้างในไฟล์ ini ให้เขียนแบบนี้
extension = xhprof.so xhprof.output_dir="/home/<your_username>/xhprof"
ให้เราแทนค่า <your_username> ด้วยชื่อ account ที่เราใช้ล็อกอินเข้า Ubuntu ครับ จากนั้นให้บันทึก
สุดท้ายคือรีสตาร์ท Apache หรือ PHP ครับ อันนี้ตามสะดวกเลย
วิธีการติดตั้ง XHProf ส่วนออกหน้ารายงาน
ก่อนอื่นนี้เป็นเรื่องสำคัญมาก สำหรับคนที่มีหลายเว็บอยู่ภายในเครื่องทดสอบ คุณควรมีโดเมนกลางสำหรับโฟลเดอร์ /var/www
ด้วย เพื่อที่ XHProf ส่วนที่ออกรายงานจะได้ถูกวางไว้ตรงนั้นเพื่อให้เรียกดูได้ง่ายๆ จากทุกโปรเจ็ค
ดังนั้นในส่วนนี้ผมจะเขียนโดยอ้างอิงว่าผมจะวางตัวออกรายงานไว้ที่ /var/www/xhprof
และจะถูกเรียกด้วย http://localhost/xhprof
อันนี้เป็นอันเข้าใจตรงกันนะครับว่าต้องเซ็ตให้เข้าถึงได้แล้วนะครับ ส่วนโปรเจ็คอื่นๆ ของผมจะอยู่ภายใต้ /var/www
เหมือนกัน เช่น /var/www/ethaizone.com
เป็นต้นครับ
ก่อนอื่นสร้างโฟลเดอร์ xhprof แต่เราจะนำโค้ดลงมาด้วยการ git clone แทนเพื่อความง่าย
cd /var/www git clone https://github.com/facebook/xhprof xhprof
เราจะได้โค้ดส่วนออกรายงานมาอยู่ใน /var/www/xhprof
แล้ว
จากนั้นสิ่งที่จะขาดไม่ได้ ให้ติดตั้ง graphviz ด้วย เพราะต้องใช้ในการสร้าง Callgraph เพื่อออกรายงาน
sudo apt-get install graphviz
เสร็จในส่วนนี้ครับ
วิธีการสร้างตัวเริ่มจับ Profiler ของ XHProf
หลังจากที่เราได้ทั้งหมดมานี้ XHProf จะยังไม่เริ่มจับ Profiler เลย เราจึงต้องมีโค้ด PHP ส่วนหนึ่งที่เอามาคลุมหัวท้าย ซึ่งหลายบทความที่ผมอ่านเจอมา มักจะบอกให้เราเอาโค้ดแปะหัวท้าย index.php ของแต่ละโปรเจ็คเอง แต่ผมว่ามัน “ยุ่งยาก” เกินไป ดังนั้นเรามาทำให้มันใช้งานได้ง่ายขึ้นดีกว่า
โดยเทคนิคที่ผมจะใช้คือการทำ php auto prepend และ append เพื่อที่เราจะไม่ต้องไปแทรกโค้ดเองในทุกโปรเจ็ค แล้วจึงคุมการทำงานด้วยการเช็ค cookie ว่ามีหรือไม่มี
เริ่มกันเลย
nano /var/www/xhprof/header.php
แล้ววางโค้ดตามนี้
<?php if (extension_loaded('xhprof') && isset($_COOKIE['xhprof']) && $_COOKIE['xhprof'] == 'omg' && stripos($_SERVER['REQUEST_URI'], 'xhprof') === false) { include_once '/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php'; include_once '/var/www/xhprof/xhprof_lib/utils/xhprof_runs.php'; xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); }
แก้ชื่อคุ๊กกี้กับค่าที่ใช้ตรวจสอบให้เป็นของตัวเอง (เพื่อความปลอดภัย) แล้วทำการบันทึก จากนั้นสร้างอีกไฟล์
nano /var/www/xhprof/footer.php
แล้ววางโค้ดนี้ครับ
<?php if (extension_loaded('xhprof') && isset($_COOKIE['xhprof']) && $_COOKIE['xhprof'] == 'omg' && stripos($_SERVER['REQUEST_URI'], 'xhprof') === false) { $profiler_namespace = 'myapp'; // namespace for your application $xhprof_data = xhprof_disable(); $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace); // url to the XHProf UI libraries (change the host name and path) $profiler_url = sprintf('http://localhost/xhprof/xhprof_html/?run=%s&source=%s', $run_id, $profiler_namespace); echo '<a href="'. $profiler_url .'" target="_blank">Profiler output</a>'; }
แก้ชื่อคุ๊กกี้กับค่าที่ใช้ตรวจสอบให้เป็นของตัวเอง (เพื่อความปลอดภัย) และค่าต้องเหมือนใน header.php ข้างบนนะครับ แล้วทำการบันทึก
จากนั้นผมจะเพิ่ม auto prepend ลง .htaccess
nano /var/www/.htaccess
แล้วเพิ่มโค้ดส่วนนี้
php_value auto_prepend_file "/var/www/xhprof/header.php" php_value auto_append_file "/var/www/xhprof/footer.php"
จากนั้นให้บันทึก เท่าที่ก็เสร็จแล้วครับ
ทดลองใช้ XHProf ครั้งแรก
อันนี้ง่ายๆ เลยครับ หา browser สักตัว เปิดเว็บในเครื่องสักเว็บ เสร็จแล้วแก้ cookie เพิ่มอันใหม่ชื่อ xhprof พร้อมค่าที่คุณกำหนดไว้ในไฟล์ header.php แล้วให้เปิดหน้าเว็บใหม่อีกที ถ้าคุณเลื่อนลงมาล่างสุด คุณส่วนเจอลิงก์คำว่า Profiler output ให้กดลิงก์เลย ถ้าคุณทำถูกต้อง มันจะแสดงในหน้าเว็บเป็นรายงานให้คุณดูได้เลย
ส่วนในกรณีคุณเจอ error ที่เกี่ยวข้องกับ permission ของ XHProf ให้ทำการรันสองคำสั่งนี้ครับ
sudo chown www-data ~/xhprof/ -R sudo chown www-data /var/www/xhprof/ -R
หวังว่าจะช่วยได้นะครับ