PHP 5.5 にそろそろアップデートしたいです!そしてアップデートしますと、キャッシュすることでパフォーマンス向上に貢献してくださった APC が使えなくなってしまうとのこと。代わりに、APCu と OPcache が使えるとのことで、インストールいたしました。
- Zend OPcache はオペコードキャッシュ(コンパイル後のコードをメモリに保存して再利用)
- APCu はユーザーキャッシュ(オブジェクトや変数をメモリに保存して、別のリクエストからそれを再利用)
- APC はオペコードキャッシュ + ユーザーキャッシュ
今回はその記録をノートいたします。
作業前の状態
- PHP 5.4.33
- pecl/APC 3.1.15dev
- Remi リポジトリ導入済み
- Apache ではなく、nginx
- PHP は php-fpm
1.PHP 5.5 をインストールできるかどうか、Remi リポジトリの設定を確認
vim /etc/yum.repos.d/remi.repo
[remi-php55] が存在するものの、有効ではないことを確認
[remi-php55] name=Les RPM de remi de PHP 5.5 pour Enterprise Linux 5 - $basearch #baseurl=http://rpms.famillecollet.com/enterprise/5/php55/$basearch/ mirrorlist=http://rpms.famillecollet.com/enterprise/5/php55/mirror # WARNING: If you enable this repository, you must also enable "remi" enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
2.APC を停止(アンインストールしない)
vim /etc/php.d/apc.ini
修正前
; This can be set to 0 to disable APC. ;apc.enabled=1
修正後
; This can be set to 0 to disable APC. apc.enabled=0
apc.enabled のデフォルトは 1 なので、コメント化されていても 1 です。
よって、APC を無効化するために、コメントを外し、0 を設定いたしました。
nginx、php-fpm を再起動します。
/etc/init.d/nginx restart /etc/init.d/php-fpm restart
そして、無効になったことを確認します。
php -i | grep apc.enabled
次のように表示され、APC が無効になったことが確認できました。
apc.enabled => Off => Off
3.PHP5.5 へアップデート
先ほど Remi リポジトリ設定を確認して、存在するものの有効ではありませんでしたので、yum でアップデートするときに指定して有効にいたします。
また、remi-php55 だけではなく remi も指定しないと、依存の関係でエラーとなりましたので注意!
yum --enablerepo=remi,remi-php55 update
次のパッケージがインストール、アップデートされました。
===============================================================================================
 Package                     Arch        Version                       Repository         Size
===============================================================================================
Installing:
 php-mysqlnd                 i386        5.5.17-1.el5.remi             remi-php55        341 k
     replacing  php-mysql.i386 5.4.33-1.el5.remi
 php-pecl-apcu               i386        4.0.6-1.el5.remi.5.5          remi-php55        103 k
     replacing  php-pecl-apc.i386 3.1.15-0.4.20130912.el5.remi.5.4
Updating:
 curl                        i386        7.27.0-11.el5.remi            remi-php55        261 k
 libcurl                     i386        7.27.0-11.el5.remi            remi-php55        221 k
 php                         i386        5.5.17-1.el5.remi             remi-php55        2.9 M
 php-cli                     i386        5.5.17-1.el5.remi             remi-php55        4.3 M
 php-common                  i386        5.5.17-1.el5.remi             remi-php55        1.2 M
 php-devel                   i386        5.5.17-1.el5.remi             remi-php55        1.4 M
 php-fpm                     i386        5.5.17-1.el5.remi             remi-php55        1.4 M
 php-gd                      i386        5.5.17-1.el5.remi             remi-php55         88 k
 php-imap                    i386        5.5.17-1.el5.remi             remi-php55         85 k
 php-mbstring                i386        5.5.17-1.el5.remi             remi-php55        1.2 M
 php-mcrypt                  i386        5.5.17-1.el5.remi             remi-php55         48 k
 php-pdo                     i386        5.5.17-1.el5.remi             remi-php55        119 k
 php-process                 i386        5.5.17-1.el5.remi             remi-php55         64 k
 php-xml                     i386        5.5.17-1.el5.remi             remi-php55        282 k
Installing for dependencies:
 fontconfig                  i386        2.4.1-7.el5                   base              174 k
 gd-last                     i386        2.1.0-3.el5.remi              remi              140 k
 php-pecl-jsonc              i386        1.3.6-1.el5.remi.5.5.1        remi-php55         72 k
 php-pecl-jsonc-devel        i386        1.3.6-1.el5.remi.5.5.1        remi-php55         25 k
 php-pecl-zip                i386        1.12.4-1.el5.remi.5.5         remi-php55        319 k
Transaction Summary
===============================================================================================
Install       7 Package(s)
Upgrade      14 Package(s)
…略…
Installed:
 php-mysqlnd.i386 0:5.5.17-1.el5.remi php-pecl-apcu.i386 0:4.0.6-1.el5.remi.5.5 
Dependency Installed:
 fontconfig.i386 0:2.4.1-7.el5 
 gd-last.i386 0:2.1.0-3.el5.remi 
 php-pecl-jsonc.i386 0:1.3.6-1.el5.remi.5.5.1 
 php-pecl-jsonc-devel.i386 0:1.3.6-1.el5.remi.5.5.1 
 php-pecl-zip.i386 0:1.12.4-1.el5.remi.5.5 
