Help us understand the problem. What is going on with this article?

FuelPHPの独自Configがキャッシュされるときの対処法

More than 5 years have passed since last update.

PHP 5.5.7でFuelPHPを動かしていたのですが、独自Configをセーブした後、別のリクエストでConfig::get('hoge')したときに、変更が読み取れない事象が発生しました。
(実ファイルは正常に更新できています)

結論から言うと、PHP 5.5から導入されたZendOpCacheが独自Configファイルをキャッシュしていたのが原因でした。
なお、PHPの通常インストールではopcacheのextensionはインストールされないため、キャッシュが有効になることはありません。

下はopcache拡張をロードしている場合のデフォルト値
(バージョンによって多少の差異はあるかもしれません)

$ php -i | grep opcache
/etc/php-5.5.d/opcache.ini,
opcache.blacklist_filename => /etc/php-5.5.d/opcache*.blacklist => /etc/php-5.5.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

opcache.enableをoffにしてしまえば、解決できるのですが、せっかくのコードキャッシュもコード最適化も捨ててしまうのは勿体無いので以下のように対応することにしました。

test.php
Config::set('hoge.fuga', 'moga');

// app/config/hoge.phpの場合
Config::save('hoge', 'hoge');

// キャッシュさせたくないファイルを無効にする
opcache_invalidate(APPPATH.'config'.DS.'hoge.php');

おそらくAPCやeAcceleratorでも同様のことが起こるだろうと考えています。
そのときは、設定値の変更や上記に近い方法などで対処するのが良いかと。

FuelPHPのConfigには.ini, .json, .ymlも使えるので、
Config内で変数、関数を使わないのなら、yamlファイルで設定しておく方がいいかもしれませんね。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away