イベント駆動型プログラミングは、手続き的コーディングに慣れたPHP開発者にとってユニークな課題です。 PHPの手続き上の性質では、イベントはしばしば単純な機能呼び出しに要約され、固有の非同期挙動はありません。 すべてのコード実行はブロックされています。
ただし、JavaScriptのような言語は、イベントループが中心コンポーネントとしての可能性を示しています。 この洞察により、開発者はイベントループと非同期機能をPHP HTTPサーバーに統合するようになりました。この記事では、ICICLEライブラリを活用する高性能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
configurationは、存在しないファイルのリクエストを別のポート(例えば9001)に転送するようにapacheに指示します。
基本的なiticle http server
iticleをインストールすることから始めます:
composer require icicleio/http
シンプルなiticle 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 withルーティング:
// 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) ...
サンプル routes.php :
$router->addRoute("GET", "/home", function () {
return "hello world";
});
リーグ\ platesで複雑なビューをレンダリングする
複雑なビューについては、リーグ\プレートを使用してください:
composer require league/plates
実装テンプレート(テンプレート/layout.php および
/home.php
routes.php routes.php)のsnippetsの例)。
元の記事には、かなりの数の同時リクエストを処理するサーバーの機能を示すパフォーマンスベンチマークが含まれています。 これらのベンチマークは、実行された特定のハードウェアと条件のコンテキストで考慮する必要があります。 重要なポイントは、Icicleの非同期モデルで高性能の可能性です。 この記事は、実験とコミュニティの議論を奨励することで締めくくります。 ICICLE著者が提供する更新されたベンチマークも含まれています。 FAQセクションでは、サーバー開発にiticleを使用することのさまざまな側面をさらに明確にします。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3