PHPのAPCとOPcache試してみた

ちょっと仕事でPHPのパフォーマンス改善の必要があったので
勉強がてらPHPAPCとOPcache試してみた。

APCのインストール

環境は

$ pecl install apc
Fatal error: Call to a member function getFilelist() on a non-object in /usr/local/Cellar/php55/5.5.10/lib/php/PEAR/Command/Install.php on line 742

インストールで怒られてこける

issueになってた
Can not install extension with pecl · Issue #1039 · Homebrew/homebrew-php · GitHub

$ touch $(brew --prefix php54)/lib/php/.lock && chmod 0644 $(brew --prefix php54)/lib/php/.lock

再度インストール

$ pecl install apc
$ php -m | grep apc
apc

どれくらい早くなるのか確認する
/etc/hostsを書き換えて
phpinfoを出力してみる

// 10並列で100リクエスト
$ ab -n 100 -c 10 http://apc.localhost/php_info.php

// apcなし
Time per request:       8.322 [ms] (mean)
Time per request:       0.832 [ms] (mean, across all concurrent requests)

// apcあり
Time per request:       8.026 [ms] (mean)
Time per request:       0.803 [ms] (mean, across all concurrent requests)

そこまで劇的に早くはならない。

OPcacheのインストール

ついでにPHP55に上げる。
PHP55からはデフォルトでOPcacheが入る。
APCは使わない流れっぽい。

APCより20%ほど早くなることもあるらしい。
PHP5.5 のコードキャッシュは APC から Zend OPcache へ - Shin x blog

$ brew install php55 --with-fpm
$ brew unlink php54
$ brew link php55

$ vi /usr/local/etc/php/5.5/php.ini
// 追記
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20121212/opcache.so

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

fpmを再起動してOPcacheが読み込まれてるか確認

$ php -v

PHP 5.5.20 (cli) (built: Jan 11 2015 23:52:35) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

ベンチマークとってみる

$ ab -n 100 -c 10 http://apc.localhost/php_info.php

Time per request:       5.825 [ms] (mean)
Time per request:       0.582 [ms] (mean, across all concurrent requests)

25%くらい早くなってる。

今回はphpinfoを出力しただけだったけど
php55とopcacheでけっこう早くなった。

これがwebアプリでフレームワークとか使ってると
ルーティングとかの共通処理が入ってるのでもっと早くなりそう。

合わせてAPCuも試してみたい。