インストールと設定
apacheの場合
http://doruby.kbmj.com/hanafubuki_on_rails/20080227/Rails_CakePHP_
必要な環境
・PHP4.3.2以上、あるいはPHP5以上が動作するサーバ
インストール
ダウンロードして解凍するだけ
URLとmod_rewiteの設定
mod_rewriteの設定は、
/cake /.htaccess /cake /app /.htaccess /cake /app /webroot /.htaccess
の3つの.htaccessファイルで行われています。
そして、mod_rewriteを利用できる環境では、以下のようなURLが用いられます。
http://設置URL / コントローラ / メソッド / パラメータ1 / パラメータ2 /...
例えば、
http://doruby.kbmj.com / members / regist / 3
というURLの場合、
members_controller.php の中のregist() メソッドに引数「3」を入れて実行する
という意味になり、実際に呼び出されるファイルは、
コントローラ: /cake /app /controllers /members_controller.php テンプレート: /cake /app /views /regist.thtml
となります。
環境によっては.htaccess に RewriteBase を追加しないと動かない。
/blog/.htaccess
<ifmodule mod_rewrite.c> RewriteEngine on RewriteBase /blog RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </ifmodule>
/blog/app/.htaccess
<ifmodule mod_rewrite.c> RewriteEngine on RewriteBase /blog/app RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] </ifmodule>
/blog/app/webroot/.htaccess
<ifmodule mod_rewrite.c> RewriteEngine On RewriteBase /blog/app/webroot RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </ifmodule>
mod_rewriteが使えない場合
mod_rewriteが利用できない場合は、以下の3つの作業が必要になります。
?core.phpの修正
/cake /app /config /core.php
の以下のコメントを外してください。
<?php /** * If you do not have mod rewrite on your system * or if you prefer to use CakePHP pretty urls. * uncomment the line below. * Note: If you do have mod rewrite but prefer the * CakePHP pretty urls, you also have to remove the * .htaccess files * release/.htaccess * release/app/.htaccess * release/app/webroot/.htaccess */ // define ('BASE_URL', env('SCRIPT_NAME')); ← ここのコメントを外す
?.htaccessファイルの削除
上述した3つの.htaccessファイル
/cake /.htaccess /cake /app /.htaccess /cake /app /webroot /.htaccess
を削除してください。
?URLの変更
CakePHPで用いるURLが以下のように変わります。
http://設置URL /index.php /コントローラ名 /アクション名/
nginxの場合
基本的に公式の通り。
server { listen 81; root /var/www/cakephp/; # location ~ ^/subdir/(img|css|js|files)/(.+)$ { # root /home/centos/public_html/cakephp/app/webroot; # try_files /$1/$2 =404; # } location ~ ^/(subdir)/(.*)? { index index.php; set $new_uri /$1/app/webroot/$2; try_files $new_uri $new_uri/ /$1/index.php?$args; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
Docker
Apacheを使う場合
- ディレクトリ構成
. ├── docker-compose.yml ├── Dockerfile ├── cakephp.conf ├── php.ini.patch └── src └── cakephp
- docker-compose.yml
version: '3' services: web: build: context: . dockerfile: Dockerfile volumes: - ./src:/var/www/html ports: - 1080:80 depends_on: - mysql command: httpd -DFOREGROUND mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root ports: - 3306:3306 volumes: - dbdata:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root depends_on: - mysql ports: - 1081:80 volumes: dbdata:
- Dockerfile
From centos:7 RUN echo "RUNはbuild時に実行" RUN yum -y install php RUN yum -y install php-pdo RUN yum -y install php-mysql RUN yum -y install patch COPY cakephp.conf /etc/httpd/conf.d COPY php.ini.patch /tmp RUN patch /etc/php.ini < /tmp/php.ini.patch CMD echo "CMDはrun時に実行"
- cakephp.conf
<Directory /var/www/html/cakephp> AllowOverride FileInfo </Directory>
- php.ini.patch
878c878 < ;date.timezone = --- > date.timezone = "Asia/Tokyo"
Nginxを使う場合
- ディレクトリ構成
. ├── docker-compose.yml ├── Dockerfile ├── cakephp.conf ├── nginx.repo ├── php.ini.patch ├── www.conf.patch └── src └── cakephp <- CakePHP本体
- docker-compose.yml
version: '3' services: web: build: context: . dockerfile: Dockerfile # user: "1000:1000" volumes: - ./src:/var/www/html ports: - 1080:80 command: bash -c "php-fpm & /usr/sbin/nginx -g 'daemon off;'"
- Dockerfile
From centos:7 RUN echo "RUNはbuild時に実行" COPY nginx.repo /etc/yum.repos.d/ RUN yum -y install php RUN yum -y install nginx RUN yum -y install php-fpm RUN yum -y install patch RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_back COPY cakephp.conf /etc/nginx/conf.d/ COPY www.conf.patch /tmp RUN patch /etc/php-fpm.d/www.conf < /tmp/www.conf.patch COPY php.ini.patch /tmp RUN patch /etc/php.ini < /tmp/php.ini.patch COPY php-fpm.conf.patch /tmp RUN patch /etc/php-fpm.conf < /tmp/php-fpm.conf.patch COPY docker.conf /etc/php-fpm.d CMD echo "CMDはrun時に実行"
- cakephp.conf (nginxの設定ファイル)
server { listen 80; root /var/www/html/; error_log /dev/stdout info; access_log /dev/stdout; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
- nginx.repo
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
- php.ini.patch
878c878 < ;date.timezone = --- > date.timezone = "Asia/Tokyo"
- www.conf.patch
39c39 < user = apache --- > user = nginx 41c41 < group = apache --- > group = nginx
- php-fpm.conf.patch
24c24 < error_log = /var/log/php-fpm/error.log --- > ; error_log = /var/log/php-fpm/error.log
- docker.conf
[global] error_log = /proc/self/fd/2 [www] ; if we send this to /proc/self/fd/1, it never appears access.log = /proc/self/fd/2 clear_env = no ; Ensure worker stdout and stderr are sent to the main error log. catch_workers_output = yes
cakephp 2.3 以降の注意点
default.ctp
コンテンツ表示
レイアウトの default.ctp の書き方が変わっているので注意。
コンテンツを表示するには、2.3以前では
$content_for_layout
と書いていたが、2.3以降は
<?php echo $this->fetch('content'); ?>
とする。
METAタグの文字コード
<?php echo $this->Html->charset(); ?>
とすると、 /path/to/cakephp/app/Config/core.phpの
Configure::write('App.encoding', 'UTF-8');
の内容から
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
と表示してくれる。
ViewやControllersのディレクトリを階層化する
Config/bootstrap.php
App::build(array( 'Controller' => array( ROOT.DS.APP_DIR.DS.'Controller'.DS.'app1'.DS, ROOT.DS.APP_DIR.DS.'Controller'.DS, ) )); App::build(array( 'View' => array( ROOT.DS.APP_DIR.DS.'View'.DS.'app1'.DS, ROOT.DS.APP_DIR.DS.'View'.DS, ) ));
などのように書くと、コントローラやビューを探しに行ってくれる。
アクセスする際のURLは、階層化しない。
http://www.test/hoge/コントローラ/メソッド
ではなく、
http://www.test/コントローラ/メソッド
のままなので注意。
ViewやControllerに加えてURLを階層化する。(その1)
URLの階層化したい場合、上記設定に加えて、routes.phpに以下の設定を加える。
Router::connect('/app1/:controller/:action/*', array()); Router::connect('/app1/:controller/*', array('action' => 'index'));
http://xxxxx/app1/controller/action
でアクセスがあった際に、bootstrap.phpで指定された箇所からControllerを探す。
注意としては、Controllerを探した際に同じ名前のControllerがあった場合は、先に見つけた方を使う。
ViewやControllerに加えてURLを階層化する。(その2)
http://taka.at/blog/1234436530.html
http://blog.elkc.net/?p=515
https://liginc.co.jp/programmer/archives/1331
一つのCakePHPの下に複数のアプリケーションを含めたい場合、
ControllerやView、URLを階層化したい。
上記の方法では、同じ名前のControllerやViewが使えない。
同じ名前のControllerやViewを使えるようにするにはbootstrap.phpを書き換える必要がある。
・アプリ1 http://hoge/Sub1/Hoge/action ・アプリ2 http://hoge/Sub2/Hoge/action
各アプリケーションで同じ名前のControllerやViewを使う。
Config/bootstrap.php
$base = $_SERVER["SCRIPT_NAME"]; $indexUrl = "app/webroot/index.php"; $base = mb_substr($base, 0, mb_strlen($base) - mb_strlen($indexUrl)); $subDir = mb_substr($_SERVER["REQUEST_URI"], mb_strlen($base)); $sepPos = mb_strpos($subDir, DS); if ($sepPos !== false) { $subDir = mb_substr($subDir, 0, $sepPos); } $isSubDir = false; if ($subDir === "Sub1" || $subDir === "Sub2") { $isSubDir = true; } if ($isSubDir) { App::build(array( 'Controller' => array( ROOT.DS.APP_DIR.DS.'Controller'.DS.$subDir.DS, ROOT.DS.APP_DIR.DS.'Controller'.DS, ) )); App::build(array( 'View' => array( ROOT.DS.APP_DIR.DS.'View'.DS.$subDir.DS, ROOT.DS.APP_DIR.DS.'View'.DS, ) )); }
Config/routes.php
Router::connect('/Sub1/:controller/:action/*', array()); Router::connect('/Sub1/:controller/*', array('action' => 'index')); Router::connect('/Sub2/:controller/:action/*', array()); Router::connect('/Sub2/:controller/*', array('action' => 'index'));
Config/core.php
Cache::config('_cake_core_'.... の引数を条件によって変更する。
Sub1やSub2の場合はキャッシュ先を変更する
$subApps = array("Sub1", "Sub2");
$base = $_SERVER["SCRIPT_NAME"]; $indexUrl = "app/webroot/index.php"; $base = mb_substr($base, 0, mb_strlen($base) - mb_strlen($indexUrl)); $subDir = mb_substr($_SERVER["REQUEST_URI"], mb_strlen($base)); $sepPos = mb_strpos($subDir, DS); if ($sepPos !== false) { $subDir = mb_substr($subDir, 0, $sepPos); } if (array_search($subDir, $subApps) !== false) { print "hoge<br>\n"; print dirname(CACHE).DS.$subDir.DS."<br>\n"; print CACHE."<br>\n"; Cache::config('_cake_core_', array( 'engine' => $engine, 'prefix' => $prefix . 'cake_core_', 'path' => CACHE . 'persistent' . DS.$subDir.DS, 'serialize' => ($engine === 'File'), 'duration' => $duration )); } else { Cache::config('_cake_core_', array( 'engine' => $engine, 'prefix' => $prefix . 'cake_core_', 'path' => CACHE . 'persistent' . DS, 'serialize' => ($engine === 'File'), 'duration' => $duration )); }
テーマの利用
ディレクトリ構成
app以下のViewディレクトリに Themed を作成する。
各テーマ以下はwebrootと同じ構成にする。
各テーマのディレクトリ名は大文字ではじめること。
View `-- Themed `-- HelloTheme `-- webroot `-- css |-- cake.hello.css
テーマの利用
コントローラで
$this->theme = 'helloTheme';
とすれば、テーマが適用される。
注意点
無駄な改行について
Controller の
<?php 処理 ?>
のあとに無駄な改行があると、そのまま改行が出力されるので注意
古いcakeと新しいPHPの組み合わせ
エラーの種類として
・E_NOTICE
・E_DEPRECATED
が追加されているPHPで、古いcakeを動かすとメッセージが大漁に表示される。
cake 内の
error_reporting
を
E_ALL & ~E_NOTICE & ~E_DEPRECATED
E_ALL & ~E_STRICT & ~E_DEPRECATED
するとメッセージが消える。
出力の最後の埋め込まれる実行時間について
cakephp のバージョンによっては、実行時間がソースに吐き出されることがある。
邪魔な場合は
/app/webroot/index.php
にある
・・・・・・s -->
が書かれている行を消す
モデルを複合キーに対応させる
CakePHP 3.X からはモデルが複合キーに対応できるようになるようだが
2.Xでは、複合キーに対応していない。
http://piyopiyocs.blog115.fc2.com/blog-entry-358.html
を参考に複合キーに対応したモデルを作成すると良い。
Oracleなどに接続する際に文字コードを指定する
大きく2つの方法がある。
どちらの方法でも良い。状況によって使い分ける。
接続時に文字コードを指定する
public $default = array( 'datasource' => 'hogehoge', ............... 'charset' => 'AL32UTF8', );
環境変数に文字コードを指定する
具体的にはapacheが実行される際に設定される環境変数に NLS_LANG を設定する。
/etc/sysconfig/httpd
export NLS_LANG=Japanese_Japan.UTF8
[カテゴリ: プログラミング言語 > PHP]
[通知用URL]
Tweet
最終更新時間:2019年01月28日 22時06分37秒