ホームページ PHPフレームワーク Swoole Swoole 上級: コルーチンを使用して同時サーバーを作成する

Swoole 上級: コルーチンを使用して同時サーバーを作成する

Jun 14, 2023 pm 11:39 PM
コルーチン 同時サーバー swoole

同時実行性の高いネットワーク アプリケーション シナリオでは、長距離プロセス通信フレームワークとして Swoole が開発者にますます好まれています。 Swoole は豊富なネットワーク プログラミング API を提供し、開発者が非同期プログラミングにコルーチンを使用できるようにし、同時処理能力を向上させます。この記事では、Swoole とコルーチンを使用して単純な並行サーバーを作成する方法を紹介します。

1. 環境設定

作業を始める前に、Swoole 拡張機能をインストールする必要があります。インストール方法については、Swoole の公式ドキュメントを参照してください。この記事ではPHP7.2バージョンを使用しています。

2. サーバー プログラム フレームワーク

Swoole の TCP サーバーを使用する必要があります。特定の実装では、次の側面を考慮する必要があります:

  1. プロトコル形式を定義する

ネットワーク アプリケーションでは、通常、標準のデータ送信形式を定義する必要があります。この例では、以下に示すように、カスタム プロトコル形式を使用できます。

class MyProtocol {
    const HEADER_SIZE = 4;
    const MAX_PACKAGE_SIZE = 1024 * 1024;

    public static function encode($data) {
        $package = json_encode($data, JSON_UNESCAPED_UNICODE);
        return pack('N', strlen($package)) . $package;
    }

    public static function decode($buffer) {
        if(strlen($buffer) < self::HEADER_SIZE) {
            return false;
        }

        $length = unpack('N', substr($buffer, 0, self::HEADER_SIZE))[1];
        if($length > self::MAX_PACKAGE_SIZE) {
            return false;
        }

        if(strlen($buffer) < self::HEADER_SIZE + $length) {
            return false;
        }

        $package = substr($buffer, self::HEADER_SIZE, $length);
        return json_decode($package, true);
    }
}
ログイン後にコピー

プロトコル形式には、データ パケットの長さを格納する 4 バイトのヘッダーと、実際のデータの JSON 文字列表現が含まれています。この形式はさまざまなメッセージ タイプをサポートし、送信の信頼性とスケーラビリティを実現できます。

  1. ビジネス処理の定義

ビジネス ロジック処理は、次に示すように、Server クラスのコールバック関数で定義されます。

class Server {
    private $serv;

    public function __construct() {
        $this->serv = new SwooleServer('0.0.0.0', 9501);
        $this->serv->set(array(
            'worker_num' => 4,
            'daemonize' => false,
            'max_conn' => 10000,
            'dispatch_mode' => 3,
            'open_tcp_keepalive' => 1,
            'tcp_keepidle' => 600,
            'tcp_keepinterval' => 60,
            'tcp_keepcount' => 5,
        ));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $this->serv->start();
    }

    public function onConnect($serv, $fd, $reactorId) {
        echo "Client: {$fd}-{$reactorId} Connect.
";
    }

    public function onReceive($serv, $fd, $reactorId, $data) {
        $message = MyProtocol::decode($data);
        if($message) {
            // Handle message & reply to client
            $this->serv->send($fd, MyProtocol::encode(array('status' => 0, 'message' => 'OK')));
        } else {
            // Invalid message, close connection
            $this->serv->close($fd);
        }
    }

    public function onClose($serv, $fd, $reactorId) {
        echo "Client: {$fd}-{$reactorId} Close.
";
    }
}

new Server();
ログイン後にコピー

各接続について、サーバーは、接続、メッセージの受け入れ、接続の終了などの操作を処理する 3 つのメソッドを定義し、それに応じて応答する必要があります。

3. コルーチンの使用

Swoole は、非同期プログラミングの制御フローを管理し、同期プログラミング エクスペリエンスを提供するコルーチン API を提供します。コルーチン関数は、コルーチン シリーズ API を通じて実装できます。以下は、コルーチンを使用した後の新しいコードです。このコードは、コルーチンを使用して、クライアント接続やメッセージ受信などの非同期 IO 操作を処理します。

class Server {
    private $serv;

    public function __construct() {
        $this->serv = new SwooleServer('0.0.0.0', 9501);
        $this->serv->set(array(
            'worker_num' => 4,
            'daemonize' => false,
            'max_conn' => 10000,
            'dispatch_mode' => 3,
            'open_tcp_keepalive' => 1,
            'tcp_keepidle' => 600,
            'tcp_keepinterval' => 60,
            'tcp_keepcount' => 5,
        ));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $this->serv->start();
    }

    public function onConnect($serv, $fd, $reactorId) {
        go(function() use($fd, $reactorId) {
            echo "Client: {$fd}-{$reactorId} Connect.
";
        });
    }

    public function onReceive($serv, $fd, $reactorId, $data) {
        go(function() use($serv, $fd, $reactorId, $data) {
            $message = MyProtocol::decode($data);
            if($message) {
                // Handle message & reply to client
                $serv->send($fd, MyProtocol::encode(array('status' => 0, 'message' => 'OK')));
            } else {
                // Invalid message, close connection
                $serv->close($fd);
            }
        });
    }

