ป้ายกำกับ: ZEND_ECHO

PHP: JIT (Just-In-Time) CompilationPHP: JIT (Just-In-Time) Compilation

PHP JIT (Just-In-Time) Compilation คือหนึ่งในฟีเจอร์ที่ยิ่งใหญ่ที่สุดที่มีการเพิ่มเข้ามาใน PHP 8.0 มันคือการปฏิวัติรูปแบบการทำงานของ PHP จากเดิมที่เป็นภาษาแบบสคริปต์แปลความหมาย (Interpreted Language) ให้สามารถแปลงโค้ดเป็นภาษาเครื่อง (Machine Code) ได้โดยตรงในระหว่างการทำงาน

บทความนี้จะพาคุณไปเจาะลึกว่า JIT คืออะไร ทำงานอย่างไร และสถาปัตยกรรมนี้เปลี่ยนโฉม PHP ไปมากแค่ไหนครับ


ก่อนจะมี JIT: PHP ทำงานอย่างไร?

เพื่อความเข้าใจที่ชัดเจน เรามาดูการเดินทางของโค้ด PHP ในอดีต (ตั้งแต่ PHP 7.x ลงไป) กันก่อน โดยปกติแล้ว PHP จะทำงานผ่านระบบที่เรียกว่า Zend VM (Virtual Machine) ตามขั้นตอนดังนี้

  1. PHP Source Code
  2. Tokens & AST
  3. Opcodes
  4. Zend VM Execution
  1. Compilation (OPcache): เมื่อมี Request เข้ามา PHP จะอ่านโค้ด (.php) แล้วแปลงให้กลายเป็นรหัสที่เรียกว่า Opcodes (เช่น ZEND_ADD, ZEND_ECHO)
  2. Execution: Zend VM จะรับ Opcodes เหล่านั้นไปแปลงเป็น Machine Code (ภาษาที่ CPU เข้าใจ) อีกทีหนึ่ง ณ ตอนนั้นเลย แล้วจึงสั่งให้ CPU ประมวลผล

ปัญหาคืออะไร

ทุกครั้งที่ Zend VM รัน Opcodes มันจะต้องเสียเวลาบวกกับมี Overhead ในการแปลคำสั่งเหล่านั้นซ้ำแล้วซ้ำเล่า แม้ว่าเราจะมี OPcache ช่วยแคช Opcodes ไว้ในหน่วยความจำเพื่อไม่ต้องคอมไพล์โค้ดใหม่ แต่ในขั้นตอนการรัน (Execution) Zend VM ก็ยังต้องทำหน้าที่เป็นล่ามคอยแปลส่งให้ CPU อยู่ดี


JIT เข้ามาช่วยตอนไหน?

JIT (Just-In-Time) เข้ามาแทรกแซงในขั้นตอนการทำงานของ Zend VM ครับ แทนที่จะปล่อยให้ Zend VM คอยแปล Opcode ทีละบรรทัด JIT จะเข้ามาแอบดูว่า “มี Opcode ส่วนไหนที่ถูกเรียกใช้งานบ่อย ๆ บ้าง?” (เรียกว่า Hot Spots)

เมื่อ JIT เจอโค้ดส่วนที่ทำงานบ่อยๆ มันจะทำการคอมไพล์ Opcode ส่วนนั้นให้กลายเป็น Machine Code โดยตรงเพียงครั้งเดียว แล้วเซฟเก็บไว้ใน CPU Cache เลย พอครั้งต่อไปโค้ดส่วนเดิมนั้นทำงาน PHP จะข้าม Zend VM ไปเลย แล้วส่ง Machine Code ให้ CPU ประมวลผลทันทีด้วยความเร็วสูงสุด


รูปแบบการทำงานของ PHP JIT

ใน PHP JIT มีรูปแบบการทำงานหลักๆ อยู่ 2 โหมด (ปรับแต่งผ่าน php.ini)

Function JIT

  • หลักการ: JIT จะพิจารณาและคอมไพล์โค้ดเป็นระดับ “ฟังก์ชัน” * หากฟังก์ชันไหนถูกเรียกใช้งานบ่อย ๆ มันจะยกฟังก์ชันนั้นทั้งดุ้นไปแปลงเป็น Machine Code

