Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
53
Help us understand the problem. What is going on with this article?
@mochizukikotaro

VagrantでCakePHPの開発環境をつくる。エラーとか警告を綺麗にするまで。

More than 5 years have passed since last update.

はじめに

http://hoge.tokyoというドメインのWebサービスを開発するとして、ローカルにその環境をつくります。
・Vagrantを使います。
・boxはchef/centos-6.5を使います。
・CakePHP2.7.6を使います。
local.hoge.tokyoでローカル環境にアクセスできるようにする。
・さらにBitbucketでgit管理して、本番http://hoge.tokyoにアクセスできるようにする。

2015/7/12に、トライした結果上記のスペックで無事うごいています。ほっ。

vagrant ssh まで

vagrant box は下を使います。
https://atlas.hashicorp.com/chef/boxes/centos-6.5

% mkdir ~/Work/vagrant-hoge
% cd ~/Work/vagrant-hoge
% vagrant init chef/centos-6.5
% vagrant up
% vagrant ssh

PHP、Apache、MySQLをインストール

$ yum list installed
$ sudo yum -y update

# PHPインストール(これで同時にhttpd(Apache)も入る)
$ sudo yum -y install php
$ php -v

# MySQLの最新版をインストール
# http://dev.mysql.com/downloads/repo/yum/
# http://dev.mysql.com/downloads/file.php?id=450542
# 上記ページの「No thanks, just start my download.」リンクを使う。
$ sudo yum -y install wget
$ wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ sudo rpm -Uvh mysql-community-release-el6-5.noarch.rpm
$ sudo yum -y install mysql-community-server
$ mysql --version

# vagrant起動時にhttpdとmysqldがスタートするようにする
$ sudo chkconfig httpd on
$ sudo chkconfig mysqld on
$ chkconfig --list httpd
$ chkconfig --list mysqld
$ chkconfig | grep "httpd\|mysqld"

Vagrantfileの設定

Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "chef/centos-6.5"
  config.vm.network "forwarded_port", guest: 80, host: 5678
  config.vm.network "private_network", ip: "192.168.33.56"
end
# 5678とか56とかは適当につけてます。

local.hoge.tokyo でのアクセスを可能にする

% sudo sh -c "echo 192.168.33.55 local.hoge.tokyo >> /etc/hosts"
/etc/hosts
192.168.33.55 local.hoge.tokyo

これで、vagrant reloadをしておけば

  • 192.168.33.56
  • localhost:5678
  • local.hoge.tokyo

のいずれでもアクセスが可能となっている。

vagrant reload でこけまくる場合。

久しぶりに自分の記事を見て環境をつくっていたら、reloadでコケました。

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

上のエラーで泣きました。けど、先生方が解決策を用意してくれています。
http://qiita.com/DQNEO/items/2375dd8002a831268cb5#comment-e5334d0d7956bb78fd27

% vagrant ssh

$ sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
$ sudo /etc/init.d/vboxadd setup

# これで `vagrant reload` でいけました。奥が深いです。勉強不足です。。。

vagrant ssh せずにhtmlファイルを弄れるようにする。

% vagrant ssh
$ sudo rm -rf /var/www/html
$ sudo ln -fs /vagrant /var/www/html

データベースの作成

$ sudo yum install php-mysql
# これでphp-mysqlとphp-pdoが入る

$ mysql_config --socket
# /var/lib/mysql/mysql.sock
/etc/php.ini
" 以下のように変更
mysql.default_socket = /var/lib/mysql/mysql.sock
/etc/my.cnf
" 以下を追記
character-set-server=utf8
$ exit
% vagrant reload
% vagrant ssh
$ mysql -u root
mysql> create database hoge character set utf8;
mysql> show databases;
mysql> use hoge;
mysql> show variables like '%char%';

CakePHPを入れる

% vagrant ssh
$ cd
$ wget https://github.com/cakephp/cakephp/archive/2.6.7.zip
$ sudo yum install zip unzip
$ unzip 2.6.7.zip
$ mv cakephp-2.6.7/ /vagrant/hoge

