CakePHP2系をインストールする | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近、PHPで人気のフレームワークの1つであるCakePHP に触れる機会があったので、その情報をまとめていきたいと思います。

まずは、インストール編ということですが、環境としてはCentOS5.8(さくらVPS)上に2012年8月時点で最新のCakePHP2.2.1を使っています。

PHP自体のバージョンは5.3.3です。



CakePHPのインストール


フレームワークのインストールということですが、CakePHPの場合はそれほど難しいものではありません。

本家からソースファイルをダウンロードし、インストールするサーバー上に転送しておきます。

解凍したソースファイルを適当なディレクトリ(今回の場合は、/var/www/cakephp)に展開したら、Apacheの設定ファイルを変更します。


<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/cakephp/app/webroot/
    ServerName localhost.localdomain
    ErrorLog logs/error_log
    CustomLog logs/access_log common
</VirtualHost>


上記のように、展開したCakePHPのソースファイル内にある「app/webroot」をDocumentRootに設定します。

もし、どうしてもDocumentRootを動かせないという場合は、Aliasをきって逃げるということもできます。


Alias /cake/ "/var/www/cakephp/app/webroot/"


まぁ、上記のような回避策をとるよりはフレームワーク使うなら、全てサーバーの設定ははフレームワークに預けてしまった方が幸せだとは思いますが。


もう1つ設定するのが、CakePHPはmod_rewriteを使うのですが、その設定が.htaccessファイルに定義されているため、ファイルの設定内容が上書きできるように変更(AllowOverrideをAllにする)しておきます。


<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

インストールとしては、以上です。

これで、ブラウザからサーバーにアクセスしてみたら、CakePHPの画面が見えると思います。



CakePHPの設定


これで、インストールはできてはいるわけですが、ブラウザにアクセスしてみたらまず見る画面は大量のエラーメッセージではないでしょうか。


A Day In The Boy&#39;s Life-CakePHP初期エラー画面


これを1つ1つ解決していきましょう。

なお、サーバー環境によっては出るエラーの数やメッセージが異なってくるので、全てを網羅しているわけではありません。


- PHPのタイムゾーンの変更


Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in 


これは、CakePHPのエラーではなくPHPの設定ではありますが、PHPの設定ファイルにてタイムゾーンの設定がされていないから出るエラーです。


date.timezone = Asia/Tokyo


のように、タイムゾーンを設定してApacheを再起動します。


- キャッシュディレクトリ(tmp)の権限変更


Warning (512): /var/www/cakephp/app/tmp/cache/ is not writable [CORE/Cake/Cache/Engine/FileEngine.php, line 336]


このエラーはメッセージの通りで、CakePHPのディレクトリにあるキャッシュディレクトリへの書き込み権限がないことによるエラーです。


$ chown -R apache:apache cache/


として、Apacheユーザー/グループへの書き込み権限を付与します。

似た、エラーメッセージとして


Your tmp directory is NOT writable.


というものもあるので、cacheディレクトリだけでなく、その1つ上のtmpディレクトリへの書き込み権限を合わせて変更しておいた方がよいでしょう。


- 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 809]

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 813]


上記2つのエラーは、CakePHPをインストールすると初期画面では必ず表示されるメッセージでしょう。

何れもCakePHPがセキュリティを上げるためにランダムな入力データが必要になるためで、ユーザー自身に設定して欲しくて出ているエラーです。


設定箇所は、CakePHPのcore.phpを変更します。


/**
 * A random string used in security hashing methods.
 */
    Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
    Configure::write('Security.cipherSeed', '76859309657453542496749683645');


デフォルト値のままでは使うことができないので、適当な文字列に変更します。

一応、デフォルト値に対して1文字でも付け加えてあげたらこのエラーは消えるのですが、セキュリティに関連する部分なのできちんと設定しておきましょう。


真面目にランダムな文字列を生成しだすと少し手の込んだスクリプトが必要ですが、簡易的なものであれば下記のようなもので任意の文字列や数値を出すことはできます。


<?php

// Security.salt用
echo sha1(uniqid(rand(), TRUE)) . PHP_EOL;
// Security.cipherSeed用
echo gmp_strval(gmp_random(2)) . PHP_EOL;

とはいっても、ランダムな文字列なので適当にキーボードをガチャガチャ叩いて設定してしまってもよいのですが。


- データベース接続の設定変更


Your database configuration file is NOT present.
Rename APP/Config/database.php.default to APP/Config/database.php


このエラーもCakePHPの初期画面で必ず表示されるメッセージです。

データベース接続用の設定ファイルが無いよってエラーで、ページの最後の方に出る


Warning (2): include_once(/var/www/cakephp/app/Config/database.php): failed to open stream: No such file or directory [CORE/Cake/Model/ConnectionManager.php, line 68]

Warning (2): include_once() [http://php.net/function.include]: Failed opening '/var/www/cakephp/app/Config/database.php' for inclusion (include_path='/var/www/cakephp/lib:.:/var/www/lib:/usr/local/lib/php') [CORE/Cake/Model/ConnectionManager.php, line 68]

この辺のエラーメッセージとセットで出てきます。

対処としては、最初の警告メッセージに書かれているようにdatabase.phpという設定ファイルを作れば解決します。

サンプルの設定ファイルとして、database.php.defaultというファイルがあるのでまずはこれをリネームします。


$ mv database.php.default database.php


ただ、これだけでは設定ファイルの中身が正しくないですし、データベースも作成されていないですから当然うまくいきません。

設定ファイルの中身はデフォルトはMySQLを利用する場合となっていますので、これを環境に応じて変更します。


ここでは、PostgreSQLを使った場合の例を書いていきます。

まずは、データベースとユーザーの作成です。


$ createdb cakephp
CREATE DATABASE

$ createuser -P cake
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE


これで、データベース側の準備ができたので、database.phpを設定変更します。


class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Postgres',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'cake',
        'password' => 'CakePHP',
        'database' => 'cakephp',
        'prefix' => '',
        //'encoding' => 'utf8',
    );
}

デフォルトの設定ファイルには、$testの記述もありますが、こちらはテスト用など複数のDBを使い分けたい場合に使いますので、無くても動作します。

これで、一通りのエラーも無くなり、CakePHPでアプリ開発をする準備が整いました。


A Day In The Boy&#39;s Life-CakePHP初期画面


CakePHPを使ったアプリケーション開発編へ続きます。