- 1. 概要
- 2. 設定
- 3. 編集
- 4. preload
1. 概要
最近(2021年10月28日)、どうにもこのサイトのアクセスに時間がかかるということで、あれこれ調べています。
本サイトは、「Apache」「PHP - Laravel」なので、それらのチューニングを行うことになります。
「PHP」の機能である、「OPcache」に関して調べてみます。
本ページは、下記のサイトを参考にさせていただきました(まぁ、公式ドキュメントですな)。
「PHP: OPcache - Manual」
参考サイトによれば
OPcache はコンパイル済みのバイトコードを共有メモリに保存し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省くことでパフォーマンスを向上させます。
このPHP拡張モジュールは PHP 5.5.0 以降のバージョンにバンドルされています。
ちゅうことです。
わたしが、現在使用しているバージョンが「8.0.12」なので、とっくのとうに、機能としては、実装されていることになります。
特にヘンテコな、インストールオプションを指定しない限りは、「PHP」のインストールと同時にインストールされるそうなので、ここでは、インストール手順については、記述しません。
2. 設定
公式ドキュメントによれば、推奨設定値は
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
ちゅうことです。
これに関して、わたし自身、特に設定をいじった覚えはないのですが・・・、
現在の値が
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.enable_cli=0
となっております。
「opcache.fast_shutdown」ちゅうのは、項目にないようです。
バージョンの違い?
ドキュメントにありましたね、「PHP 7.2.0 より前のバージョンで有効」と書いてありますので、既にわたしの環境では、無意味になっております。
値の異なる要素について、ドキュメントを読んでみます。
「opcache.max_accelerated_files」
OPcache ハッシュテーブルのキー(すなわちスクリプト)の最大数。 使用される現時点の値は、 素数の集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 } のうち、 設定値以上の最初の数値です。 最小値は 200 です。最大値は 1000000 です。 これらの範囲外の値が設定されても、範囲内の値に設定し直されます。
「opcache.revalidate_freq」
更新のためにスクリプトのタイムスタンプをチェックする頻度。(秒単位) 0 にすると、OPcache は、リクエストごとに更新をチェックします。
この設定ディレクティブは、 opcache.validate_timestamps が無効の場合、 無視されます。
「opcache.enable_cli」
PHP の CLI 版に対してオペコード・キャッシュを有効にします。
「opcache.max_accelerated_files」は、推奨値より大きいので、まぁよしとします。
「opcache.revalidate_freq」は、2 より推奨値の 60 の方がいいかしら・・・。
「opcache.enable_cli」は、「CLI」なので、どうでもいい気はしますが・・・、1 にしておきますか。
3. 編集
「php.ini」を編集します。
[opcache]
のセクションには、有効行がなかったので、下記の2行を追加するのみです。
opcache.revalidate_freq=60
opcache.enable_cli=1
前者は、まったくその記述がなかったので、まるまる追加。
後者は、「=0」の行がコメントアウトされていましたので、「=1」にして有効化しました。
変更後、「apache」を「configtest」して「restart」します。
「Apache Bench」で、設定前後を比べてみましたが、むしろ設定変更前より遅い。
実際、誤差の範囲内なので、遅くはなっていないでしょうが、とりあえず、劇的な差はありませんな。
4. preload
「OPcache」には、「preload」という機能があって・・・。
「php.ini」に
opcache.preload=preload.php
という記述をしておいて、「preload.php」に例えば、公式ドキュメントでは、下記のように記述しておりますが・・・。
<?php
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src');
$fullTree = new RecursiveIteratorIterator($directory);
$phpFiles = new RegexIterator($fullTree, '/.+((?<!Test)+\.php$)/i', RecursiveRegexIterator::GET_MATCH);
foreach ($phpFiles as $key => $file) {
require_once($file[0]);
}
なんか、サーバ起動時に、「preload.php」を実行して、そこで定義している、「.php」は事前に読み込んでキャッシュしておいてくれるそうです。
結構、効果があるように書いてあるサイトも多いのですが、わたしの環境の場合、サブディレクトリごとに実行したいものが違ったり・・・。
へたなことをすると、ファイル変更の都度、サーバを再起動することになったり・・・。
と、ちょっと今のところハードルが高すぎて、試しておりません。
|