วิธีติดตั้ง XHProf

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

หวังว่าจะช่วยได้นะครับ

 

 

 

Leave a Reply