CakePHP練習(2)
CakePHP練習(1)の続き
「CakePHPのブログチュートリアル」を動作させる例。ここでは、CakePHPの動作設定まで。
まず、CakePHPを入手(2.1.1 STABLEが出ていた)
$ wget --no-check-certificate https://github.com/cakephp/cakephp/zipball/2.1.1 09:37:11 (135.00 KB/s) - `2.1.1' を保存しました [1765102/1765102] $ mv 2.1.1 cakephp-2.1.1.zip
アーカイブを展開
$ unzip cakephp-2.1.1.zip Archive: cakephp-2.1.1.zip 43cf2f06471ba9dcd5968b37ca68fcf3b343dd2c creating: cakephp-cakephp-0cad237/ inflating: cakephp-cakephp-0cad237/.gitignore inflating: cakephp-cakephp-0cad237/.htaccess inflating: cakephp-cakephp-0cad237/.travis.yml inflating: cakephp-cakephp-0cad237/README ...
展開後のディレクトリを移動。ファイルは「~/public_html/cakephp-test/」に置くものとする。
mv cakephp-cakephp-0cad237 ~/public_html/cakephp-test
で、ユーザディレクトリ内でCakePHPを試したいが、そのままだとCakePHPが使っているApacheのrewriteルールが不十分となってページを表示できない。
Not Found The requested URL /home/oshiro/public_html/cakephp-test/app/webroot/ was not found on this server.
これはRewriteRuleの
RewriteRule ^$ app/webroot/ [L]
で、「app/webroot/」へアクセスしても実際には「app/webroot/app/webroot//」あたりを表示しようとしてエラーになってしまっているらしい。
なので、.htaccessに以下のRewriteBaseの設定を追加(それ以前にApache側でユーザの.htaccessでの設定を有効化しておく必要がある)。
# ./.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /~oshiro/cakephp-test RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule>
# ./app/.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /~oshiro/cakephp-test/app RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] </IfModule>
# ./app/webroot/.htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /~oshiro/cakephp-test/app/webroot RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
これでCakePHPのトップページは表示できるようになるが、ディレクトリオーナを一般ユーザにしているので、ページ表示側のApacheの権限が不足で「キャッシュが保存できない」と警告が出る:
Warning (512): /home/oshiro/public_html/cakephp-test/app/tmp/cache/ is not writable [CORE/Cake/Cache/Engine/FileEngine.php, line 320]
ということで、該当ディレクトリに書き込み権限を付加。
$ chmod -R o+w app/tmp/cache/
次に、Security.saltやらSecurity.cipherSeedが変更されていないとエラーが出る:
Notice (1024): Please change the value of 'Security.salt' in app/Config/core.php to a salt value specific to your application [CORE/Cake/Utility/Debugger.php, line 806] Notice (1024): Please change the value of 'Security.cipherSeed' in app/Config/core.php to a numeric (digits only) seed value specific to your application [CORE/Cake/Utility/Debugger.php, line 810]
のでこれを設定(以下は単なる例)。
Configure::write('Security.salt', 'oshiro'); Configure::write('Security.cipherSeed', '4457');
あとは、データベースの設定がないと言ってくる:
Your database configuration file is NOT present. Rename APP/Config/database.php.default to APP/Config/database.php
ので、指示に従ってdatabase.php.defaultをdatabase.phpへコピー:
$ cp app/Config/database.php.default app/Config/database.php
してこれを自前の設定に合わせて書き換えていく。
データベースとして、標準ではMySQLを使うようになっており、これは「lib/Cake/Model/Datasource/Database/Mysql.php」を読み込んでいる。今回はSQLiteを使いたい(読み込まれるファイルは「lib/Cake/Model/Datasource/Database/Sqlite.php」で対応バージョン3)のでそれに合わせて変更する。
元が次のようになっているもの:
class DATABASE_CONFIG { public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'prefix' => '', //'encoding' => 'utf8', ); // ... }
を、以下のように、ホスト/ログインID/パスワードは空にして、データベース名はSQLiteのデータベースファイル名(このファイル名指定はサーバ上のフルパスでないとアクセスに失敗するので注意)と変更する:
class DATABASE_CONFIG { public $default = array( 'datasource' => 'Database/Sqlite', 'persistent' => false, 'host' => '', 'login' => '', 'password' => '', 'database' => '/home/oshiro/public_html/cakephp-test/db/database.sqlite3', 'prefix' => '', //'encoding' => 'utf8', ); // ... }
ここでは、「cakephp-test/」ディレクトリ直下に「db/」ディレクトリを作り、そこにSQLiteのデータベースファイルを置くことにした。
$ mkdir db/
で、とりあえずSQLite用のデータベースファイルを空ファイルとして作成しておき、他ユーザでも変更可能のようにディレクトリとデータベースファイルを設定。
touch db/database.sqlite3 chmod og+w db/ db/database.sqlite3
さらに、セキュリティ的な観点からは本来はWebアクセスできない場所にファイルを置くべきだが、ここではとりあえずこのディレクトリは閲覧できないようdb/ディレクトリに.htaccessファイルを置いて閲覧禁止に設定:
# db/.htaccess order deny,allow deny from all
以上で、CakePHP自体は動作するようになる。