私はPHPの組み込みWebサーバーに関連するテストプロジェクトに取り組んでおり、いくつかのアイデアを試しています。PHPに組み込まれたWebサーバーのキャッシュ問題
一般的に使われているリソース(png、jpg、json、txtなど)に独自のキャッシュメカニズムを実装して、PHPの組み込みサーバーの負荷を軽減したいと考えています。
私はこのようなサーバーで構築を開始:
PHPは、だから、ビルトインサーバーのドキュメントルートを127.0.0.1:80 -t公共router.php
を-S public
に設定され、router.php
が実行されます(単純な書き換え機能を実装することも考えています)。 、http://localhost/apple-icon-120x120.png
だから、これはリソースの最初の負荷は次のとおりです。
<?php
// Register request uri
$requestUri = isset($_SERVER['REQUEST_URI'])
? $_SERVER['REQUEST_URI']
: '/';
// Handle app resources with caching
if (preg_match('/\.(?:png|jpg|jpeg|gif|xml|json|css|eot|svg|otf|ttf|woff|woff2|scss|less|txt|ico)$/', $requestUri))
{
// Generate file name
$fileName = __DIR__ .'/public'. $requestUri;
// Parse file data
$lastModified = filemtime($fileName);
$etagFile = md5_file($fileName);
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
// Set caching header
header('Last-Modified: '. gmdate('D, d M Y H:i:s', $lastModified) .' GMT');
header('Etag: '. $etagFile);
header('Cache-Control: public');
// Check if the requested resource has changed
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $etagHeader == $etagFile)
{
// File has not changed
header('HTTP/1.1 304 Not Modified');
exit;
}
else
{
// Parse requested resource's mime type
$finfo = new finfo(FILEINFO_MIME);
$mime_type = $finfo->buffer(
file_get_contents($fileName, false, null, -1, 64),
FILEINFO_MIME_TYPE
);
// Serve requested resource
header('Content-Type: '. $mime_type);
header('Content-Length: '. filesize($fileName));
@readfile($fileName);
$finfo = null;
exit;
}
}
// Parse requested page & action
list ($page, $action) =
array_pad(array_values(array_filter(explode('/', $requestUri, 3), 'strlen')), 2, 'index');
if ($page == 'index') $page = 'server';
// Test - to do rest of routing
var_dump('page = '. $page);
var_dump('action = '. $action);
// include 'app/'. $page .'/'. $action .'.php';
?>
は、私は次のURLにアクセスしreource(PNG画像)キャッシュをテストした:
、I PRES場合:期待、約307ms
を取るようにHTTP 200
応答を返しますリソースを提供ページをリロードするF5
をsの予想通り、サーバは(変更されません)HTTP 304
返し、要求が(!!素晴らしい)約5ms
ました:
私は三度目のF5
を押すと、サーバーはまだHTTP 304
を返します。予想通り、(リソースがキャッシュされていなかったかのように)要求が再び約306ms
ましたが、この時間は(変更されません):私はF5
を押し続けると、要求を処理する時間が5m
との間でランダムにalternativingさ
約307ms
。
これがこのように動作する理由は何ですか?リソースがキャッシュされると、それは常に304
を返して、要求を約5ms
に処理してはいけませんか?行動が散発的なのはなぜですか?
返されるコンテンツのサイズが225 bytes
であることがわかりました(データが認識されているとわかっています)、リクエスト処理時間のどこにボトルネックがあるのか分かりません。私のホストマシンはIntel i7 CPU、6GB RAMのWindowsを実行しています& SSDドライブ。