ホームページ >バックエンド開発 >PHPチュートリアル >PHPリアルタイム通信機能の実装方法の分類と比較分析

PHPリアルタイム通信機能の実装方法の分類と比較分析

WBOY
WBOYオリジナル
2023-08-10 16:43:511106ブラウズ

PHPリアルタイム通信機能の実装方法の分類と比較分析

PHP リアルタイム通信機能の実装方法の分類と比較分析

はじめに:
インターネットの急速な発展に伴い、リアルタイム通信機能は、多くの Web サイトやアプリケーションの主要なニーズにとって不可欠な部分となっています。リアルタイム通信機能とは、ユーザーがメッセージをリアルタイムで送信、受信、処理できることを意味します。 PHP の分野では、リアルタイム通信機能を実装する方法が数多くありますが、この記事では、それらの方法を分類して比較し、対応するコード例を示します。

1. 長時間接続に基づくリアルタイム通信方式
長時間接続に基づくリアルタイム通信方式では、永続的な接続を確立することで、サーバーがクライアントにリアルタイムでメッセージをプッシュすることができます。このメソッドは通常、Socket または WebSocket を使用して実装されます。

  1. ソケットのリアルタイム通信方式
    ソケットは、クライアントとサーバー間のリアルタイム双方向通信を実現する、TCP/IPプロトコルに基づく通信機構です。 PHP は、ソケット通信機能を実装するために、ソケット拡張機能を通じて対応する API を提供します。

次は、単純な Socket リアルタイム通信の例、サーバー側コード:

<?php
// 创建socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 绑定IP和端口
socket_bind($socket, '0.0.0.0', 8888);
// 监听连接
socket_listen($socket);
// 客户端连接处理
$connection = socket_accept($socket);
// 循环接收和发送消息
while (true) {
    // 接收客户端消息
    $message = socket_read($connection, 1024);
    echo "客户端消息:" . $message . PHP_EOL;
    // 发送消息给客户端
    socket_write($connection, "服务器消息:收到消息了!");
}
// 关闭socket连接
socket_close($socket);
?>

クライアント側コード:

<?php
// 创建socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 连接服务器
socket_connect($socket, '127.0.0.1', 8888);
// 循环发送和接收消息
while (true) {
    // 发送消息给服务器
    socket_write($socket, "客户端消息:hello");
    // 接收服务器消息
    $message = socket_read($socket, 1024);
    echo "服务器消息:" . $message . PHP_EOL;
}
// 关闭socket连接
socket_close($socket);
?>
  1. WebSocket real - 時間通信方式※ WebSocket は、HTTP プロトコルに基づく双方向通信機構で、ブラウザとサーバー間で長時間の接続を確立し、リアルタイムにデータを送信できます。 PHP は、Swoole などの拡張ライブラリを通じて WebSocket サポートを提供します。
以下は、単純な WebSocket リアルタイム通信の例です。サーバー側のコード:

<?php
// 创建WebSocket服务器
$server = new swoole_websocket_server("0.0.0.0", 8888);
// 监听连接事件
$server->on('open', function ($server, $req) {
    echo "客户端连接成功!
";
});
// 监听消息事件
$server->on('message', function ($server, $frame) {
    echo "客户端消息:" . $frame->data . "
";
    // 发送消息给客户端
    $server->push($frame->fd, "服务器消息:收到消息了!");
});
// 监听关闭事件
$server->on('close', function ($server, $fd) {
    echo "客户端关闭连接!
";
});
// 启动服务器
$server->start();
?>

クライアント側のコード:

<script>
// 创建WebSocket连接
var socket = new WebSocket("ws://127.0.0.1:8888");
// 连接成功事件
socket.onopen = function (event) {
    console.log("连接服务器成功!");
};
// 接收消息事件
socket.onmessage = function (event) {
    console.log("服务器消息:" + event.data);
    // 发送消息给服务器
    socket.send("客户端消息:hello");
};
// 关闭连接事件
socket.onclose = function (event) {
    console.log("与服务器断开连接!");
};
</script>

2. リアルタイムロング ポーリング方式による通信

ロング ポーリング方式によるリアルタイム通信方式では、クライアントがサーバーに定期的にリクエストを送信し、サーバーはメッセージが到着した場合にのみ応答を返します。

以下は、単純な AJAX ベースのロング ポーリング リアルタイム通信の例です。サーバー側のコード:

<?php
// 获取客户端发送的最新消息
$data = '';
while (empty($data)) {
    $data = $_POST['data'];
    usleep(100000);
}
// 返回最新消息给客户端
echo "服务器消息:收到消息了!";
?>

クライアント側のコード:

<script>
// 发送请求获取最新消息
function getData() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log("服务器消息:" + xhr.responseText);
        }
    };
    xhr.open("POST", "server.php", true);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send("data=");
    setTimeout(getData, 1000); // 每秒发送请求
}
// 开始获取最新消息
getData();
</script>

3. プッシュ サービスリアルタイム通信方式

Push サービスは、Firebase Cloud Messaging (FCM)、Pusher などのリアルタイム通信機能の実装に特に使用されるサービスです。 PHP は、対応する SDK または API を介してプッシュ サービスの統合を実装します。

次は、簡単なプッシャー リアルタイム通信の例、サーバー側のコードです:

<?php
// 引入Pusher SDK
require __DIR__ . '/vendor/autoload.php';
// 创建Pusher对象
$options = array(
    'cluster' => 'your_cluster',
    'encrypted' => true
);
$pusher = new PusherPusher(
    'your_app_key',
    'your_app_secret',
    'your_app_id',
    $options
);
// 触发事件推送消息
$pusher->trigger('my-channel', 'my-event', array('message' => 'Hello world'));
?>

クライアント側のコード:

<script src="https://js.pusher.com/7.0/pusher.min.js"></script>
<script>
// 创建Pusher实例
var pusher = new Pusher('your_app_key', {
    cluster: 'your_cluster',
    encrypted: true
});
// 订阅频道并监听事件
var channel = pusher.subscribe('my-channel');
channel.bind('my-event', function(data) {
    console.log("服务器消息:" + data.message);
});
</script>

結論:

この記事では、次のことについて説明します。ロングコネクションに基づくリアルタイム通信 通信方式、ロングポーリングに基づくリアルタイム通信方式、プッシュサービスのリアルタイム通信方式を分類・比較分析し、対応するコード例を提供します。特定のニーズとシナリオに応じて、適切なリアルタイム通信方法を選択することで、開発者は効率的で信頼性の高いリアルタイム通信機能を実現できます。

以上がPHPリアルタイム通信機能の実装方法の分類と比較分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。