5 คะแนน โดย xguru 2025-05-31 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • โมดูลที่ทำให้สามารถ รันแอปพลิเคชัน PHP ภายในแอปพลิเคชัน Node.js ในโปรเซสเดียวกัน เพื่อให้ Node.js และ PHP สื่อสารกันได้ โดยไม่ต้องเชื่อมต่อผ่านเครือข่าย
    • ทำให้การสื่อสารสองทาง, สถาปัตยกรรมแบบไฮบริด, การนำทรัพยากร PHP แบบเลกาซีมาใช้ต่อ และการย้ายระบบทำได้ง่ายขึ้น
    • ด้วยวิธีนี้สามารถสร้างสถาปัตยกรรมเว็บแอปแบบไฮบริดได้หลากหลาย เช่น ผสาน WordPress เข้ากับฟรอนต์เอนด์ Next.js
  • รองรับทั้ง แบบอะซิงโครนัส (handleRequest) และ แบบซิงโครนัส (handleRequestSync) (แบบซิงโครนัสจะบล็อกเธรดของ Node.js)
  • รองรับเป็นหลักบน x64 Linux, x64/arm64 macOS และต้องติดตั้งไลบรารีระบบบางส่วนที่เกี่ยวข้องกับ PHP
  • สามารถสร้าง/จัดการออบเจ็กต์ HTTP เช่น Request/Response/Headers ได้โดยตรงจาก Node.js เพื่อเชื่อมต่อกับแอปพลิเคชัน PHP ได้อย่างเป็นธรรมชาติ
  • วิธีใช้งาน
    // สร้างอินสแตนซ์ `Php` แล้วประมวลผลคำขอ PHP ด้วย `handleRequest()`  
    // ใช้ออบเจ็กต์ `Request`, `Response` เพื่อจัดการข้อมูลคำขอ/คำตอบ HTTP โดยตรง  
    import { Php, Request } from '@platformatic/php-node'  
    
    const php = new Php()  
    const request = new Request({  
      url: 'http://example.com/foo/bar',  
      headers: { 'X-Test': ['Hello, from Node.js!'] }  
    })  
    const response = await php.handleRequest(request)  
    console.log(response.body.toString())  
    
  • ตัวอย่างการใช้งาน
    • ผสาน CMS ที่พัฒนาด้วย PHP (เช่น WordPress) เข้ากับฟรอนต์เอนด์ Node.js (เช่น Next.js) หรือค่อย ๆ ย้ายแอป PHP แบบเลกาซีไปยัง Node.js
    • เหมาะกับการสื่อสารในหน่วยความจำระหว่างสองสภาพแวดล้อมโดยไม่มี network overhead รวมถึงการเชื่อมต่อกับ API gateway, SSR และคัสตอมแบ็กเอนด์
  • API ต่าง ๆ
    • คลาส Php
      • new Php(config): สามารถระบุการตั้งค่า เช่น docroot ได้
      • php.handleRequest(request): ประมวลผลคำขอแบบอะซิงโครนัส (คืนค่า Promise)
      • php.handleRequestSync(request): ประมวลผลแบบซิงโครนัส (บล็อกเธรด)
    • คลาส Request
      • สามารถกำหนด HTTP method, url, headers, body ได้
      • เข้าถึงแต่ละพร็อพเพอร์ตีได้โดยตรง (เช่น request.method, request.body)
    • คลาส Response
      • มีพร็อพเพอร์ตีอย่าง status, headers, body, log เป็นต้น
      • สามารถสร้างเองได้ด้วยมือ (ใช้ในการทดสอบหรือจัดการข้อผิดพลาด)
    • คลาส Headers
      • รองรับเมธอดจัดการ HTTP header หลายแบบ เช่น set, add, get, getAll, has, delete
      • สามารถจัดการ header แบบเป็นชุดได้ผ่าน iterator API เช่น entries, keys, values, forEach

3 ความคิดเห็น

 
nemorize 2025-05-31

ดูเหมือนจะไม่ใช่ตัวเลือกที่น่าสนใจเท่าไร...

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

ถ้าเป็นผม คงแยก php-fpm ไว้เป็นอีกโปรเซสหนึ่งต่างหาก แล้วเขียน fastcgi client ด้วย js เพื่อจัดการแทนน่าจะดีกว่า

 
letaem77a 2025-05-31

ไลบรารีนี้จะเข้ากันได้ดีกับ Node.js runtime ของ AWS Lambda ไหม?

ถ้าเข้ากันได้ ท้ายที่สุดแล้วก็ดูเหมือนว่าจะสามารถรัน PHP แบบ serverless บน AWS Lambda ได้ด้วย

 
savvykang 2025-05-31

ถ้าไม่มีเหตุผลที่จะต้องใช้ควบคู่กับ Node.js คุณก็สามารถดีพลอย PHP runtime ลงบน Lambda ได้เช่นกัน https://bref.sh