ホームページ  >  記事  >  バックエンド開発  >  PHPとSocketを使ってリアルタイムデータ通信を実現する方法

PHPとSocketを使ってリアルタイムデータ通信を実現する方法

WBOY
WBOYオリジナル
2023-06-28 08:15:022561ブラウズ

インターネットの継続的な発展に伴い、リアルタイム データ通信がさまざまなアプリケーションの標準になりました。 PHP と Socket を使用してリアルタイム データ通信を実装することは、一般的な方法の 1 つです。この記事では、PHPとSocketを使ってリアルタイムデータ通信を実現する方法を紹介します。

ソケットは、アプリケーション間の通信に使用されるメカニズムです。これは、さまざまなアプリケーションが異なるコンピュータ間で通信できるようにするインターフェイスの標準セットを提供します。 PHP では、ソケット拡張ライブラリを使用してソケット通信を実装できます。

ソケット接続の実装

ソケット接続を使用してリアルタイム データ通信を実現するには、まずソケット接続を確立する必要があります。ソケット接続は通常、サーバー側とクライアント側の 2 つのエンドポイントで構成されます。

サーバー側:

$ip = '127.0.0.1';
$port = 8888;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($server, $ip, $port);

socket_listen($server);

$client = socket_accept($server);

socket_close($server);

クライアント側:

$ip = '127.0.0.1';
$port = 8888;

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($client, $ip, $port);

socket_close($client);

上記はソケット接続を確立する基本的な操作であり、socket_create 関数はSocket オブジェクトの作成に使用されます。 socket_bind この関数はローカル バインディングを実装します。 socket_listen この関数はクライアントからの接続リクエストのリッスンを開始し、クライアントが接続するまでブロックします。 socket_accept この関数は、新しい接続を作成するための新しい Socket オブジェクトを返します。クライアント側の操作も比較的簡単で、socket_connect 関数を使用してサーバーに接続し、socket_close 関数を使用して接続を閉じます。

リアルタイム データ通信

ソケット接続が正常に確立されると、リアルタイム データ通信を開始できます。ソケット接続では、データはストリーム経由で転送されます。サーバーは socket_recv 関数を通じてクライアントからデータを受信でき、クライアントは socket_send 関数を通じてサーバーにデータを送信できます。

サーバー側:

$ip = '127.0.0.1';
$port = 8888;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($server, $ip, $port);

socket_listen($server);

$client = socket_accept($server);

while(true){
    $message = socket_recv($client, 1024, MSG_WAITALL);

    if($message === false){
        socket_close($client);
        break;
    }

    echo "收到消息: $message 
";
}

socket_close($server);

クライアント側:

$ip = '127.0.0.1';
$port = 8888;

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($client, $ip, $port);

$message = "Hello World!";
socket_send($client, $message, strlen($message), 0);

socket_close($client);

以上がメッセージの送受信の基本動作ですが、サーバー側ではメッセージが 1 つしか受信できないという問題を解決します。ループ処理にかかる時間。このリアルタイム データ通信方法は簡単かつ効率的に使用でき、適切に使用すれば非常に有益です。

WebSocket を使用してリアルタイム データ通信を実現する

WebSocket は、ブラウザとサーバーの間に永続的な接続を作成できる HTTP プロトコルに基づくプロトコルです。 PHP では、Ratchet などのサードパーティ ライブラリを使用して WebSocket 通信を実装できます。

WebSocket 接続の実装

サーバー コード:

require __DIR__ . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class WebSocketServer implements MessageComponentInterface {
    protected $clients;

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

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "有新的客户端连接:{$conn->resourceId}
";
    }

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

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "客户端离开:{$conn->resourceId}
";
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "发生错误:{$e->getMessage()}
";
        $conn->close();
    }

    public function run() {
        $server = RatchetServerIoServer::factory(
            new RatchetHttpHttpServer(
                new RatchetWebSocketWsServer(
                    $this
                )
            ),
            8080
        );

        echo "WebSocket服务已启动...
";

        $server->run();
    }
}

$server = new WebSocketServer();
$server->run();

上記は、MessageComponentInterface を使用して 4 つの基本メソッドをそれぞれ実装する単純な WebSocket サーバーです。 onOpen、onMessage、onClose、onError。新しいクライアントのリソース ID が onOpen メソッドに追加され、クライアントが離れるときにクライアントを識別します。受信したメッセージは onMessage メソッド、onClose でブロードキャストされます。オフライン クライアントはメソッドのクライアント リストから削除され、クライアントとの接続エラーは onError メソッドで処理されます。

クライアント コード:

var socket = new WebSocket('ws://' + window.location.host + ':8080');

socket.onopen = function() {
    console.log('WebSocket已打开');
};

socket.onerror = function() {
    console.log('WebSocket出错');
};

socket.onmessage = function(event) {
    console.log('收到消息:' + event.data);
};

socket.onclose = function() {
    console.log('WebSocket已关闭');
};

上記はクライアント コードです。WebSocket オブジェクトを使用して WebSocket 接続を作成し、onopen、onerror、onmessage をそれぞれ処理します。 . 、onclose イベント。受信したメッセージは onmessage メソッドで出力されます。

WebSocket を使用すると、従来の Socket よりもブラウザとサーバー間のリアルタイム通信が容易になります。 Ratchet などのサードパーティ ライブラリを使用して WebSocket 通信を実装すると、開発の複雑さを軽減できます。

結論

上記の紹介を通じて、PHP と Socket を使用してリアルタイム データ通信を実現することは比較的柔軟であり、さまざまなアプリケーション シナリオに適用できることがわかります。同時に、Ratchetなどのサードパーティライブラリを使用したWebSocket通信は、ブラウザやサーバーサイドで実装される従来のSocket通信よりも簡単に始めることができ、より短期間で通信開発を加速できます。開発者は、自分のニーズに応じて適切な通信方法を選択できます。

以上がPHPとSocketを使ってリアルタイムデータ通信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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