« CakePHPでjQuery Main Thunderbirdの表示レイアウトを... »

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自体は動作するようになる。

Leave a comment

Your comment