Zend OPcacheをインストール・有効化(Nginx+PHP-FPMの場合のPHP設定反映方法)

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についての詳しい解説はこちらのスライドが参考になる。

参考

CentOSのPHPを5.4から5.5にアップデート。OPcacheとAPCuも設定

コメント

タイトルとURLをコピーしました