php-node - แฮนด์เลอร์สำหรับจัดการคำขอ HTTP ของ PHP ภายใน Node.js
(github.com/platformatic)- โมดูลที่ทำให้สามารถ รันแอปพลิเคชัน 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 ต่าง ๆ
- คลาส
Phpnew 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