メンテナンス・トラブルシュート - PHP - OPcache

 クラウディア
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」は事前に読み込んでキャッシュしておいてくれるそうです。  結構、効果があるように書いてあるサイトも多いのですが、わたしの環境の場合、サブディレクトリごとに実行したいものが違ったり・・・。  へたなことをすると、ファイル変更の都度、サーバを再起動することになったり・・・。  と、ちょっと今のところハードルが高すぎて、試しておりません。
ハイスピードプランそれがだいじWi-Fi