APC まとめ

APC (Alternative PHP Cache) を導入すると、PHP の実行速度が大幅に向上する。仕組みは、PHP はスクリプト言語なので実行するたびにコンパイルが行われるが、APC によって中間コードをキャッシュすることで、高速化を行っている。

導入

APC を pecl でインストールする。

CODE:
  1. # yum -y install httpd httpd-devel php php-devel php-pear php-gd gcc
  2. # pecl install apc
  3.  
  4.     ... 略
  5.     Build process completed successfully
  6.     Installing '/var/tmp/pear-build-root/install-APC-3.0.19//usr/lib/php/modules/apc.so'
  7.     install ok: channel://pecl.php.net/APC-3.0.19
  8.     You should add "extension=apc.so" to php.ini
  9.  
  10. # ll /usr/lib/php/modules/apc.so
  11.  
  12.     -rwxr-xr-x 1 root root 412650 Dec  1 11:51 /usr/lib/php/modules/apc.so

APC の設定ファイルを作成する。これはパフォーマンスを重視した設定内容のため、注意する事。

CODE:
  1. # cat /etc/php.d/apc.ini
  2.  
  3.     ; 必修項目
  4.     extension=apc.so                      ; 必修
  5.                                           
  6.     ; カスタマイズ                       
  7.     apc.shm_size=100                      ; 個々の共有メモリセグメントの大きさを MB 単位で指定 (default 30)
  8.     apc.file_update_protection=0          ; [要注意] 新しいファイルをキャッシュするまでの遅延秒数 (default 2)
  9.     apc.stat=0                            ; [要注意] ファイル更新を確認する (default 1)
  10.                                           
  11.     ; デフォルト値                       
  12.     apc.enabled=1                         ; APC を有効にする
  13.     apc.shm_segments=1                    ; コンパイラキャッシュのために割り当てる共有メモリセグメントの数
  14.     apc.optimization=0                    ; [実験項目] 最適化レベル
  15.     apc.num_files_hint=1000               ; Web サーバで読み込まれるソースファイルの総数についてのヒント
  16.     apc.user_entries_hint=4096            ; apc.num_files_hint と同様に、保存するユーザキャッシュ変数の数についてのヒント
  17.     apc.ttl=0                             ; キャッシュされているエントリが、他のエントリに割り当てられるまでスロットに残っていることの可能な秒数
  18.     apc.user_ttl=0                        ; ユーザキャッシュエントリが、 他のエントリに割り当てられるまでスロットに残っていることの可能な秒数
  19.     apc.gc_ttl=3600                       ; キャッシュエントリがガベージコレクションのリストに残り続ける秒数
  20.     apc.cache_by_default=1                ; OFF にすると、次項のフィルタリストに一致したファイルのみをキャッシュできる
  21.     apc.filters=NULL                      ; フィルタリスト
  22.     apc.mmap_file_mask=NULL               ; mktemp 形式のファイルマスクを指定
  23.     apc.slam_defense=0                    ; [非推奨] ファイルをキャッシュせずに利用する割合
  24.     apc.enable_cli=0                      ; デバッグモード
  25.     apc.max_file_size=1M                  ; この値よも大きなサイズのファイルは、キャッシュしない (default 1M)
  26.     apc.write_lock=1                      ; ひとつのプロセスのみが未キャッシュのスクリプトをコンパイルする
  27.     apc.report_autofilter=0               ; バインド時の問題によりキャッシュから自動的に除外されたスクリプトを記録
  28.     apc.include_once_override=0           ; include_once() および require_once() を最適化し、コストの高いシステムコールの使用を避ける
  29.     apc.rfc1867=0                         ; PHP 5.2.0 以降
  30.     apc.rfc1867_prefix=upload_            ; PHP 5.2.0 以降
  31.     apc.rfc1867_name=APC_UPLOAD_PROGRESS  ; PHP 5.2.0 以降
  32.     apc.rfc1867_freq=0                    ; PHP 5.2.0 以降
  33.     apc.localcache=0                      ; ロックが不要なローカルプロセスのシャドウキャッシュを行う
  34.     apc.localcache.size=512               ; ローカルプロセスのシャドウキャッシュの大きさ
  35.     apc.coredump_unmap=0                  ; [実験項目] シグナルの発生時にコアファイルを書き出せる
  36.     apc.stat_ctime=0                      ; ctime による検証を行う

APC のステータスを Web 上から確認するスクリプトへのリンクを張る。また、デフォルト値の状態だと認証できない為、認証情報を修正する。

CODE:
  1. # ln -s /usr/share/pear/apc.php /var/www/html/apcinfo.php
  2. # vi /var/www/html/apcinfo.php
  3.  
  4.     defaults('ADMIN_USERNAME','********');          // Admin Username
  5.     defaults('ADMIN_PASSWORD','********');          // Admin Password - CHANGE THIS TO ENABLE!!!

APC を実行し、設定内容を確認する。

CODE:
  1. # service httpd restart
  2. # echo "<?php phpinfo(); ?>" /var/www/html/phpinfo.php
  3. # php /var/www/html/phpinfo.php | grep apc
  4.  
  5.     additional .ini files parsed => /etc/php.d/apc.ini,
  6.     apc
  7.     apc.cache_by_default => On => On
  8.     apc.coredump_unmap => Off => Off
  9.     apc.enable_cli => Off => Off
  10.     apc.enabled => On => On
  11.     apc.file_update_protection => 0 => 0
  12.     apc.filters => no value => no value
  13.     apc.gc_ttl => 3600 => 3600
  14.     apc.include_once_override => Off => Off
  15.     apc.max_file_size => 1M => 1M
  16.     apc.mmap_file_mask => no value => no value
  17.     apc.num_files_hint => 1000 => 1000
  18.     apc.report_autofilter => Off => Off
  19.     apc.shm_segments => 1 => 1
  20.     apc.shm_size => 100 => 100
  21.     apc.slam_defense => 0 => 0
  22.     apc.stat => Off => Off
  23.     apc.stat_ctime => Off => Off
  24.     apc.ttl => 0 => 0
  25.     apc.user_entries_hint => 4096 => 4096
  26.     apc.user_ttl => 0 => 0
  27.     apc.write_lock => On => On

http://IP/apcinfo.php に接続し、設定した認証情報で表示できるか確かめる。また、APC の設定項目で apc.stat=0 を行っているため、PHP スクリプトを編集した場合も、APC による編集前のキャッシュが実行される。そのため、ファイル更新を行うには Apache の再起動を行い、古いキャッシュを削除する必要がある。

関連文献

PHP: APC - Manual
http://www.php.net/manual/ja/book.apc.php

Leave a Reply