Tracing JIT (แนะนำและเป็นค่าเริ่มต้น)

  • หลักการ: JIT จะฉลาดกว่านั้น โดยมันจะไม่มองทั้งฟังก์ชัน แต่มันจะคอยมองหา “เส้นทางการทำงาน (Traces)” หรือลูปที่หมุนซ้ำๆ
  • โหมดนี้มีประสิทธิภาพสูงกว่ามากสำหรับแอปพลิเคชันทั่วไป เพราะมันเจาะจงเฉพาะจุดที่เป็นคอขวด (Bottleneck) จริง ๆ

IT ทำให้เว็บทั่วไป (เช่น Laravel, WordPress) เร็วขึ้นไหม?

นี่คือเรื่องที่น่าประหลาดใจที่สุด: สำหรับเว็บแอปพลิเคชันส่วนใหญ่ JIT แทบจะไม่ได้ช่วยให้เร็วขึ้นอย่างเห็นได้ชัดเลย

ทำไมถึงเป็นแบบนั้น? เราต้องแยกประเภทคอขวดของแอปพลิเคชันออกเป็น 2 แบบครับ

ประเภทคอขวด (Bottleneck)ลักษณะการทำงานJIT ช่วยไหม?
I/O-Boundเสียเวลาไปกับการรอ Database, การอ่านไฟล์, การส่ง API, การรับส่งข้อมูลเครือข่าย (Web Application ทั่วไปเป็นแบบนี้ 90%)ไม่ช่วย เพราะ JIT ช่วยให้คำนวณเร็วขึ้น แต่ไม่ได้ช่วยให้ฐานข้อมูลตอบสนองเร็วขึ้น
CPU-Boundเสียเวลาไปกับการคำนวณทางคณิตศาสตร์, การประมวลผลภาพ, การเข้ารหัส, การจัดการข้อความขนาดใหญ่, AI/Machine Learningช่วยได้อย่างมหาศาล (เร็วขึ้นได้ตั้งแต่ 2 เท่า ไปจนถึง 10+ เท่าในบาง Algorithm)

ถ้าอย่างนั้น JIT มีประโยชน์อย่างไรในปัจจุบัน?

การมาของ JIT ไม่ใช่แค่เรื่องของการทำเว็บให้เร็วขึ้น แต่เป็นการเปิดประตูบานใหม่ให้กับภาษา PHP ไปสู่ดินแดนที่ไม่เคยไปได้มาก่อน

  • Data Science & Machine Learning: ทำให้ PHP สามารถเขียนอัลกอริทึมซับซ้อนเพื่อประมวลผลข้อมูลขนาดใหญ่ได้โดยไม่ต้องพึ่งพาภาษาอื่น
  • Asynchronous & Long-running Processes: เสริมพลังให้กับเครื่องมืออย่าง Swoole, RoadRunner หรือ Amp ในการทำเว็บเซิร์ฟเวอร์ความเร็วสูง
  • Image/Video Processing: การจัดการไฟล์มัลติมีเดียบนฝั่ง Server ทำได้รวดเร็วขึ้นอย่างมาก

วิธีเปิดใช้งาน JIT (PHP 8.0 ขึ้นไป)

JIT จะถูกปิดไว้เป็นค่าเริ่มต้น (เพราะต้องใช้หน่วยความจำเพิ่มขึ้น) หากต้องการเปิดใช้งาน ให้ไปแก้ไขไฟล์ php.ini ดังนี้

# ต้องเปิดใช้งาน OPcache ก่อนเสมอ
opcache.enable=1
opcache.enable_cli=1

# กำหนดขนาดหน่วยความจำที่จะให้ JIT ใช้ (เช่น 100 Megabytes)
opcache.jit_buffer_size=100M

# กำหนดโหมดการทำงาน (1254 คือค่าที่แนะนำสำหรับ Tracing JIT)
opcache.jit=1254

สรุป

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


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