ここで試しにhttp://local.hoge.tokyo/hoge/にアクセスすると、エラー祭り。

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 'UTC' for 'UTC/0.0/no DST' instead in /vagrant/appformer/lib/Cake/Cache/CacheEngine.php on line 60 Fatal error: Call to undefined function mb_strtolower() in /vagrant/appformer/lib/Cake/Utility/Inflector.php on line 483
$ sudo yum install php-mbstring
% cd ~/Work/vagrant-hoge/hoge
% chmod -R 777 app/tmp
# これだけだとなぜかpersistent配下がきかなかったので
% chmod -R 777 app/tmp/cache/persistent
# これで下の二つも効く
# myapp_cake_core_cake_dev_ja
# myapp_cake_core_file_map

追記:
/etc/httpd/conf/httpd.confのUserとGroupを確認しつつ。chownとかで所有者をapacheにして755とかにした方がよいかと思ったのです、vagrant内のtmpなどは、ホストとゲストでファイルを共有しているので、ssh後にchownなどは効かない。なので、ここは、いったんexitして、(vagrantを出て)chmod -R 777 tmpした方が良さそう。

/etc/httpd/conf/httpd.conf(デザイン反映されないのを直す)
DocumentRoot "/var/www/html"
" 略
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    " NoneとなっていたのをAllに変更
    Order allow,deny
    Allow from all
</Directory>
hoge/app/Config/core.php
# 適当に書き換える
Configure::write('Security.salt', '****');
Configure::write('Security.cipherSeed', '****');

# タイムゾーンを指定する
date_default_timezone_set('Asia/Tokyo');
% cd ~/Work/vagrant-hoge/hoge/app/Config
% cp database.php.default database.php
/hoge/app/Config/database.php
public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'root',
    'password' => '',
    'database' => 'hoge',
    'prefix' => '',
    'encoding' => 'utf8',
);

Warning: SplFileInfo::openFile を防ぐ

app/Config/bootstrap.php
 // Setup a 'default' cache configuration for use in the application.
-Cache::config('default', array('engine' => 'File'));
+Cache::config('default', array(
+       'engine' => 'File',
+       'mask' => 0666,
+       ));
app/Config/core.php
@@ -371,7 +371,8 @@ Cache::config('_cake_core_', array(
        'prefix' => $prefix . 'cake_core_',
        'path' => CACHE . 'persistent' . DS,
        'serialize' => ($engine === 'File'),
-       'duration' => $duration
+       'duration' => $duration,
+       'mask' => 0666,
 ));

 /**
@@ -383,5 +384,6 @@ Cache::config('_cake_model_', array(
        'prefix' => $prefix . 'cake_model_',
        'path' => CACHE . 'models' . DS,
        'serialize' => ($engine === 'File'),
-       'duration' => $duration
+       'duration' => $duration,
+       'mask' => 0666,
 ));

URLを綺麗にする

% vagrant ssh
$ sudo vi /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/hoge/app/webroot"
$ sudo service httpd restart

これで、localhost.hoge.tokyoでのアクセスが可能になる。

vagrant ssh を快適にする

% cd ~/Work/vagrant-hoge
% vagrant ssh-config >> ~/.ssh/config
% cat ~/.ssh/config
# Host default
#   HostName 127.0.0.1
#   User vagrant
#   Port 2201
#   UserKnownHostsFile /dev/null
#   StrictHostKeyChecking no
#   PasswordAuthentication no
#   IdentityFile 
# /Users/mochizuki/Work/vagrant-hoge/.vagrant/machines/default/virtualbox/private_key
#   IdentitiesOnly yes
#  LogLevel FATAL
% sed -ie "s/Host default/Host hoge/" ~/.ssh/config
# これで ssh hoge で接続できる。

git管理しておく

Bitbucketでrepository作成しておく

% cd ~/Work/vagrant-hoge/hoge
% git init
% git add .
% git commit -m "First commit"
% git remote add origin https://mochizukikotaro@bitbucket.org/mochizukikotaro/hoge.git
% git push -u origin master

さくらのレンサバからgit pullして本番に反映させる。

% ssh {user}@{host}
# ssh mochizuki@www123.sakura.ne.jpみたいな形だと思います。

% cd ~/www/hoge
% git clone https://mochizukikotaro@bitbucket.org/mochizukikotaro/hoge.git

本番は.htaccessを変更する必要がある。

参考は下。
http://www.tailtension.com/cakephp/1620/

~/www/hoge/.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteBase /
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>
~/www/hoge/app/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>
~/www/hoge/app/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

これで本番からアクセスできます。gitignoreとか設定しなきゃ。。

53
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
53
Help us understand the problem. What is going on with this article?