Nginx+PHP-FPMでPHPを動かしている場合、NginxとPHP-FPMの両方を再起動させないとZend OPcacheの設定がphpinfo()に出力されないぞ!
Zend OPcacheを有効にするまで悪戦苦闘したので、メモを残しておく。
本当はZend OPcacheとAPCuをインストール・設定っていう記事にしようとしたけど力尽きた。
次回、APCuのインストールについてきれいな手順を残す。
1. Zend OPcacheを設定
サーバ構築について参考にしている記事では、PHPアクセラレータとしてAPCやeAccelaratorを使っているが、せっかくPHP5.5を入れたのでZend OPcacheを使ってみる。
Zend OPcacheについてはこちらのスライドが参考になった。
前提としてPHP5.5をインストールしておくこと。
CentOS6.5にPHP5.5とPHP-FPM5.5をyumでインストールを参照。
PHP5.5をインストールしたらデフォルトで入ってる、らしい。
自分のところには入ってなかった、PHP5.5のインストール方法の問題?ソースからビルドしたらデフォルトなのかな。
インストールする。
sudo yum install php-opcache –enablerepo=remi-php55,remi
入ったか確認する。
php -v
以下が表示された。
with Zend OPcacheと表示されたから大丈夫ななず。
PHP 5.5.16 (cli) (built: Sep 3 2014 20:08:58)
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
2. Zend OPcacheが有効にならない
phpinfoでも見てみよう。
Nginxを再起動して設定を反映(したつもり)。
sudo /etc/init.d/nginx restart
phpinfoのファイルにアクセス。
「Zend OPcache」という項目のところを見てみる。
Opcode Caching Disabled
Optimization Disabled
Disabled・・・有効になってない・・・だと・・・
with Zend OPcacheって出てるのになんで?
Zend OPcacheの設定ファイルを見てみる。
sudo vim /etc/php.d/opcache.ini
zend_extension=opcache.so opcache.enable=1
ちゃんと有効化されてる。設定上は。
もっと詳しくOPcacheの状況を見てみる。
Opcache Control Panelというファイルがgithubに公開されている。
このファイルをドキュメントルートにダウンロードして設置する。
cd /var/www
sudo wget https://gist.github.com/ck-on/4959032/raw/0b871b345fd6cfcd6d2be030c1f33d1ad6a475cb/ocp.php
ocp.phpにアクセスする。
OPcacheの状況が詳しく見れるようになったが、Disabledのままだった・・・
サーバを通さずphpinfoを見てみる。
phpコマンドから見れるのを初めて知った。
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 => On => On
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
enableがOnになってるからOPcacheが有効になってるんじゃないのか!?
つまり、サーバを通すとダメってことか。
3. Nginx+PHP-FPMのときのZend OPcacheの反映方法
この時点でよくわからなくなったので、最終手段のVPS再起動。
直った!!
ブラウザからアクセスする方のphpinfoでも出力された!!
再起動すると直るってことは、インストールは確実にされてるってことだな。
でも、Nginxは再起動したし・・・
と考えながら、APCuをインストールしてたらZend OPcacheとまったく同じ状況になった。
つまり、phpコマンドからのphpinfoではAPCuはenableになってるが、ブラウザからアクセスする方のphpinfoファイルではAPCuは反映されていない。
その時PHP-FPMを再起動するということを閃いた。
sudo /etc/rc.d/init.d/php-fpm restart
phpinfoにアクセス。
まだ反映されていない。
そこでNginxも再起動。
sudo /etc/init.d/nginx restart
phpinfoに再びアクセス。
反映されていた。
Apacheの時はApacheだけ再起動したらPHPも再起動されるが、Nginx+PHP-FPMだと両方再起動しなければ設定が反映されない。
考えてみたら当たり前だった・・・
OPcacheについての詳しい解説はこちらのスライドが参考になる。
コメント