ホームページ  >  記事  >  バックエンド開発  >  PHP8.0のHTTPサーバーライブラリ: React

PHP8.0のHTTPサーバーライブラリ: React

WBOY
WBOYオリジナル
2023-05-14 17:21:061366ブラウズ

インターネットの発展に伴い、Web アプリケーションの重要性がますます注目されています。 HTTP サーバーは Web アプリケーションの基盤の 1 つです。 PHP の分野では、React は優れた HTTP サーバー ライブラリであり、非常に便利な開発方法を提供します。この記事では、React の基本的な概念と使い方を紹介し、その機能のいくつかを詳しく説明します。

React は、イベント ループ機構に基づいたネットワーク ライブラリです。 HTTP や Websocket などのプロトコルのサポートを提供し、非同期 IO をサポートします。他の PHP HTTP サーバー ライブラリとは異なり、React は非同期でノンブロッキングのアプローチを使用するため、多数の同時リクエストをより効率的に処理できます。

React のインストールは非常に簡単です。以下に示すように、Composer を使用してインストールできます。

composer require react/http:^1.0

次に、単純な HTTP サーバーを作成して、React の基本機能をテストします。コードは次のとおりです。

use ReactHttpResponse;
use ReactHttpServer;
use PsrHttpMessageServerRequestInterface;

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

$server = new Server(function (ServerRequestInterface $request) {
    return new Response(
        200,
        array(
            'Content-Type' => 'text/plain'
        ),
        "Hello World!
"
    );
});

$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server->listen($socket);

echo "Server running at http://127.0.0.1:8080
";

このコードは、React に基づいて最も単純な HTTP サーバーを作成します。すべてのリクエストを受け入れ、「Hello World」応答を返します。ご覧のとおり、このコードは ReactHttp 名前空間の 2 つのクラス、Response と Server を使用しています。このうち、ResponseはHTTPレスポンスを表し、ServerはHTTPサーバーを表します。

React のいくつかの機能について説明しましょう:

1. 非同期 IO

React は非同期 IO を使用してリクエストを処理します。リクエストが到着すると、React はそのリクエストを非同期に処理し、他のリクエストの処理を続けます。これにより、サーバーは複数のリクエストを同時に処理できるようになり、パフォーマンスが向上します。

非同期 IO では、イベント ループ メカニズムを使用する必要があります。 React は、ReactEventLoopLoop クラスを通じてイベント ループを実装します。以下は簡単な例です:

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

$loop = ReactEventLoopFactory::create();

$loop->addTimer(2, function () {
    echo "This will be echoed after 2 seconds.
";
});

$loop->run();

echo "Event loop stopped.
";

このコードでは、ReactEventLoopF​​actory::create() を使用してイベント ループ インスタンスを作成します。次に、$loop->addTimer() メソッドを使用して 2 秒のタイマーを設定します。最後に、$loop->run() メソッドを使用してイベント ループを開始します。 2 秒待った後、イベント ループはタイマーのコールバック関数を実行し、テキストを出力します。コールバック関数の実行が完了すると、イベント ループが停止します。

2. ルーティング

HTTP サーバーを作成する場合、いくつかのルーティング ルールを設定する必要がある場合があります。 React は FastRoute ルーターの使用をサポートしています。以下に例を示します。

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

$loop = ReactEventLoopFactory::create();

$router = FastRoutesimpleDispatcher(function(FastRouteRouteCollector $r) {
    $r->addRoute('GET', '/', function () {
        return new ReactHttpResponse(
            200,
            array(
                'Content-Type' => 'text/plain'
            ),
            "Hello World!
"
        );
    });
    $r->addRoute('GET', '/users/{id:d+}', function ($request) {
        $id = $request->getAttribute('id');
        return new ReactHttpResponse(
            200,
            array(
                'Content-Type' => 'text/plain'
            ),
            "User $id
"
        );
    });
});

$server = new ReactHttpServer(function ($request) use ($router) {
    $routeInfo = $router->dispatch($request->getMethod(), $request->getUri()->getPath());
    switch ($routeInfo[0]) {
        case FastRouteDispatcher::NOT_FOUND:
            return new ReactHttpResponse(404, array('Content-Type' => 'text/plain'), 'Not found');
        case FastRouteDispatcher::METHOD_NOT_ALLOWED:
            $allowedMethods = $routeInfo[1];
            return new ReactHttpResponse(405, array('Content-Type' => 'text/plain'), 'Method not allowed');
        case FastRouteDispatcher::FOUND:
            $handler = $routeInfo[1];
            $vars = $routeInfo[2];
            return $handler($request, ...array_values($vars));
    }
});

$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server->listen($socket);

echo "Server running at http://127.0.0.1:8080
";

このコードでは、FastRoute ルーターを使用して、HTTP サーバーに 2 つのルーティング ルールを設定します。リクエストされた URL が「/」の場合は「Hello World」が返され、リクエストされた URL が「/users/{id}」の場合は「User {id}」が返されます。このうち、{id:d} は数字の一致を意味します。 $routeInfo[0] を使用して FastRoute のルート配布結果を取得し、さまざまな結果に応じて応答を設定します。

3. Websocket

React は、HTTP プロトコルに加えて、Websocket プロトコルの実装もサポートしています。以下は簡単な例です:

use ReactHttpResponse;
use ReactHttpServer;
use RatchetRFC6455MessagingMessageInterface;
use RatchetWebSocketMessageComponentInterface;
use RatchetWebSocketWsServer;

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

class EchoServer implements MessageComponentInterface
{
    public function onOpen(ConnectionInterface $conn) {
        echo "Connection opened ({$conn->resourceId})
";
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Connection closed ({$conn->resourceId})
";
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "An error has occurred: {$e->getMessage()} ({$conn->resourceId})
";
        $conn->close();
    }

    public function onMessage(ConnectionInterface $from, MessageInterface $msg) {
        echo "Message received from ({$from->resourceId}): {$msg}
";
        $from->send($msg);
    }
}

$echo = new EchoServer();

$server = new Server(new WsServer($echo));

$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server->listen($socket);

$loop->run();

このコードでは、EchoServer クラスを Websocket サーバーとして実装します。これは MessageComponentInterface インターフェイスを実装し、その 4 つのメソッドをオーバーライドします。リンクが開かれると onOpen() メソッドが呼び出され、リンクが閉じられると onClose() メソッドが呼び出され、リンク上でエラーが発生すると onError() メソッドが呼び出され、データが更新されると onError() メソッドが呼び出されます。リンクから受信すると、onMessage() メソッドが呼び出されます。

最後に、EchoServer インスタンスを WSServer に渡し、WebSocket リクエストをリッスンする HTTP サーバーを作成します。 ReactSocketServer を使用して IP アドレスとポートをリッスンし、$loop->run() メソッドを使用してイベント ループを開始します。

概要

React は優れた PHP HTTP サーバー ライブラリであり、非常に便利な開発方法を提供し、非同期 IO、ルーティングなどの多くの機能をサポートしています。この記事の紹介を通じて、React の機能をより深く理解し、React を使用して独自の Web アプリケーションを開発し始めることができます。

以上がPHP8.0のHTTPサーバーライブラリ: Reactの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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