สำหรับ 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 ก็จะรองรับโหลดได้เพิ่มขึ้นอย่างมหาสาร ดูภาพด้านล่าง

ภาพแสดงความแตกต่าง วิธีการ การโหลด 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 ที่ทดสอบและรายละเอียดต่างๆไว้ให้ด้วยนะ) ผลการทดสอบ PHP Node.js

จากกราฟจะเห็นว่า 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 สามารถแจ้งไว้ได้นะ

ข้อกำหนดการใช้

อ้างอิงข้อมูล
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/

กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
SQL JOIN: การรวมข้อมูลจากหลายตารางในฐานข้อมูล
โดย witsarutt000 พฤ 14 มี.ค. 2024 4:07 pm บอร์ด SQL Knowledge
1
166
พฤ 14 มี.ค. 2024 5:44 pm โดย Sirayu View Topic SQL JOIN: การรวมข้อมูลจากหลายตารางในฐานข้อมูล
PHP การเปลี่ยนแปลงที่สร้างปรากฏการณ์ในโลกของเว็บ
โดย witsarutt000 พฤ 14 มี.ค. 2024 11:17 am บอร์ด PHP Knowledge
0
125
พฤ 14 มี.ค. 2024 11:17 am โดย witsarutt000 View Topic PHP การเปลี่ยนแปลงที่สร้างปรากฏการณ์ในโลกของเว็บ
ปัญหา Harddisk ขึ้น 100% เวลาเซฟไฟล์ หรือภาพ จะค้่างที่หน้าแท๊บ Expolorer
โดย Thanavat_n พ 13 มี.ค. 2024 11:02 am บอร์ด ถาม - ตอบ คอมพิวเตอร์
5
270
พ 13 มี.ค. 2024 1:34 pm โดย Thanavat_n View Topic ปัญหา Harddisk ขึ้น 100% เวลาเซฟไฟล์ หรือภาพ จะค้่างที่หน้าแท๊บ Expolorer
ตู้รองเท้า ไอเท็มวิเศษช่วยจัดระเบียบคอลเลกชันรองเท้าคู่โปรด
โดย @Foretoday อ 12 มี.ค. 2024 1:46 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
184
อ 12 มี.ค. 2024 1:46 pm โดย @Foretoday View Topic ตู้รองเท้า ไอเท็มวิเศษช่วยจัดระเบียบคอลเลกชันรองเท้าคู่โปรด
แนะนำสถานที่น่าเที่ยวในจังหวัดชุมพรพร้อมวิธีการเดินทาง
โดย witsarutt000 จ 11 มี.ค. 2024 6:14 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
142
จ 11 มี.ค. 2024 6:14 pm โดย witsarutt000 View Topic แนะนำสถานที่น่าเที่ยวในจังหวัดชุมพรพร้อมวิธีการเดินทาง
ย้าย VM ข้าม Host ด้วย scp กรณีศึกษา Vmware ESXI
โดย mindphp อ 10 มี.ค. 2024 4:36 am บอร์ด Linux - Web Server
0
239
อ 10 มี.ค. 2024 4:36 am โดย mindphp View Topic ย้าย VM ข้าม Host ด้วย scp กรณีศึกษา Vmware ESXI
IP และ vpn (VMware)
โดย ballmykids อ 10 มี.ค. 2024 2:35 am บอร์ด ถาม - ตอบ คอมพิวเตอร์
2
203
จ 11 มี.ค. 2024 3:19 pm โดย ballmykids View Topic IP และ vpn (VMware)
แบบนี้ต้องทำยังไง ในกรณีที่ Server เดิมเราได้ทำการ Raid 1 กับ HDD 2 ลูกแรกแล้ว
โดย Anonymous ศ 08 มี.ค. 2024 7:02 am บอร์ด ถาม - ตอบ คอมพิวเตอร์
1
166
ศ 08 มี.ค. 2024 8:12 pm โดย mindphp View Topic แบบนี้ต้องทำยังไง ในกรณีที่ Server เดิมเราได้ทำการ Raid 1 กับ HDD 2 ลูกแรกแล้ว