이벤트 중심 프로그래밍은 절차 코딩에 익숙한 PHP 개발자에게 고유 한 과제를 제시합니다. PHP의 절차 적 특성에서, 사건은 종종 고유 한 비동기 동작없이 간단한 기능 호출로 요약됩니다. 모든 코드 실행은 여전히 차단됩니다.
그러나 JavaScript와 같은 언어는 중앙 구성 요소로서 이벤트 루프의 잠재력을 보여줍니다. 이 통찰력으로 인해 개발자들은 이벤트 루프 및 비동기 기능을 PHP HTTP 서버에 통합하게되었습니다. 이 기사에서는 고성능 PHP HTTP 서버가 고드름 라이브러리를 활용하고 최적화 된 정적 파일 서빙을 위해 Apache와 통합하는 것을 보여줍니다. 예제 코드는 https://github.com/sitepoint-editors/icicle-http-server .
에서 사용할 수 있습니다.
주요 장점
최적화 된 정적 파일 서빙에 대한 Apache 구성
정적 파일에 대한 불필요한 PHP 처리를 피하려면 Apache를 직접 제공하도록 구성하십시오.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) http://%{SERVER_NAME}:9001%{REQUEST_URI} [P]
이 mod_rewrite
구성은 Apache가 존재하지 않는 파일에 대한 요청을 다른 포트 (예 : 9001)로 전달하도록 지시합니다. 여기서 PHP 아이 시클 서버가 처리 할 수 있습니다.
기본 고드름 http 서버
고드름을 설치하여 시작하십시오 :
composer require icicleio/http
간단한 고드름 http 서버 예 :
// server.php
require __DIR__ . "/vendor/autoload.php";
use Icicle\Http\Message\RequestInterface;
use Icicle\Http\Message\Response;
use Icicle\Http\Server\Server;
use Icicle\Loop;
use Icicle\Socket\Client\ClientInterface;
$server = new Server(function (RequestInterface $request, ClientInterface $client) {
$response = (new Response(200))->withHeader("Content-Type", "text/plain");
yield $response->getBody()->end("hello world");
yield $response;
});
$server->listen(9001);
Loop\run();
League \ Route를 사용한 고급 라우팅
보다 강력한 라우팅을 위해 리그 \ 루트를 통합하십시오 :
composer require league/route
향상된 server.php
라우팅 :
// server.php
// ... (previous imports) ...
use League\Route\Http\Exception\MethodNotAllowedException;
use League\Route\Http\Exception\NotFoundException;
use League\Route\RouteCollection;
use League\Route\Strategy\UriStrategy;
// ... (Server creation) ...
$router = new RouteCollection();
$router->setStrategy(new UriStrategy());
require __DIR__ . "/routes.php";
$dispatcher = $router->getDispatcher();
try {
$result = $dispatcher->dispatch($request->getMethod(), $request->getRequestTarget());
$status = 200;
$content = $result->getContent();
} catch (NotFoundException $e) {
$status = 404;
$content = "not found";
} catch (MethodNotAllowedException $e) {
$status = 405;
$content = "method not allowed";
}
// ... (Response creation and sending) ...
샘플 loures.php
:
$router->addRoute("GET", "/home", function () {
return "hello world";
});
리그 \ 플레이트로 복잡한 조회수를 렌더링하는
복잡한 전망의 경우 리그 \ 플레이트를 사용하십시오 :
composer require league/plates
템플릿 구현 ( templates/layout.php
및 템플릿/home.php
의 예제 스 니펫 및 업데이트 된 lour.php
는 간단하지만 원래 예제의 구조를 따르십시오).
성능 벤치 마크 및 결론
원래 기사에는 상당수의 동시 요청을 처리 할 수있는 서버의 기능을 보여주는 성능 벤치 마크가 포함되어 있습니다. 이러한 벤치 마크는 특정 하드웨어 및 실행 된 조건의 맥락에서 고려해야합니다. 핵심 테이크 아웃은 고드름의 비동기 모델로 고성능의 잠재력입니다. 이 기사는 실험과 지역 사회 토론을 장려함으로써 끝납니다. 고드름 저자가 제공하는 업데이트 된 벤치 마크도 포함되어 있습니다. FAQ 섹션은 서버 개발에 고드름을 사용하는 다양한 측면을 더 명확하게 설명합니다.부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3