page_adsence

2011年6月16日木曜日

PHPアクセラレータ(APC)の導入とそのメリット

PHPはスクリプト言語だが、単純なインタプリタ言語ではない。
PHPスクリプトの実行時は、常に「ランタイム・コンパイラ」が自動的にスクリプトをバイトコードへコンパイルし、これを「エグゼキュータ」が実行する。
コンパイルといってもOSネイティブなバイナリに変換されるわけではなく、エグゼキュータが解釈可能な形式へ変換される。

PHPスクリプトは実行の度に毎回コンパイルされる。このため、ランタイム・コンパイラが同じスクリプトのコンパイルを何度も余分に行っていることになり、パフォーマンスは犠牲になっている。

アクセラレータなしの場合
リクエストが来る
      ↓
スクリプト読み込み
      ↓
スクリプト解析
      ↓
スクリプトコンパイル
      ↓
スクリプト実行
      ↓
レスポンスを返す

アクセラレータありで、キャッシュされている場合
リクエストが来る
      ↓
スクリプト実行
      ↓
レスポンスを返す

上記を見てもらうとわかるようにスクリプトの読み込み、解析、コンパイルという部分がまるっと必要なくなる。
ソース量が多ければ多いほど高速化に期待が持てる。

というわけで導入方法は以下の通り。

ソースコンパイルとかyumで入れるとかいろいろと方法はあるみたいですが、
既存のリポジトリにphp-apcがなかったので、PECLでインストールをしてみました。

[root@localhost yum.repos.d]# pecl install apc
downloading APC-3.1.9.tgz ...
Starting to download APC-3.1.9.tgz (155,540 bytes)
.................................done: 155,540 bytes
54 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
Enable internal debugging in APC [no] :
Enable per request file info about files used from the APC cache [no] :
Enable spin locks (EXPERIMENTAL) [no] :
Enable memory protection (EXPERIMENTAL) [no] :
Enable pthread mutexes (default) [yes] :
Enable pthread read/write locks (EXPERIMENTAL) [no] :

中略

Build process completed successfully
Installing '/usr/lib/php/modules/apc.so'
Installing '/usr/include/php/ext/apc/apc_serializer.h'
install ok: channel://pecl.php.net/APC-3.1.9
configuration option "php_ini" is not set to php.ini location
You should add "extension=apc.so" to php.ini

赤文字になっている部分はいろいろと質問されているみたいなんですが、
とりあえずインストールしてみたかっただけなので、
Enter連打でインストール完了。

# vi /etc/php.d/apc.ini
extension=apc.so

上記を追加して保存。
apache再起動

# /etc/init.d/httpd restart

phpinfoで確認

# php -i
Configuration

apc

APC Support => disabled
Version => 3.1.9
APC Debugging => Disabled
MMAP Support => Enabled
MMAP File Mask =>
Locking type => pthread mutex Locks
Serialization Support => broken
Revision => $Revision: 308812 $
Build Date => Jun 15 2011 19:31:38

Directive => Local Value => Master Value
apc.cache_by_default => On => On
apc.canonicalize => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.file_md5 => Off => Off
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.lazy_classes => Off => Off
apc.lazy_functions => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => no value => no value
apc.num_files_hint => 1000 => 1000
apc.preload_path => no value => no value
apc.report_autofilter => Off => Off
apc.rfc1867 => Off => Off
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.rfc1867_ttl => 3600 => 3600
apc.serializer => default => default
apc.shm_segments => 1 => 1
apc.shm_size => 32M => 32M
apc.slam_defense => On => On
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On

とりあえず入ったみたいです。
使ってみたらまた感想を書いてみたいと思います。
とはいえVMWare上の自分しか使わないサーバなので、対して効果はないと思いますが…。