CakePHP ver 2.x の環境構築を行った際のメモ

[Welcome](http://book.cakephp.org/2.0/ja/index.html)

#はじめに
バイトでCakePHPで作られたシステムの保守をすることになり、環境構築する際にやったことや躓いたところを記録しました。
初心者なので許してください。

#CakePHP
CakePHPはオープンソースで開発されたPHP用のフレームワークです
必要なものはWeb ServerとCakePHPのみでWeb Serverにそのままアップロードすれば使えるようになる
Ruby on Railsの影響を強く受けていて、Webアプリケーションを高速に開発するための技術が多く入っている
Apacheで動かすことを想定しているが、lighttpdやMicrosoft IISのようなWeb Serverでも動かすことは可能
##システム要件
HTTPサーバ
PHP 5.3.0以上
データベース(必要な人のみ)
　MySQL(4以上)
　PostgreSQL
　Microsft SQL Server
　SQLite

##利点：
習得がとても容易
エラーがとても親切
日本語の資料が豊富




##CakePHPメモ
CakePHPではテーブル名とフィールド名にも意味がある。
データベースの命名規則とクラスの命名規則に従っておくと勝手にやってくれる。

[posts]というテーブル名にしておくと、自動的にPostモデルが呼び出され[modified][created]というフィールドがあると、自動的にCakePHPが管理するようになる。

###モデル(Model)
Postという名前にするとCakePHPは自動的に、このモデルはPostsControllerで使用されるのだろうと考えます。
そして、postsという名前のデータベーステーブルと結びつけられます。
モデルはapp/Modelの中に入れる
###コントローラ(Controller)
投稿記事とやりとりするためのビジネスロジックが入るところ
幾つかのモデルとやりとりし、投稿記事に関連する作業を行う場所
コントローラはapp/Controllerの中に入れる

「routes」という機能を使って、URLとコードを結びつけることができる。
###ビュー(View)

アプリケーションのレイアウトの内側にはめ込まれる、データ表示用の断片部品です。
たいていの場合はPHPのコードが含まれるHTMLになりますが、XML、CSV、バイナリのデータにもなりえます。
ビューはapp/Viewの中にコントローラ名に対応するフォルダの中に保存

##CTPファイル
PHPによるWebアプリケーションフレームワークの一つであるCakePHPで、ビューを保存するためのファイル形式。

##権限の確認
app/tmpディレクトリとサブディレクトリは、Web Serverとコマンドラインユーザの両方で書き込みが可能な権限が必要なことがある

##CakePHPのデフォルトページにCSSや画像がちゃんと適用されていない
```/private/etc/apache2/httpd.conf
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
```
上記を有効にする

###上記を有効にしてInternal Server Error500や有効にしないとnot foundが出た場合
http://localhost/cake/posts
mod_rewrite.soを有効にして上記のURLを踏みInternal Server Error500
mod_rewrite.soを有効せず上記のURLを踏みnot found
この場合は、CakePHPフォルダの中に間違った権限を与えると起こってしまう

```
$ chow -R _www app/tmp
```

のような正しい場所に適切な権限を与えないと上のような状態になってしまう
(_wwwは<?php echo exec('whoami'); ?>で確認した)

##CakePHPのデフォルトページで出たエラーや警告
デフォルトタイムゾーンのエラー→[CakePHPのダウンロードとインストール](http://www.phpbook.jp/cakephp/install/index1.html)
Security.salt,Security.cipherSeedのエラー(Notice(1024)→[CakePHPのダウンロードとインストール](http://www.phpbook.jp/cakephp/install/index1.html)
database.phpに関するエラー→[database.phpの作成とデータベースの用意](http://www.phpbook.jp/cakephp/install/index2.html)
NrQueryErrorAffectedNum. rowsTook (ms)→[CakePHPインストール](http://masterka.seesaa.net/article/150868899.html)※失敗
　　　　　　　　　　　　　　　　　　　→[1.2系下に出るクエリ情報を消すAdd Star](http://d.hatena.ne.jp/seto-san/20081103/1225721130)※成功
CSSや画像がうまく適応されていない→http://book.cakephp.org/2.0/ja/installation/url-rewriting.html

###参考サイト
[CakePHP のフォルダ構造](http://book.cakephp.org/2.0/ja/getting-started/cakephp-folder-structure.html)
[MVC(Model-View-Controller)を理解する](http://book.cakephp.org/2.0/ja/cakephp-overview/understanding-model-view-controller.html)


##cakephp a database connection using mysql was missing or unable to connect
http://localhost/cakephp/postsにアクセスした際に出たエラー
[cakephp 【DB接続エラー】](http://qiita.com/ryuutarou/items/fc9311813aca784b1f31)
localhostを127.0.0.1に変更しただけで解決しました。



#MacでのApache
Macでは標準でapacheがインストールされている。
apacheの起動

```
$ sudo apachectl start
```

##設定ファイルの場所
/private/etc/apache2/httpd.conf
##作業フォルダの変更
```/private/etc/apache2/httpd.conf
DocumentRoot "/Library/WebServer/Documents"
↓
DocumentRoot "自分が作業したいフォルダのパス"

<Directory "/Library/WebServer/Documents">
↓
<Directory "自分が作業したいフォルダのパス"
```
##困ったとき
```
$ sudo apachectl configtest
```
configtestは設定ファイルである[httpd.conf]に文法が間違っていないかチェックしてくれる
###httpd.confで躓いたこと
　[VirtualHost](http://www.adminweb.jp/apache/virtual/index2.html)が勝手に想定ではないルーティングをしていて、うまくいかないことがあった
　


##ApacheでPHPを有効にする
index.htmlなどは返してくれるんだが、wordpressやCakePHPを入れたとき、階層が表示されたりする場合はPHPが有効になっていない可能性が高い。
ApacheでPHPが有効になっているか、確認する部分は３つある

```/private/etc/apache2/httpd.conf
#LoadModule php5_module libexec/apache2/libphp5.so
↓
LoadModule php5_module libexec/apache2/libphp5.so

#Include /private/etc/apache2/extra/httpd-userdir.conf
↓
Include /private/etc/apache2/extra/httpd-userdir.conf

#Include /private/etc/apache2/other/*.conf
↓
Include /private/etc/apache2/other/*.conf
```
下の２つは既に有効になっている可能性が高いが、誰かにいじられたり、
自分がいじったりして、無効になっている場合もある


###参考サイト
[apacheを使ってローカルサーバーを構築する方法](http://motw.mods.jp/Mac/local_server.html)

#MacにMySQLのインストール
##Homebrewのインストール
[Homebrew公式サイト](http://brew.sh/index_ja.html)
以下のコマンドを実行

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

##brewコマンドを利用してmysqlをインストール
以下のコマンドを実行

```
$ brew install mysql
```

##brew install mysqlで出たエラー
###エラー１
```
Error: Cannot write to /usr/local/Cellar
```
/usr/local/Cellarの権限がないというエラーでsudoをつけてもダメみたい。
解決策はCellarに今使ってるユーザが書き込める権限を与える
[Macでbrew installをしたらPermissionで怒られた時の対処（簡易的に）](http://qiita.com/HIROSHI-1403/items/c90699c1a3f3bd9d63f9)

```
$ sudo chown -R ユーザ名 /usr/local/Cellar
```

##MySQLを起動
```
$ mysql.server start
```

##mysql.server startで出たエラー
###エラー１

```
$ ERROR! The server quit without updating PID file (/usr/local/var/mysql/ユーザ名.local.pid)
```
ログファイルの所有権が悪さをしているらしい。
解決策はユーザ名.local.errに権限を与えてあげれば良い
[MySQLが起動しないエラー（The server quit without updating PID file）](http://easyramble.com/mysql-server-pid-file-error.html)

```
$ sudo chown username /usr/local/var/mysql/ユーザ名.local.err
$ mysql.server restart
```


###参考サイト
[MacにMySQLをインストールして触ってみる](http://dev.classmethod.jp/etc/mac_mysql_install/)



#MySQLとPHPをつなげる
MySQLとPHPを繋げるには、php.iniを修正する。
フレームワークによってはPDOを利用するので、PDOを利用できる設定も必要

##php.iniの設定
MySQLのsocketを確認する

```
$ mysql -u root -p
mysql> status
```
上記のコマンドによりUNIX socket:を確認する
通常だと UNIX socket: /tmp/mysql.sock

/etc/php.ini.default を /etc/php.ini　という名前でコピーする

```php.ini
pdo_mysql.default_socket = 
↓
pdo_mysql.default_socket = /tmp/mysql.sock

mysql.default_socket = 
↓
mysql.default_socket = /tmp/mysql.sock

mysqli.default_socket =
↓
mysqli.default_socket = /tmp/mysql.sock
```

###参考サイト
[Yosemite（Mac OS X 10.10）PHPの設定](http://slackhack.net/1145.html)

##PDOを利用できるようにする

```
;extension=php_mysql.dll
↓
extension=php_mysql.dll

;extension=php_pdo_mysql.dll
↓
extension=php_pdo_mysql.dll
```
※;はコメントアウトです

###参考サイト
[MacでMySQL](http://d.hatena.ne.jp/architshin/20110324/1300935422)
[database.phpの作成とデータベースの用意](http://www.phpbook.jp/cakephp/install/index2.html)はCakePHPでエラーの理由を発見できた理由




##MacでHomebrewを使ってMySQLをインストールした場合の完全削除

[Mac OS X El CapitanでMySQLをクリーンインストールする](https://yukiyamashina.com/blog/2016/01/18/clean-install-mysql-on-mac-os-x-el-capitan/)
[mac OS XにHomeBrewでmysqlインストール。からの設定(mysql_install_db、mysql_secure_installation、my.cnf)やらアンインストールやら](http://tweeeety.hateblo.jp/entry/2014/11/26/232200)


##MySQLのエラー
###QLSTATE[HY000] [1524] Plugin '*0B025000DCF68B1D374153A7005639E320D41D5B' is not loaded

```
$ mysql -u ユーザ名 -p
QLSTATE[HY000] [1524] Plugin '*0B025000DCF68B1D374153A7005639E320D41D5B' is not loaded
```
最近のMySQLではpluginにデフォルトでmysql_native_passwordという値が入るのだが、ユーザを作るときに設定しなかったり、変な値を入れてしまうと上記のエラーが起こってしまう。
[OS X上でのMySQLのエラー(plugin is not loaded)について](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10154015460)

```
mysql> SELECT user, host, password, plugin FROM mysql.user where='ユーザ名';
+-----------+-----------+-------------------------------------------+
| user      | host      | plugin                                    |
+-----------+-----------+-------------------------------------------+
| root      | localhost | mysql_native_password                     |
| mysql.sys | localhost | mysql_native_password 　　　　　　　　　　　|
| Kurowasi  | localhost | *0B025000DCF68B1D374153A7005639E320D41D5B |
+-----------+-----------+-------------------------------------------+
```
上記のようにpluginに変な値が入っていたらデフォルトに戻してあげるとエラーが発生しなくなる。

```
mysql> UPDATE mysql.user SET plugin='mysql_native_password' WHERE user='test';
```

###SQLSTATE[HY000] [1045] Access denied for user 'test'@'localhost' (using password: YES)

```
$ mysql -u ユーザ名 -p
SQLSTATE[HY000] [1045] Access denied for user 'test'@'localhost' (using password: YES)
```

ログイン時にパスワードが存在していない、あるいは間違っているか
ユーザが存在していない、あるいは間違っている可能性がある。
パスワード関係の権限問題の可能性もあるそうです。
[MySQLのユーザー作成でハマったこと解決策メモ。](http://blog.codebook-10000.com/entry/20130806/1375794910)
[接続失敗時のエラー表示](http://www.phpbook.jp/tutorial/pdo/index6.html)

###ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
[mysqlソケットエラー解決法](http://d.hatena.ne.jp/TamaC/20090330/1238418696)