การวัด Performance: ใช้ Xdebug Profiler
ในบทที่แล้ว เราได้เรียนรู้วิธีการใช้ Redis เพื่อ Caching ข้อมูลใน PHP เพื่อเพิ่มความเร็วให้กับ Application ของเรา ในบทนี้ เราจะมาเรียนรู้วิธีการใช้ Xdebug Profiler ซึ่งเป็นเครื่องมือที่ช่วยให้เราสามารถวัด Performance ของ Code PHP ได้อย่างละเอียด เพื่อหาจุดที่ทำให้ Application ของเราทำงานช้า และนำไปปรับปรุงแก้ไขให้มีประสิทธิภาพมากยิ่งขึ้น
ทำไมต้องวัด Performance?
การวัด Performance เป็นสิ่งสำคัญอย่างยิ่งในการพัฒนา Web Application เพราะช่วยให้เรา:
- ระบุจุดที่ทำให้ Application ทำงานช้า (Bottleneck)
- เปรียบเทียบ Performance ก่อนและหลังการปรับปรุง Code
- เข้าใจการทำงานของ Code ในเชิงลึก
- ปรับปรุง User Experience โดยรวม
Xdebug Profiler เป็นเครื่องมือที่ทรงพลังที่ช่วยให้เราเห็นภาพรวมของ Performance ของ Application ได้อย่างชัดเจน
การติดตั้ง Xdebug
ก่อนที่เราจะเริ่มใช้งาน Xdebug Profiler ได้ เราต้องทำการติดตั้ง Xdebug Extension ก่อน วิธีการติดตั้งจะแตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการและ PHP Version ที่คุณใช้งาน
สำหรับ Linux (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install php-xdebug
สำหรับ macOS (Homebrew):
brew install php-xdebug
สำหรับ Windows:
สำหรับ Windows คุณจะต้องดาวน์โหลด Xdebug DLL ที่เหมาะสมกับ PHP Version ของคุณจากเว็บไซต์ Xdebug อย่างเป็นทางการ: https://xdebug.org/download
หลังจากดาวน์โหลด DLL แล้ว ให้ทำตามขั้นตอนเหล่านี้:
- วาง DLL file ไว้ใน directory
extของ PHP (เช่นC:\php\ext) - แก้ไข
php.inifile และเพิ่มบรรทัดต่อไปนี้:zend_extension=php_xdebug-3.2.2-8.1-vs16-x86_64.dll xdebug.mode=develop,profile xdebug.start_with_request=yes xdebug.output_dir="C:\tmp" ; เปลี่ยนเป็น directory ที่คุณต้องการเก็บ Profiler Outputสำคัญ: เปลี่ยน
php_xdebug-3.2.2-8.1-vs16-x86_64.dllให้ตรงกับชื่อไฟล์ที่คุณดาวน์โหลดมา และC:\tmpเป็น directory ที่คุณต้องการเก็บ Profiler Output - Restart Web Server (เช่น Apache หรือ Nginx)
ตรวจสอบการติดตั้ง:
หลังจากติดตั้ง Xdebug แล้ว ให้ตรวจสอบว่า Xdebug ถูกเปิดใช้งานอย่างถูกต้อง โดยสร้างไฟล์ phpinfo.php ที่มี Code ดังนี้:
<?php
phpinfo();
?>
เปิดไฟล์นี้ผ่าน Web Browser ของคุณ และค้นหาคำว่า "Xdebug" หาก Xdebug ถูกติดตั้งอย่างถูกต้อง คุณจะเห็นข้อมูลเกี่ยวกับ Xdebug Extension
การใช้งาน Xdebug Profiler
เมื่อ Xdebug ถูกติดตั้งและเปิดใช้งานแล้ว เราก็สามารถเริ่มใช้งาน Profiler ได้ โดย Xdebug จะสร้าง Profiler Output File ซึ่งเป็นไฟล์ที่เก็บข้อมูลเกี่ยวกับ Performance ของ Code PHP ในระหว่างการทำงาน
การตั้งค่า Xdebug สำหรับ Profiler:
ตรวจสอบให้แน่ใจว่า xdebug.mode ใน php.ini ถูกตั้งค่าเป็น develop,profile และ xdebug.start_with_request ถูกตั้งค่าเป็น yes ซึ่งจะทำให้ Xdebug เริ่มทำการ Profiling ทุกครั้งที่มี Request เข้ามา
การเรียกใช้งาน Profiler:
เมื่อคุณเรียกใช้งาน PHP Script ผ่าน Web Browser หรือ Command Line Xdebug จะทำการ Profiling และสร้าง Profiler Output File ใน Directory ที่ระบุใน xdebug.output_dir (เช่น C:\tmp ในตัวอย่างก่อนหน้า)
ชื่อไฟล์ Profiler Output:
ชื่อไฟล์ Profiler Output จะมีรูปแบบเป็น cachegrind.out.xxxxxxxxxx โดย xxxxxxxxxx เป็น String ที่ Generate ขึ้นมาแบบสุ่ม
การวิเคราะห์ผลลัพธ์ Profiler
Profiler Output File เป็นไฟล์ Binary ที่เราไม่สามารถอ่านได้โดยตรง เราต้องใช้เครื่องมือพิเศษในการวิเคราะห์ข้อมูลในไฟล์นี้ เครื่องมือที่นิยมใช้กันคือ:
- KCachegrind (Linux): เป็นเครื่องมือ Open Source สำหรับ Linux
- Webgrind: เป็น Web Application ที่สามารถแสดงผล Profiler Output ใน Web Browser
- PhpStorm: เป็น IDE ที่มี Built-in Support สำหรับ Xdebug Profiler
ในบทนี้ เราจะใช้ Webgrind เป็นตัวอย่างในการวิเคราะห์ผลลัพธ์ Profiler
การติดตั้ง Webgrind:
- ดาวน์โหลด Webgrind จาก GitHub: https://github.com/jokkedk/webgrind
- Extract ไฟล์ที่ดาวน์โหลดมาไว้ใน Web Server Directory (เช่น
/var/www/html/webgrind) - แก้ไข
config.phpใน Webgrind Directory และกำหนดค่า$dataDirให้ชี้ไปยัง Directory ที่เก็บ Profiler Output Files (เช่นC:\tmp) - เปิด Webgrind ผ่าน Web Browser (เช่น
http://localhost/webgrind)
การวิเคราะห์ข้อมูลด้วย Webgrind:
เมื่อเปิด Webgrind แล้ว คุณจะเห็น List ของ Profiler Output Files ที่สร้างขึ้น เลือกไฟล์ที่คุณต้องการวิเคราะห์
Webgrind จะแสดงข้อมูลต่างๆ เกี่ยวกับ Performance ของ Code PHP ของคุณ เช่น:
- Call Graph: แสดงภาพรวมของ Function Calls และเวลาที่ใช้ในแต่ละ Function
- Function List: แสดง List ของ Function ทั้งหมดที่ถูกเรียกใช้งาน พร้อมกับเวลาที่ใช้ในแต่ละ Function
- Callers/Callees: แสดง Function ที่เรียก Function ปัจจุบัน และ Function ที่ถูกเรียกโดย Function ปัจจุบัน
การหา Bottleneck:
มองหา Function ที่มี "Self Cost" สูง ซึ่งหมายถึง Function ที่ใช้เวลาในการทำงานมากที่สุด โดยไม่รวมเวลาที่ใช้ใน Function ที่ถูกเรียกโดย Function นั้น
ตัวอย่างการใช้งาน:
สมมติว่าเรามี Code PHP ดังนี้:
<?php
function slowFunction() {
usleep(500000); // Simulate a slow operation
}
function processData($data) {
for ($i = 0; $i < 1000; $i++) {
slowFunction();
// Some other data processing logic
}
return $data;
}
$data = ['item1', 'item2', 'item3'];
$result = processData($data);
echo "Result: " . implode(", ", $result);
?>
เมื่อเราเรียกใช้งาน Script นี้ และวิเคราะห์ Profiler Output ด้วย Webgrind เราจะพบว่า Function slowFunction มี Self Cost สูงมาก ซึ่งบ่งชี้ว่า Function นี้เป็น Bottleneck ที่ทำให้ Application ทำงานช้า
การแก้ไข Bottleneck:
หลังจากที่เราพบ Bottleneck แล้ว เราสามารถทำการปรับปรุง Code เพื่อลดเวลาในการทำงานของ Function นั้นได้ ในตัวอย่างนี้ เราสามารถปรับปรุง slowFunction ให้ทำงานได้เร็วขึ้น หรือหลีกเลี่ยงการเรียกใช้งาน Function นี้บ่อยๆ
ข้อผิดพลาดที่พบบ่อย:
- Profiler Output File ไม่ถูกสร้าง: ตรวจสอบว่า Xdebug ถูกติดตั้งและตั้งค่าอย่างถูกต้อง และ
xdebug.modeถูกตั้งค่าเป็นdevelop,profile - Webgrind ไม่แสดง Profiler Output File: ตรวจสอบว่า
$dataDirในconfig.phpของ Webgrind ถูกตั้งค่าให้ชี้ไปยัง Directory ที่เก็บ Profiler Output Files อย่างถูกต้อง
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการใช้ Xdebug Profiler เพื่อวัด Performance ของ Code PHP และวิเคราะห์ผลลัพธ์ด้วย Webgrind การใช้ Xdebug Profiler เป็นทักษะที่สำคัญสำหรับนักพัฒนา PHP ทุกคน เพราะช่วยให้เราสามารถระบุและแก้ไข Bottleneck ที่ทำให้ Application ทำงานช้า และปรับปรุง Performance โดยรวมของ Application ได้
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ Refactoring และเทคนิคต่างๆ ในการปรับปรุง Code ให้สะอาดและอ่านง่าย