Updated:
 curl.i386 0:7.27.0-11.el5.remi libcurl.i386 0:7.27.0-11.el5.remi 
 php.i386 0:5.5.17-1.el5.remi php-cli.i386 0:5.5.17-1.el5.remi 
 php-common.i386 0:5.5.17-1.el5.remi php-devel.i386 0:5.5.17-1.el5.remi 
 php-fpm.i386 0:5.5.17-1.el5.remi php-gd.i386 0:5.5.17-1.el5.remi 
 php-imap.i386 0:5.5.17-1.el5.remi php-mbstring.i386 0:5.5.17-1.el5.remi 
 php-mcrypt.i386 0:5.5.17-1.el5.remi php-pdo.i386 0:5.5.17-1.el5.remi 
 php-process.i386 0:5.5.17-1.el5.remi php-xml.i386 0:5.5.17-1.el5.remi 
Replaced:
 php-mysql.i386 0:5.4.33-1.el5.remi php-pecl-apc.i386 0:3.1.15-0.4.20130912.el5.remi.5.4 
Complete!
ゆくゆくは削除する予定と思っておりましたけれども、この段階で APC は php-pecl-apc から php-pecl-apcu に置き換えられていますね。
また、APC の設定ファイル /etc/php.d/apc.ini も /etc/php.d/apc.ini.rpmsave に置き換えられ、無効になっています。
代わりに、/etc/php.d/apcu.ini が作成されています。
3.5.APC をアンインストールしないで停止した理由は PHP5.5 へのアップデートで APC が APCu へ自動的に置き換わるから♪あと、APCu の初期設定内容
一旦 APC をアンインストールして、APCu をインストールする手間が省けます♪
ただ、、、このことは実は狙ってではなく、偶然気がついたのですけれどもね、てへっ♪
ちなみに、APCu の設定は次のコマンドで調べました。APCu がパッケージですけれども、設定で使用される名前は apc なのですね。
php -i | grep apc
そして、初期設定値は次のようになります。
Additional .ini files parsed => /etc/php.d/apcu.ini, apc apcu MMAP File Mask => /tmp/apc.XXXXXX apc.coredump_unmap => Off => Off apc.enable_cli => Off => Off apc.enabled => On => On apc.entries_hint => 4096 => 4096 apc.gc_ttl => 3600 => 3600 apc.mmap_file_mask => /tmp/apc.XXXXXX => /tmp/apc.XXXXXX apc.preload_path => no value => no value 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 => php => php apc.shm_segments => 1 => 1 apc.shm_size => 32M => 32M apc.slam_defense => On => On apc.smart => 0 => 0 apc.ttl => 0 => 0 apc.use_request_time => On => On apc.writable => /tmp => /tmp
4.OPcache インストール
yum --enablerepo=remi,remi-php55 install php-opcache
インストール時点で、すでに有効となっているようです。
4.5.OPcache 設定確認
こちらのページの推奨設定に設定しようかと思いましたけれども、調べてみますと既に推奨の値がセットされております。ただ、次の設定のみ異なり、インストール直後のままといたしました。
opcache.revalidate_freq => 2 => 2 がインストール直後の設定で、参考ページの設定は 60 です。
opcache.revalidate_freq は「更新のためにスクリプトのタイムスタンプをチェックする頻度。(秒単位)」で 60 にすると、60秒毎にキャッシュするかどうかをチェックする理解でよさそうですね。
ちなみに、使用した設定を調べるコマンドです。
php -i | grep opcache
そして、インストール直後の設定です。
/etc/php.d/opcache.ini, opcache.blacklist_filename => /etc/php.d/opcache*.blacklist => /etc/php.d/opcache*.blacklist opcache.consistency_checks => 0 => 0 opcache.dups_fix => Off => Off opcache.enable => On => On opcache.enable_cli => Off => Off opcache.enable_file_override => Off => Off opcache.error_log => no value => no value opcache.fast_shutdown => 1 => 1 opcache.file_update_protection => 2 => 2 opcache.force_restart_timeout => 180 => 180 opcache.inherited_hack => On => On opcache.interned_strings_buffer => 8 => 8 opcache.load_comments => 1 => 1 opcache.log_verbosity_level => 1 => 1 opcache.max_accelerated_files => 4000 => 4000 opcache.max_file_size => 0 => 0 opcache.max_wasted_percentage => 5 => 5 opcache.memory_consumption => 128 => 128 opcache.optimization_level => 0xFFFFFFFF => 0xFFFFFFFF opcache.preferred_memory_model => no value => no value opcache.protect_memory => 0 => 0 opcache.restrict_api => no value => no value opcache.revalidate_freq => 2 => 2 opcache.revalidate_path => Off => Off opcache.save_comments => 1 => 1 opcache.use_cwd => On => On opcache.validate_timestamps => On => On
最後に、ウェブサーバを再起動して、設定を反映させます。
/etc/init.d/nginx restart /etc/init.d/php-fpm restart
以上で PHP5.5 へのアップデートと、APC アンインストール、APCu、OPcache インストールと初期設定の確認、有効化が完了しました♪
おわりに
次のページが参考になりました。ありがとう存じます!
- CentOSのPHPを5.4から5.5にアップデート。OPcacheとAPCuも設定
- ZendOpcacheとAPCuではじめるハイパフォーマンスPHP – pixiv engineering blog
予想以上に簡単に導入できてホッとしましたわ♪
次は APCu と OPcache のチューニングかしらね!
以上です。
