สำหรับ php ทุกคนคงรู้จักกันอยู่แล้ว แต่สำหรับใครที่ยังไม่รู้จัก หรือเริ่มศึกษา php แนะนำให้เริ่มศึกษาจากบทเรียนนี้ บทเรียน PHP พื้นฐาน
Swoole คืออะไร มาดูคำอธิบายกันแบบย่อกัน
Swoole คือ Network Framework หรือส่วนเสริมของ PHP ที่ทำให้การใช้งาน PHP แบบ Asynchronousได้ (จะ syn หรือ asyn อ่านเพิ่มเติมความหมายกลางๆ ของมันตามลิงค์) ทำให้ php เป็น Web Server ในตัวได้ และ ทำให้เขียน php แบบ non-blocking I/O programming, multiple threads ได้ ทำให้เขียน PHP แบบ ไม่ต้องรอโหลดให้เสร็จแล้วไปทำโหลดที่สองได้เลยทำงานแบบคู่ขนานกันก็ได้
ถ้าใครยังงงอยุ่ อ่านต่อตรงนี้ ปกติเวลาเราเขียนเว็บ เราก็จะใช้ php คู่กับ Web Server อย่าใช่ IIS, Apache, Nginx เป็นตัวส่ง Response ไปให้ Client ใช่ไหมครับ เจ้า Swoole มันคือส่วนเสริมของ php ที่มาทำหน้านี้แทนนั่นเอง และ ที่พักความสามารถมาด้วย คือ มันทำงานในโหมด asynchronously นั่นหมายความว่า PHP ก็จะรองรับโหลดได้เพิ่มขึ้นอย่างมหาสาร ดูภาพด้านล่าง
ทีนี้แล้วมันเกี่ยวอะไร กับหัวข้อบทความ ในวันนี้
ปกติการเขียน API เราต้องการ Performance สูงกว่ามากๆ เพื่อร้องรับการเรียกใช้งานจากหลายๆ ที ได้ในปริมาณมากๆ ใช่ไหมครับ ดังนั้นถ้าเราปรับให้ PHP รันในรูปแบบ asynchronously แทน synchronous ตามภาพด้านบนได้ก็จะทะลายขีดจำกัดของ php ที่ถูกอั้นไว้ได้ จะทำให้ PHP รองรับโหลดเพิ่มขึ้นอีกหลายเท่า ได้นั่นเอง (บางการทดสอบ รองรับโหลดเพิ่มขึ้นมากขึ้นถึง 30 เท่า) มันจึงเหมาะสำหรับนำ PHP มาเขียนเป็น API นั่นเอง
ตามหัวข้อ " เขียน API ด้วย PHP อย่างไรให้รองรับ Load มากกว่า Node.js "
คำตอบมัน คือ ใช้ PHP + Swoole ซิครับ
เอาตัวอย่าง การเปรีบเทียบ โหลด PHP 7 + Nginx vs PHP7 + Swoole vs Node.js vs Node.js + Nginx มาให้ดูกัน
ก่อนดูกราฟ ดูโค้ดตัวอย่างง่ายๆ กันก่อน (การทำงานอืนๆ ไม่ว่า คำนวณ พวกค่า array และ การทำงานกับไฟล์ ฐานข้อมูลก็ได้ผลในทิศทางเดียวกัน)
ตัวอย่างโค้ด PHP
echo "Hello World!";
ตัวอย่างโค้ด PHP+Swoole
$http = new swoole_http_server('0.0.0.0', 9000);
$http->on('request', function ($request, $response) {
$response->header('Content-Type', 'text/plain; charset=utf-8');
$response->end('Hello World');
});
echo "Server run on port 9000";
$http->start();
ตัวอย่างโค้ด Node.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8000);
ทดสอบได้ผลตามกราฟด้านล่างนี้ (ใต้กราฟ ใส่รายละเอียด Server ที่ทดสอบและรายละเอียดต่างๆไว้ให้ด้วยนะ)
จากกราฟจะเห็นว่า PHP7+Swoole (Requests/sec: 28,553.42) รองรับโหลด ได้สูงกว่า Node.js (Requests/sec: 9,986.45) เกือบ 3 เท่า
ส่วนถ้าใช้งาน ผ่าน Web Server อย่าง Nginx ผลของ PHP (Requests/sec: 6,752.42) และ Node.js (Requests/sec: 3130.38) PHP ก็รองรับโหลดได้เยอะ Node.js สองเท่ากว่าๆ เลยทีเดียว
แต่ถ้าเราใช้ Freamework ที่โหลดหนัก อย่าง Laravel ความสามารถในการรองรับโหลดก็จะลดลงอย่างมาก เพราะฉนั้นพิจารณาการใช้ Framework PHP ให้เหมาะกับงาน ด้วยนะครับ ในเว็บ Mindphp.com เองก็มีสอน Framework อยู่หลายตัว สามารถใช้เครื่องมือค้นหาในเว็บนี้เพื่อหาความรู้เพิ่มเติมกันได้ นะ
หมายเหตุ: ทดสอบด้วย WRK HTTP benchmark tool. RAM 1Gb CPU 1 Core 2.5GHz
ข้อมูลการทดสอบนี้ ใช้ PHP เวอร์ชั่น 7.0 และ Node.js เวอร์ชั่น 8.6 บน OS Ubuntu 16 , เปิดใช้งาน opcache และ Nginx กำหนดค่า worker_connections ไว้ที่ 1024
ถ้าใช้ CPU 4 Core PHP+Swoole จะรองรับ Requests/sec ได้มากว่า 1 แสนต่อวินาทีเลยนะ
ปัจจุบัน PHP เวอร์ชั่นล่าสุดที่เขียนบทความนี้ เวอร์ชั่น 7.4 และกำลังจะออกเวอร์ชั่น 8 ซึ่งจะเร็วขึ้นไปอีก ส่วน Node.js เวอร์ชั่นล่าสุด คือ 14.14
นอกจากนี้ Swoole ยังสามารถนำไปใช้เป็น WebSocket Server, Coroutine Tasks, Coroutine Redis, Coroutine TCP Client, TCP Server, HTTP Server ได้อีกด้วย
การใช้งาน PHP+Swoole ไม่ควรเปิด xdebug, phptrace นะครับ
สอบถามข้อมูลเพิ่มเติม ได้ที่นี่ https://www.mindphp.com/forums/viewforum.php?f=6
และใครต้องการให้ทางเว็บช่วยทำ Load Test สามารถแจ้งไว้ได้นะ
ข้อกำหนดการใช้
- ข้อกำนด การใช้ PHP Swoole กับ Laravel Framework
- การทำ Live Chat ด้วย PHP Swoole
อ้างอิงข้อมูล
http://grigorov.website/blog/performance-comparison-php-vs-node-js
https://medium.com/@varshney.shivam786/node-js-vs-php-for-backend-4078a3f65741
https://gist.github.com/nkt/e49289321c744155484c
https://www.swoole.co.uk/