    public function onClose($serv, $fd, $reactorId) {
        go(function() use($fd, $reactorId) {
            echo "Client: {$fd}-{$reactorId} Close.
";
        });
    }
}

new Server();
ログイン後にコピー

go(function()) を使用して、実行するタスクをコルーチンに追加します。不要なコールバック関数や制御プロセスを手動で管理する煩雑な操作を回避しながら、コード量が削減されます。

4. 導入方法

Swoole が提供するコマンド ライン ツールを使用して、サーバーの実行プロセスを簡単に管理できます。たとえば、次のように Swoole TCP サーバーを起動します。

php server.php
ログイン後にコピー

サーバーをバックグラウンドで実行し続ける必要がある場合は、デーモン化オプションを設定できます。

php server.php --daemonize
ログイン後にコピー

コマンド ライン ツールを使用します。 Swoole が提供する、サーバーのオープン、再起動、停止などの操作を行うためのツールです。

swoole_server [start|stop|reload|restart|shutdown]
ログイン後にコピー

Swoole を使用すると、効率的な同時ネットワーク アプリケーションを簡単に実装できます。コルーチンを使用して記述された Swoole TCP サーバーは、コード構造が簡素化されるだけでなく、パフォーマンスも向上し、従来のマルチプロセスまたはマルチスレッド サーバーと比較して、より優れた処理パフォーマンスが得られ、サーバーのリソース消費を大幅に節約できます。

以上がSwoole 上級: コルーチンを使用して同時サーバーを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

golang 関数と goroutine の親子関係 golang 関数と goroutine の親子関係 Apr 25, 2024 pm 12:57 PM

Go では関数とゴルーチンの間に親子関係があり、親ゴルーチンは子ゴルーチンを作成し、子ゴルーチンは親ゴルーチンの変数にアクセスできますが、その逆はできません。 go キーワードを使用して子ゴルーチンを作成すると、子ゴルーチンは匿名関数または名前付き関数を通じて実行されます。親ゴルーチンは、すべての子ゴルーチンが完了する前にプログラムが終了しないように、sync.WaitGroup を介して子ゴルーチンが完了するのを待つことができます。

Laravelでswooleコルーチンを使用する方法 Laravelでswooleコルーチンを使用する方法 Apr 09, 2024 pm 06:48 PM

Laravel で Swoole コルーチンを使用すると、大量のリクエストを同時に処理でき、次のような利点があります: 同時処理: 複数のリクエストを同時に処理できます。高いパフォーマンス: Linux の epoll イベント メカニズムに基づいて、リクエストを効率的に処理します。低リソース消費: 必要なサーバー リソースが少なくなります。統合が簡単: Laravel フレームワークとのシームレスな統合が可能で、使いやすいです。

スウールとワーカーマンはどちらが良いですか? スウールとワーカーマンはどちらが良いですか? Apr 09, 2024 pm 07:00 PM

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

Golang API 設計における同時実行性とコルーチンの適用 Golang API 設計における同時実行性とコルーチンの適用 May 07, 2024 pm 06:51 PM

同時実行性とコルーチンは、GoAPI 設計で次の目的で使用されます。 高パフォーマンス処理: 複数のリクエストを同時に処理してパフォーマンスを向上させます。非同期処理: コルーチンを使用してタスク (電子メールの送信など) を非同期に処理し、メインスレッドを解放します。ストリーム処理: コルーチンを使用して、データ ストリーム (データベース読み取りなど) を効率的に処理します。

swoole_process ではユーザーがどのように切り替えられるのでしょうか? swoole_process ではユーザーがどのように切り替えられるのでしょうか? Apr 09, 2024 pm 06:21 PM

Swoole プロセスではユーザーを切り替えることができます。具体的な手順は、プロセスの作成、プロセス ユーザーの設定、プロセスの開始です。

swoole と java ではどちらの方がパフォーマンスが優れていますか? swoole と java ではどちらの方がパフォーマンスが優れていますか? Apr 09, 2024 pm 07:03 PM

パフォーマンスの比較: スループット: Swoole は、コルーチン メカニズムのおかげでスループットが高くなります。レイテンシー: Swoole のコルーチン コンテキスト スイッチングは、オーバーヘッドが低く、レイテンシーが小さくなります。メモリ消費量: Swoole のコルーチンが占有するメモリは少なくなります。使いやすさ: Swoole は、より使いやすい同時プログラミング API を提供します。

swooleフレームワークでサービスを再起動する方法 swooleフレームワークでサービスを再起動する方法 Apr 09, 2024 pm 06:15 PM

Swoole サービスを再起動するには、次の手順に従います。 サービスのステータスを確認し、PID を取得します。サービスを停止するには、「kill -15 PID」を使用します。サービスの開始に使用したのと同じコマンドを使用してサービスを再起動します。

Golang コルーチンとゴルーチンの関係 Golang コルーチンとゴルーチンの関係 Apr 15, 2024 am 10:42 AM

コルーチンはタスクを同時に実行するための抽象的な概念であり、ゴルーチンはコルーチンの概念を実装する Go 言語の軽量スレッド関数です。この 2 つは密接に関連していますが、Goroutine のリソース消費量は少なく、Go スケジューラによって管理されます。 GoroutineはWebリクエストの同時処理やプログラムのパフォーマンス向上など、実戦で広く活用されています。

See all articles