FuelPHPを利用して、ちょっとしたアプリを作ろうとした際にセッション(memcached)ではまりました。
今回の環境や構成は下記のとおりです。
構成・環境
- nginx + php-fpm
- php 5.4
- memcached 1.4(セッションで利用)
- FuelPHP 1.6
処理概要
- 1~N個の値を設定しPOSTする
- 設定された値をセッションに入れ、確認画面を表示する
- セッションから設定された値を取り出し、DBへ入れる
実際の処理は微妙に違いますが、やろうとしていることは上記のような感じです。
1. については下記のような感じです。
View
...
...
2. についても下記のような処理で行けると考えていました。
Controller(A)
[php]
…
Session::set(‘values’, Input::post(‘values’));
…
[/php]
3. の処理では 2. の処理で入れた値を取り出します。
Controller(B)
[php]
…
$values = Session::get(‘values’);
…
[/php]
・・・しかし、値が入る場合と入らない場合があり、原因がわからないという状態でした。
まず、疑ったのがセッションが有効(動作していない)になっていないのではと言う事です。
ですが、入る場合もあり「なんでだよっ!」とモンモンとしながら連休を過ごしました。
間違いに気が付く・・・
そして、職場で話をしたところFuelPHPのセッション周りについての勘違いをしている部分がありました。
こちらとしては、php.iniの方で”session.save_handler”をmemcacheに設定していたのでセッションを利用する際には、memcachedが利用されていると思い込んでいる部分がありました。
※正確には、”/etc/php.d/memcache.ini”で設定。
ところが、FuelPHPの設定を確認していくと”core/config/session.php”の設定がデフォルトでは、セッションにcookieを利用すると言う内容になっていました。
そこで、”app/config”配下に”session.php”を用意し、memcacheを利用するように設定を行いました。
これでうまく行くと思っていたのですが、まだ駄目な部分がありました。
ライブラリが使えない
phpからmemcachedへの接続には、php-pecl-memcacheを利用していました。
しかし、FuelPHPで利用できるmemcacheのライブラリはphp-pecl-memcachedなのです。
と言う訳で、さくっと入れて動かしてしまいます。
php-pecl-memcachedのインストール
[shell]
yum install php-pecl-memcached –enablerepo=epel
[/shell]
インストールが完了したら、php-fpmを再起動します。
[shell]
/etc/init.d/php-fpm restart
[/shell]
ここまで出来ていれば、セッションの保持場所がcookieからmemcachedへ変わっているはずです。
総括
注意点(一番ハマッた)としては、cookieの場合に値が多くなりすぎるとセッションに値が入らないことがあると言う事です。
多次元配列を入れたりすると入らないことがありますので、もしFuelPHPを利用している際にセッションがおかしいと思ったときには、どこをセッションの保持場所としているかを確認してみると解決が早いかもしれません。
コメント