現在の位置: ホーム> 最新記事一覧> PHPリアルタイムメッセージプッシュ実装ケースの詳細な説明(長い投票に基づく)

PHPリアルタイムメッセージプッシュ実装ケースの詳細な説明(長い投票に基づく)

gitbox 2025-08-05

ケースの背景

リアルタイムメッセージングテクノロジーは、ウェブサイトやアプリケーションがより効率的なユーザーインタラクションエクスペリエンスを実現するのに役立ちます。たとえば、ユーザーがオンラインカスタマーサービス、チャットルーム、またはリアルタイム通知システムを使用する場合、できるだけ早くサーバーからメッセージを受信する必要があります。現在、WebSocketは主流のリアルタイム通信テクノロジーですが、一部のサーバーや環境に対するサポートが不十分であるため、PHPを使用することと長いポーリングを組み合わせて、実用的で実行可能な代替手段です。

リアルタイムメッセージプッシュの原則

メッセージプッシュの鍵は、クライアントとサーバー間の継続的な通信を維持することです。従来のHTTP通信は一元配置リクエスト応答ですが、クライアントがリクエストを発行した後、長いポーリングは応答を遅らせ、それによっておおよそのリアルタイム効果を達成します。

長いポーリングワークフロー

長いポーリングのコミュニケーションプロセスは、次の手順に分けることができます。

  • クライアントはサーバーにリクエストを送信します。
  • サーバーは、新しいメッセージが利用可能かどうかを判断します。
  • 新しいメッセージがある場合は、すぐにメッセージデータを返します。
  • メッセージがない場合、サーバーは接続されたままで、新しいメッセージが生成されるのを待ちます。
  • タイムアウトまたはメッセージを待った後、サーバーは応答を返します。
  • 応答を受け取った後、クライアントはすぐに再びリクエストを送信し、ポーリングループを形成します。

システムの実装手順

データベーステーブルを作成します

まず、メッセージを保存するためのデータベーステーブルを設計する必要があります。たとえば、次の「メッセージ」テーブルを作成できます。

 
CREATE TABLE messages (
  id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  content VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

フロントエンドページ開発

フロントエンドページは、プッシュされたリアルタイムメッセージを表示するために使用され、jQueryと組み合わせてHTMLとJavaScriptを使用して処理できます。

 
<!DOCTYPE html>
<html>
<head>
  <title>リアルタイムのメッセージプッシュ</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="app.js"></script>
</head>
<body>
  <div id="messages"></div>
</body>
</html>

バックエンド処理ロジック

バックエンドPHPコードは、長いポーリングロジックとデータ応答の処理を担当します。 index.phpという名前のファイルを作成して、フロントエンドによって開始されたリクエストを処理できます。

基本的なPHP処理の例


<?php
// データベース接続
$conn = new mysqli("localhost", "ユーザー名", "パスワード", "データベース名");
if ($conn->connect_error) {
    die("接続に失敗しました: " . $conn->connect_error);
}

// 最後に受け取った最後のメッセージを取得しますID
$lastId = isset($_GET['last_id']) ? intval($_GET['last_id']) : 0;
$timeout = 30; // せいぜい待ってください302番
$startTime = time();

while (true) {
    $sql = "SELECT * FROM messages WHERE id > $lastId ORDER BY id ASC";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $messages = [];
        while($row = $result->fetch_assoc()) {
            $messages[] = $row;
        }
        echo json_encode(["status" => "success", "data" => $messages]);
        break;
    } else {
        // 他のすべて12番检查一次是否有新消息,過度のサーバー圧力を避けてください
        sleep(1);
    }

    if ((time() - $startTime) > $timeout) {
        echo json_encode(["status" => "timeout", "data" => []]);
        break;
    }
}
$conn->close();
?>

フロントエンドポーリングスクリプト(app.js)

 
let lastId = 0;
function fetchMessages() {
  $.ajax({
    url: 'index.php',
    type: 'GET',
    data: { last_id: lastId },
    success: function(response) {
      if (response.status === 'success') {
        response.data.forEach(function(msg) {
          $('#messages').append('<p>' + msg.content + '</p>');
          lastId = msg.id;
        });
      }
      fetchMessages();
    },
    error: function() {
      setTimeout(fetchMessages, 3000);
    }
  });
}

$(document).ready(function() {
  fetchMessages();
});

要約します

上記の方法を通して、PHPと長いポーリングテクノロジーを使用して、基本的なリアルタイムメッセージングプッシュシステムを構築しました。このソリューションは、適切な互換性と開発のしきい値が低く、WebSocket環境をサポートしていないプロジェクトに適しています。これは、リアルタイムのパフォーマンスが低いがタイムリーなフィードバックが必要なアプリケーションシナリオに採用する価値のあるソリューションです。