- โมดูลที่ทำให้สามารถ รันแอปพลิเคชัน 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 ความคิดเห็น
ดูเหมือนจะไม่ใช่ตัวเลือกที่น่าสนใจเท่าไร...
PHP เองก็ใช้หน่วยความจำพื้นฐานค่อนข้างมากอยู่แล้ว และต้นทุนในการเริ่มต้นระบบก็ค่อนข้างสูง จึงจำเป็นต้องมีการจัดการที่เหมาะสมอย่างยิ่ง แต่ถ้าอยู่ในโปรเซสเดียวกับ node โดยเฉพาะในโครงสร้างแบบการติดตั้งปัจจุบันที่ยัด PHP ทั้งก้อนไว้ใน native module แบบนี้ ก็ดูเหมือนว่าภาระจะเพิ่มขึ้นมาก
ถ้าเป็นผม คงแยก
php-fpmไว้เป็นอีกโปรเซสหนึ่งต่างหาก แล้วเขียน fastcgi client ด้วย js เพื่อจัดการแทนน่าจะดีกว่าไลบรารีนี้จะเข้ากันได้ดีกับ Node.js runtime ของ AWS Lambda ไหม?
ถ้าเข้ากันได้ ท้ายที่สุดแล้วก็ดูเหมือนว่าจะสามารถรัน PHP แบบ serverless บน AWS Lambda ได้ด้วย
ถ้าไม่มีเหตุผลที่จะต้องใช้ควบคู่กับ Node.js คุณก็สามารถดีพลอย PHP runtime ลงบน Lambda ได้เช่นกัน https://bref.sh