Pleskでつくるドメイン毎のユーザでは、CakePHPのshellをうまく実行できない。こういうエラーが出てしまう。
PHP Fatal error: Class 'AppModel' not found in /var/www/vhosts/...
普通に、adduserなどで作ったユーザはうまく行くのだが。おそらく、PATHの関係なのだと思うが、未だ原因がわからない。
Pleskでつくるドメイン毎のユーザでは、CakePHPのshellをうまく実行できない。こういうエラーが出てしまう。
PHP Fatal error: Class 'AppModel' not found in /var/www/vhosts/...
普通に、adduserなどで作ったユーザはうまく行くのだが。おそらく、PATHの関係なのだと思うが、未だ原因がわからない。
CakePHPで認証付きの静的ページを作る | Web活メモ帳を参考に、CakePHPでの静的ページへのユーザ認証を解除したのメモを。
なぜ、こんな処理が必要になったかというと、AppController内で、Authコンポーネントを有効にしたため。Controller全体にユーザ認証が効くようになったが、ユーザ認証無しでの公開を前提としている静的ページまでも、ユーザ認証が求められるようになったため、ユーザ認証を無効化する必要性が発生した。
AppControllerのbeforeFilterで、以下のように記述する。
function beforeFilter() { // pages controllerかどうかをチェック // Pagesだったら、ユーザ認証は行わない if ($this->name == 'Pages') { $this->Auth->allow('*'); } }
PHP5.3対応とかで、初期設定のタイムゾーンが勝手にUTCになっている。これを解決するには、
app/config/core.phpの以下の部分をコメントアウトすれば、php.iniの設定が読み込まれる。特に、php.iniでタイムゾーンを設定していなければ、ローカルのタイムゾーン設定が反映される。
/** * If you are on PHP 5.3 uncomment this line and correct your server timezone * to fix the date & time related errors. */ // date_default_timezone_set('UTC');
$conditions = array( "1 = 1" ); //dummyの条件 $this->MyModel->deleteAll( $conditions, false ) ) //MyModelの全削除
ダミーの条件を入れると全削除。
CakePHPでケータイサイトを作っているのだが、一番手こずっているのがセッション管理。ケータイのブラウザのほとんどは、Cookieを持てないので独自にセッションを管理する必要があるのだが、タグのリンクにセッションIDを埋め込んだりと面倒くさい。
mod_chxjを使うと、cookieをシミュレートしてくれるようになるので、これはかなり便利。PHPのデフォルトのセッションID埋め込み機能よりも、セッション切れが発生しづらい。
/app/config/core.phpを以下のように修正
Configure::write('debug', 0);
CakePHPでは、php.iniでエラーレベルを変えても、core.phpの設定が優先されてしまう。この設定を変えることで、ErrorやNoticeの表示を制限できる。デプロイの時に便利。
ケータイではCookieを使えないので、通常のセッション管理ができない。URLにセッションIDを埋め込むなどの対策が必要になる。1.2での設定方法をまとめてみる。
/m/以下をケータイ用に振り分けことを前提に。
//Configure::write('Session.save', 'php'); Configure::write('Session.save', 'usersession'); //こちらに修正
セッションを扱う箇所を独自コードに置き換えることができる。コードは、app/config/usersession.phpに
記述する。
新規で作成。
<?php if (!isset($_SESSION)) { if (function_exists('ini_set')) { if(defined('MOBILE')){ //ケータイ用だったら ini_set('session.use_trans_sid', 1); //GETリクエストにセッションIDを自動的に埋め込む設定を有効 ini_set('session.use_cookies', 0); //Cookieの使用を無効 }else{ ini_set('session.use_trans_sid', 0); //無効 ini_set('session.use_cookies', 1); //有効 } } } ?>
MOBILEという変数は、別クラスで設定する
<?php class AppController extends Controller { var $needAuth = false; var $helpers = array('html', 'form', 'time'); function beforeFilter() { //ケータイ用の振り分け if(isset($this->params['prefix'])){ $this->layout = 'mobile_'.$this->layout; } $auth = $this->Session->read( 'auth' ); $this->set( "auth", $auth ); if( $this->needAuth ){ if( empty( $auth ) ){ if(defined('MOBILE')){ //ケータイへの振り分けがされていたら、ケータイ向けのログイン画面へ $this->redirect( "/m/users/login" ); }else{ $this->redirect( "/users/login" ); } return ; } } if(defined('MOBILE')){ //ケータイ用にSJISに文字コード変換 mb_convert_variables('UTF-8','SJIS-win',$this->data); } ob_start(); //文字コード変換用の処理開始 parent::beforeFilter(); } function __construct() { // /m/がURLの中にあった場合、MOBILE変数を設定。このフラグを各クラスで判別 if(ereg("^/m/",$_SERVER['REQUEST_URI'])){ // もし、URLが/<em>servicename</em>/m/だったら、"^/<em>servicename</em>/m/" define('MOBILE',1); } parent::__construct(); } function afterFilter() { parent::afterFilter(); $out = ob_get_clean(); if(defined('MOBILE')){ $out = mb_convert_encoding($out,'SJIS-win','UTF-8'); //ケータイからの入力をSJISからUTF-8に変換 } echo $out; } //redirect メソッド書き換え function redirect($url,$status = null) { if(defined('MOBILE')){ $url = $url."?".session_name()."=".session_id(); //転送先URLにセッションIDを自動付加 } parent::redirect($url,$status); } } ?>
GETでは、自動的にセッションIDが埋め込まれるが、POSTではセッションIDの埋め込みを明示的に行う必要がある。<form>で以下のように記述する。
<form action="foo?<?php session_name()."=".session_id();?>" method="POST">
参考サイト: