読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Ktai-LibraryをComponentで使う時にSessionがスタートしないことがある

CakePHP

どうもそういう動きをしているようなので・・・。

cakephp:1.2.3.8166&Ktai-Library:0.1.1で確認しました。

僕はコレで解決できた。

<?php
class MembersController extends AppController {
	var $name ="members";
	var $helpers = array('Ktai');
	var $components= array("Ktai");
var $ktai = array(
	'output_auto_encoding'=>true,
   'input_encoding' => 'UTF-8',
   'output_encoding' => 'SJIS-Win',
);

という感じでコントローラー内でKtaiComponentを使っている。

携帯のページはこれでよかったのだが、PCページからログインする時にセッションが開始されていないことが分かった。

試しにKtaiComponentを使っていない($components変数でセットしていない)ページだと、ふつーにセッションが動いてくれたので、どうもそこだけセッションの設定が違うことが分かった。

余談だけどini_set関係はPHPはスクリプトの実行から終了までしか保持してくれないようなので、Javaみたいにアプリ全体で色々保持してくれないらしいので、毎回.htaccessphp_valueとかやらざるをいけないようだ。貧弱と言うかお手軽と言うか・・・。これに起因するPHP独自の環境的問題でかなり苦しんでいるので、正直めんどくせぇぇぇぇと叫びたくなる!

原因は、KtaiComponentが初期化される時にSession.saveの値を書き換えることにあるみたい。

<?php
function initialize(&$controller){
//about line 63	
        if($this->_options['enable_ktai_session']){
			Configure::write('Session.save', 'ktai_session');
		}
	}
	

このktai_sessionが有効になっているようなので、config/ktai_session.phpで定義されているSwitch文を通るときに'ktai_session'というKeyになっているため、iMode携帯以外セッション関連の設定が初期化されていないようです。

とりあえず手っ取り早く解決したければ、config/ktai_session.phpでこんな感じでdefaultを通させればいい。cakeのセッション設定でよければこれでおk。

<?php
	default:
		if (empty($_SESSION)) {
			if ($iniSet) {
				ini_set('session.use_trans_sid', 0);
				ini_set('url_rewriter.tags', '');
				ini_set('session.serialize_handler', 'php');
				ini_set('session.use_cookies', 1);
				ini_set('session.name', Configure::read('Session.cookie'));
				ini_set('session.cookie_lifetime', $this->cookieLifeTime);
				ini_set('session.cookie_path', $this->path);
				ini_set('session.auto_start', 0);
				ini_set('session.save_path', TMP . 'sessions');
			}
		}
	break;

いじょ。

Ktai-LibraryのHelperを使う場合のおまけtips

helperで文字コードを指定するとページ全体をバッファしてエンコードしてくれるのですが、コントローラー内にPCサイトと携帯サイトのロジックが混在している場合(prefixとかで)別にやんなくてもいいよ!って時があります。そんなときはこう。

<?php
class HogeController extends AppController {
var $ktai = array(
	'output_auto_encoding'=>true,
   'input_encoding' => 'UTF-8',
   'output_encoding' => 'SJIS-Win',
);

function index() {
   $this->ktai['output_auto_encoding'] = false;
}

いじょ。