วันเสาร์ที่ 29 มีนาคม พ.ศ. 2568

PHP WebSocket: วิธีทำให้เว็บพูดคุยกับเซิร์ฟเวอร์แบบเรียลไทม์!

ถ้าคุณเคยสร้างเว็บด้วย PHP แล้วรู้สึกว่า "ทำไมต้องรีเฟรชหน้าเว็บเพื่ออัปเดตข้อมูล?" หรือ "ทำไมต้องใช้ AJAX โพลลิ่งให้เว็บโหลดช้า?" 🤔

WebSocket คือคำตอบ! 🎉

WebSocket ทำให้ เซิร์ฟเวอร์กับเว็บคุยกันแบบเรียลไทม์ได้เลย ไม่ต้องโหลดหน้าใหม่ ไม่ต้องส่งรีเควสต์ซ้ำ ๆ เหมือน AJAX แถมเร็วกว่า HTTP ธรรมดาหลายเท่า

บทความนี้จะพาคุณไปรู้จัก PHP WebSocket ตั้งแต่พื้นฐานจนถึงขั้นเทพ พร้อมตัวอย่างโค้ดให้ลองใช้จริง!

1. WebSocket คืออะไร และทำไมต้องใช้มัน? 🤷‍♂️

✅ WebSocket คืออะไร?

WebSocket คือ โปรโตคอลที่ทำให้การสื่อสารระหว่างเซิร์ฟเวอร์กับไคลเอนต์เป็นแบบสองทาง (bidirectional) และเกิดขึ้นได้แบบเรียลไทม์

พูดง่าย ๆ คือ

  • HTTP ธรรมดา: ไคลเอนต์ต้องเป็นฝ่ายส่งรีเควสต์ก่อน แล้วเซิร์ฟเวอร์ตอบกลับ
  • AJAX Polling: ต้องส่งรีเควสต์ซ้ำ ๆ เพื่อตรวจสอบข้อมูลใหม่ (เสียทรัพยากรเยอะ)
  • WebSocket: ไคลเอนต์และเซิร์ฟเวอร์สามารถส่งข้อมูลถึงกันได้ทันที ไม่ต้องรีเฟรช


✅ ใช้ WebSocket ทำอะไรได้บ้าง?

🔹 Chat Application (แชทแบบเรียลไทม์)
🔹 Notification System (แจ้งเตือนอัปเดตทันที)
🔹 Live Dashboard (ดึงข้อมูลจากเซิร์ฟเวอร์สด ๆ)
🔹 Online Gaming (เกมออนไลน์ที่ต้องการความไว)
🔹 Stock Market Updates (ราคาหุ้นแบบเรียลไทม์)


2. วิธีใช้ WebSocket กับ PHP (ตัวอย่างใช้งานจริง!) 🔥

2.1 ติดตั้ง WebSocket Server ใน PHP

PHP ไม่ได้รองรับ WebSocket โดยตรง ต้องใช้ Ratchet (ไลบรารี WebSocket สำหรับ PHP)

📌 วิธีติดตั้ง Ratchet ด้วย Composer:

composer require cboden/ratchet

2.2 สร้าง WebSocket Server ด้วย PHP

<?php
require 'vendor/autoload.php';

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class ChatServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}

use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;

$server = IoServer::factory(
    new WsServer(new ChatServer()),
    8080
);

echo "WebSocket Server is running on port 8080...\n";
$server->run();
?>

🔥 โค้ดนี้ทำอะไร?
✔ เปิด WebSocket Server ที่รันบนพอร์ต 8080
✔ เมื่อมีคนเชื่อมต่อ จะบันทึกการเชื่อมต่อไว้
✔ เมื่อได้รับข้อความจากไคลเอนต์ จะแชร์ให้คนอื่น ๆ ในระบบ
✔ ถ้าการเชื่อมต่อขาด จะลบออกจากระบบ

2.3 สร้าง WebSocket Client (ฝั่งเว็บ)

📌 โค้ด JavaScript ฝั่งไคลเอนต์

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PHP WebSocket Chat</title>
</head>
<body>
    <h2>PHP WebSocket Chat</h2>
    <input type="text" id="message" placeholder="Type a message...">
    <button onclick="sendMessage()">Send</button>
    <div id="chat"></div>

    <script>
        let ws = new WebSocket("ws://localhost:8080");

        ws.onopen = () => {
            console.log("Connected to WebSocket server");
        };

        ws.onmessage = (event) => {
            let chatBox = document.getElementById("chat");
            chatBox.innerHTML += "<p>" + event.data + "</p>";
        };

        function sendMessage() {
            let message = document.getElementById("message").value;
            ws.send(message);
        }
    </script>
</body>
</html>

🔥 โค้ดนี้ทำอะไร?
✔ สร้าง WebSocket connection ไปที่ ws://localhost:8080
✔ เมื่อเซิร์ฟเวอร์ส่งข้อความมา จะแสดงในแชท
✔ เมื่อพิมพ์ข้อความแล้วกดส่ง จะส่งข้อความไปที่ WebSocket Server


3. ทดสอบ WebSocket Server และ Client

1️⃣ รัน WebSocket Server

php websocket_server.php

📌 จะเห็นข้อความบอกว่า WebSocket Server ทำงานอยู่ที่พอร์ต 8080

2️⃣ เปิด Client ผ่านเว็บเบราว์เซอร์

📌 เปิด index.html แล้วลองส่งข้อความดู ข้อความจะแสดงผลแบบเรียลไทม์


4. เปรียบเทียบ WebSocket กับ AJAX Polling

Feature WebSocket AJAX Polling
การทำงาน การเชื่อมต่อสองทาง (bidirectional) ไคลเอนต์ต้องส่งรีเควสต์ตลอด
ความเร็ว เร็วมาก (ส่งข้อมูลทันที) ช้า (ต้องรอรีเควสต์)
ใช้ทรัพยากร ใช้แบนด์วิดท์น้อย ใช้ทรัพยากรมาก
กรณีใช้งาน แชท, แจ้งเตือน, เกมออนไลน์ โหลดข้อมูลจาก API
รองรับแบบเรียลไทม์ ✅ ใช่ ❌ ไม่ใช่


5. ข้อดี-ข้อเสียของ PHP WebSocket

✅ ข้อดี

✔ เร็วกว่า AJAX polling เพราะไม่ต้องส่งรีเควสต์ซ้ำ ๆ
✔ ลดโหลดของเซิร์ฟเวอร์ เพราะการเชื่อมต่อคงอยู่ตลอด
✔ ใช้งานง่าย มีไลบรารีช่วย เช่น Ratchet

❌ ข้อเสีย

❌ ต้องมี WebSocket Server ไม่สามารถใช้กับ Apache/PHP ปกติได้
❌ บางโฮสต์ไม่รองรับ ต้องใช้ VPS หรือเซิร์ฟเวอร์ที่เปิด WebSocket ได้


6. สรุป: PHP WebSocket คืออนาคตของเว็บแอปแบบเรียลไทม์

🔥 PHP + WebSocket ทำให้เว็บของคุณทันสมัยขึ้นแบบสุด ๆ

  • ใช้ทำ Chat Application, Live Dashboard, Notification System
  • ติดตั้งง่าย แค่ใช้ Ratchet
  • เร็วกว่าการใช้ AJAX Polling
  • เหมาะกับเว็บที่ต้องการ อัปเดตข้อมูลทันทีแบบเรียลไทม์

💡 ถ้าอยากให้เว็บโต้ตอบได้เร็วขึ้น อย่าลืมลองใช้ WebSocket! 🚀

ไม่มีความคิดเห็น:

แสดงความคิดเห็น