JavaScriptを有効にしてください

Dockerを使用してPHPのOPcacheを有効化する方法

 · 

Dockerを使用してPHPのOPcacheを有効化する方法

PHPのパフォーマンスを向上させるための重要なツールの一つにOPcacheがあります。
OPcacheは、コンパイル済みのPHPスクリプトのバイトコードをメモリにキャッシュすることで、スクリプトの再実行時にコンパイルを省略し、実行速度を向上させます。
この記事では、Dockerを使用してPHPのOPcacheを有効化する方法を紹介します。

ステップ 1: Dockerfileの作成

Dockerfileを作成してPHP-FPMとOPcacheをセットアップします。
また、カスタムのphp.ini設定を適用するためのファイルも準備します。

1
2
3
4
5
6
7
FROM php:8.3-fpm

# OPcacheを有効にする
RUN docker-php-ext-enable opcache

# custom-php.iniをコピー
COPY custom-php.ini $PHP_INI_DIR/conf.d/

ステップ 2: OPcacheの設定ファイルを作成

custom-php.iniには、OPcacheの設定を含めます。例えば下記のように設定します。

1
2
3
4
5
6
7
8
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.fast_shutdown=1

OPcacheの設定オプションの解説

custom-php.iniで設定した各項目の詳細について解説します。

基本設定

  • opcache.enable

    • 1に設定するとOPcacheが有効になります。
    • 0に設定すると無効になります。
  • opcache.memory_consumption

    • OPcacheが使用するメモリの最大量をメガバイト単位で指定します。
  • opcache.interned_strings_buffer

    • PHPが内部的に使用する文字列のためのメモリ領域のサイズをメガバイト単位で指定します。

パフォーマンス設定

  • opcache.max_accelerated_files

    • キャッシュできるPHPファイルの最大数を指定します。
  • opcache.validate_timestamps

    • 1に設定すると、PHPファイルが変更されたかどうかをチェックします。(開発環境では基本的にこちらを使用します)
    • 0に設定すると、変更チェックを行わず、パフォーマンスが向上します。(本番環境では基本的にこちらを使用します)
  • opcache.revalidate_freq

    • opcache.validate_timestamps=1の場合、PHPファイルの変更をチェックする頻度を秒単位で指定します。
    • opcache.revalidate_freq=60の場合、60秒ごとに更新することになります。

高度な設定

  • opcache.fast_shutdown
    • 1に設定すると、スクリプトの実行終了時のメモリ解放処理を最適化します。

これらの設定を適切に調整することで、アプリケーションのパフォーマンスを最適化し、エンドユーザーにより良い体験を提供することが可能になります。

ステップ 3: Nginxの設定

Nginxの設定ファイルdefault.confを作成し、PHPのリクエストをPHP-FPMに転送するように設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

ステップ 4: Docker Composeの設定

docker-compose.ymlファイルを作成して、NginxとPHP-FPMのコンテナを連携させます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./html:/var/www/html
    depends_on:
      - php-fpm
    networks:
      - app-network

  php-fpm:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./html:/var/www/html
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

この設定では、htmlディレクトリ内のファイルがNginxとPHP-FPMの両方で共有されます。

ステップ 5: デモ用PHPスクリプトの準備

このスクリプトは、opcache_get_status()関数を使用してOPcacheの現在の設定と状態を取得し、それを整形して表示します。
OPcacheが有効であれば、キャッシュされているスクリプトの情報やキャッシュのヒット率など、詳細な情報を確認することができます。

demo.phpスクリプトはhtmlディレクトリに配置します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
// OPcacheが有効かどうかを確認
if (function_exists('opcache_get_status')) {
    $opcacheStatus = opcache_get_status(false);

    if ($opcacheStatus) {
        echo "<h1>OPcache Status</h1>";
        echo "<pre>";
        print_r($opcacheStatus);
        echo "</pre>";
    } else {
        echo "<p>OPcache status information not available. Make sure OPcache is enabled.</p>";
    }
} else {
    echo "<p>OPcache is not enabled in your PHP installation.</p>";
}

ステップ 6: 環境のビルドと起動

