>백엔드 개발 >PHP 튜토리얼 >PHP8.0의 HTTP 서버 라이브러리: React

PHP8.0의 HTTP 서버 라이브러리: React

WBOY
WBOY원래의
2023-05-14 17:21:061445검색

인터넷의 발달과 함께 웹 애플리케이션의 중요성이 점점 더 주목받고 있습니다. HTTP 서버는 웹 애플리케이션의 기초 중 하나입니다. PHP 분야에서 React는 매우 편리한 개발 방법을 제공하는 훌륭한 HTTP 서버 라이브러리입니다. 이 글에서는 React의 기본 개념과 사용법을 소개하고, 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 네임스페이스에서 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.
";

이 코드에서는 ReactEventLoopFactory::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 서버에 대한 두 가지 라우팅 규칙을 설정합니다. 요청한 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() 메서드가 호출됩니다. 링크에서 수신하면 onMessage() 메서드가 호출됩니다.

마지막으로 EchoServer 인스턴스를 WSServer에 전달하고 WebSocket 요청을 수신하는 HTTP 서버를 생성합니다. 우리는 ReactSocketServer를 사용하여 IP 주소와 포트를 수신하고 $loop->run() 메서드를 사용하여 이벤트 루프를 시작합니다.

요약

React는 매우 편리한 개발 방법을 제공하고 비동기 IO, 라우팅 등과 같은 많은 기능을 지원하는 뛰어난 PHP HTTP 서버 라이브러리입니다. 이 기사의 소개를 통해 React의 기능을 더 깊이 이해하고 React를 사용하여 자신만의 웹 애플리케이션을 개발할 수 있습니다.

위 내용은 PHP8.0의 HTTP 서버 라이브러리: React의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.