ここまでのステップでファイル構成は下記のようになっています。

1
2
3
4
5
6
7
8
$ tree
.
├── Dockerfile
├── custom-php.ini
├── default.conf
├── docker-compose.yml
└── html
    └── demo.php

以下のコマンドを実行して、環境をビルドし、起動します。

1
docker-compose up --build

ステップ 7: テストの実行

ブラウザからhttp://localhost:8080/demo.phpにアクセスするか、curlコマンドを使用してリクエストを送り、実行します。

1
curl http://localhost:8080/demo.php

ブラウザに下記内容が表示されれば問題なく動作しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
OPcache Status
Array
(
    [opcache_enabled] => 1
    [cache_full] => 
    [restart_pending] => 
    [restart_in_progress] => 
    [memory_usage] => Array
        (
            [used_memory] => 9169096
            [free_memory] => 125048632
            [wasted_memory] => 0
            [current_wasted_percentage] => 0
        )

    [interned_strings_usage] => Array
        (
            [buffer_size] => 8388608
            [used_memory] => 2363280
            [free_memory] => 6025328
            [number_of_strings] => 5629
        )

    [opcache_statistics] => Array
        (
            [num_cached_scripts] => 1
            [num_cached_keys] => 1
            [max_cached_keys] => 16229
            [hits] => 0
            [start_time] => 1708224683
            [last_restart_time] => 0
            [oom_restarts] => 0
            [hash_restarts] => 0
            [manual_restarts] => 0
            [misses] => 1
            [blacklist_misses] => 0
            [blacklist_miss_ratio] => 0
            [opcache_hit_rate] => 0
        )

    [jit] => Array
        (
            [enabled] => 
            [on] => 
            [kind] => 5
            [opt_level] => 4
            [opt_flags] => 6
            [buffer_size] => 0
            [buffer_free] => 0
        )

)

opcache-guiをインストールする

ここまででopcacheの有効化に関して解説は終わりですが、opcacheを使っていると、今どのくらいのメモリを使用しているのか確認したい時があります。
そういった場合にopcache-guiをインストールしておくととても便利です。

opcache-guiは、PHPのOPcacheの状態を視覚的に確認できるウェブインターフェースです。
opcache-guiを使用すると、キャッシュの状態やパフォーマンス、設定などを簡単に確認できます。

opcache-guiの主な機能

キャッシュされたスクリプトの一覧表示

どのPHPファイルがOPcacheによってキャッシュされているかを確認できます。

キャッシュの使用状況

使用中のメモリ量、キャッシュされたスクリプトの数、キャッシュヒット率(キャッシュが効いている度合い)など、キャッシュの効率を示す指標を確認できます。

キャッシュの設定値

OPcacheの設定値を確認できます。
これには、メモリ消費量の上限やキャッシュするスクリプトの最大数などが含まれます。

キャッシュのクリア

ウェブインターフェースから直接、キャッシュをクリアすることができます。
これは、キャッシュされたデータをリセットしたい場合に便利です。

opcache-guiの利用方法

GitHub からindex.phpファイルをダウンロードし、ウェブサーバーにアップロードします。その後、ブラウザからそのファイルにアクセスすることで、opcache-guiを使用できます。

具体的には先ほど作成したhtmlフォルダにダウンロードしたindex.phpを配置するだけで完了です。

1
2
3
4
5
6
7
8
9
$ tree
.
├── Dockerfile
├── custom-php.ini
├── default.conf
├── docker-compose.yml
└── html
    ├── index.php
    └── test.php

ブラウザからhttp://localhost:8080/index.phpにアクセスすると下記画面が表示されます。
opcache-gui

まとめ

この記事では、Dockerを活用してPHPのOPcacheを設定し、その効果を検証する方法をステップバイステップで解説しました。
OPcacheはPHPスクリプトの実行速度を大幅に向上させることができる強力なツールであり、コンパイル済みのバイトコードをメモリにキャッシュすることで、スクリプトの再実行時のコンパイル時間を削減します。
このプロセスを通じて、アプリケーションのパフォーマンスを最適化し、エンドユーザーによりスムーズな体験を提供することが可能になります。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア