zowのプログラムな日々

日々のプログラミングとか

Mac(Yosemite)のVagrant(ubuntu14.04 server)にPHP開発環境を構築する - Phalcon編

ビルドスクリプトを改造して、Phalconのインストールまで行えるようにする。(あとついでにSQLite3も入れる)

Phalconのインストール方法

ubuntuの場合、PPAからインストールできる

sudo apt-add-repository ppa:phalcon/stable

sudo apt-get update

sudo apt-get install php5-phalcon

SQLite3のインストール方法

SQLite3とPHP用のライブラリを入れる必要がある。

sudo apt-get install sqlite3

sudo apt-get install php5-sqlite

ビルドスクリプト作成

上記を踏まえてスクリプトを作り直し、最終的に出来上がったのがこちら

#!/bin/bash

#MySQLパスワードを設定する
MYSQL_PASS="password"


CheckStatus()
{
  if [ $? -eq 0 ]
  then
    echo "$1 : 成功"
  else
    echo "$1 : 失敗"
  fi
}



#共有ディレクトリ設定
sudo /etc/init.d/vboxadd setup  > /dev/null 2>&1
CheckStatus "共有ディレクトリ設定"

#aptリポジトリ更新
sudo apt-get update  > /dev/null 2>&1
CheckStatus "aptリポジトリ更新"

#MySQLインストール
dpkg -l |grep mysql-server > /dev/null 2>&1
if [ $? -ne 0 ]
then
  echo "mysql-server-5.5 mysql-server/root_password password ${MYSQL_PASS}" |sudo /usr/bin/debconf-set-selections
  CheckStatus "MySQLパスワード設定"

  echo "mysql-server-5.5 mysql-server/root_password_again password ${MYSQL_PASS}" | sudo /usr/bin/debconf-set-selections
  CheckStatus "MySQLパスワード設定2回目"

  sudo apt-get install mysql-server -y  > /dev/null 2>&1
  CheckStatus "MySQLインストール"
else
  echo "MySQLは既にインストールされています"
fi

#Apacheインストール
dpkg -l | grep apache2  > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install apache2 -y > /dev/null 2>&1
  CheckStatus "Apacheインストール"
else
  echo "Apache2は既にインストールされています"
fi

#Apache関連パッケージインストール
dpkg -l | grep apache2-utils > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install apache2-utils -y > /dev/null 2>&1
  CheckStatus "Apache関連パッケージインストール"
else
  echo "Apache2関連パッケージは既にインストールされています"
fi

#SQLite3インストール
#dpkg -l | grep sqlite3 > /dev/null 2>&1
which sqlite3 > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install sqlite3 -y > /dev/null 2>&1
  CheckStatus "SQLite3パッケージインストール"
else
  echo "SQLite3パッケージは既にインストールされています"
fi

#PHPインストール
dpkg -l | grep php5 > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install php5 -y > /dev/null 2>&1
  CheckStatus "PHPインストール"
else
  echo "PHPは既にインストールされています"
fi

#PHP関連パッケージインストール
dpkg -l | grep php5-mysql > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install php5-mysql -y > /dev/null 2>&1
  CheckStatus "php-mysqlパッケージインストール"
  sudo apt-get install php5-sqlite -y > /dev/null 2>&1
  CheckStatus "php5-sqliteパッケージインストール"
else
  echo "PHP関連パッケージは既にインストールされています"
fi

#Phalconインストール
dpkg -l | grep php5-phalcon > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-add-repository ppa:phalcon/stable  > /dev/null 2>&1
  CheckStatus "ppa:phalcon追加"
  sudo apt-get update  > /dev/null 2>&1
  CheckStatus "aptリポジトリ更新"
  sudo apt-get install php5-phalcon -y > /dev/null 2>&1
  CheckStatus "Phalconパッケージインストール"
else
  echo "Phalconパッケージは既にインストールされています"
fi


#mod_rewrite有効化
sudo a2enmod rewrite > /dev/null 2>&1
CheckStatus "mod_rewrite有効化"

#ドキュメントルート設定
ls /var/www/html | grep index.php > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo rm -rf /var/www/html 
  sudo mkdir /vagrant/docroot 
  sudo chown vagrant.vagrant /vagrant/docroot
  sudo ln -s /vagrant/docroot /var/www/html
  echo '<?php phpinfo();?>' > /vagrant/docroot/index.php
  ls /var/www/html | grep index.php > /dev/null 2>&1
  CheckStatus "ドキュメントルート設定"
else
  echo "ドキュメントルート設定は既にされています"
fi

#Apache2再起動
sudo service apache2 restart > /dev/null 2>&1
CheckStatus "Apache2再起動"

変更点は

  • ベースのイメージを作ってから時間が経って実行すると思うので、最初にaptリポジトリを更新する
  • SQLite3のパッケージ有無をsqlite3でgrepする方法だとlibsqlite3で引っかかってコマンドが入らなくなるためwhichに変更

ビルドスクリプト実行

静的CMS開発環境でビルドを実行してみる。

ちなみに、共有ディレクトリのエラーがうざかったのでエラー解消版として新たに「base_ubuntu1404_1」を作成した

$ mkdir dev/vagrant/dev_phalcon01
$ cd dev/vagrant/dev_phalcon01
$ vagrant init base_ubuntu1404_1
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$

Vagrantfileは以下を変更

  # config.vm.network "private_network", ip: "192.168.33.10"
    ↓
  config.vm.network "private_network", ip: "192.168.33.111"

  #追記
  config.vm.hostname = "dev-phalcon01"

  config.vm.provision "shell", path: "/Users/zow/dev/vagrant/build_script/dev_php.sh"

起動!

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'base_ubuntu1404_1'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: dev_phalcon01_default_1421614217883_83617
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/zow/dev/vagrant/dev_phalcon01
==> default: Running provisioner: shell...
    default: Running: /var/folders/yf/psgfw4xs3z5_dvfnyhtnx6c40000gn/T/vagrant-shell20150119-76183-8cuc6g.sh
==> default: stdin: is not a tty
==> default: 共有ディレクトリ設定 : 成功
==> default: aptリポジトリ更新 : 成功
==> default: MySQLパスワード設定 : 成功
==> default: MySQLパスワード設定2回目 : 成功
==> default: MySQLインストール : 成功
==> default: Apacheインストール : 成功
==> default: Apache関連パッケージインストール : 成功
==> default: SQLite3パッケージインストール : 成功
==> default: PHPインストール : 成功
==> default: php-mysqlパッケージインストール : 成功
==> default: php5-sqliteパッケージインストール : 成功
==> default: ppa:phalcon追加 : 成功
==> default: aptリポジトリ更新 : 成功
==> default: Phalconパッケージインストール : 成功
==> default: mod_rewrite有効化 : 成功
==> default: ドキュメントルート設定 : 成功
==> default: Apache2再起動 : 成功
$

共有ディレクトリのエラーが無くなったので、初回起動時のみ自動でプロビジョニングしてくれるようになった。素晴らしい

ブラウザでphpinfoを見てみる

f:id:zow3:20150119055740p:plain

ちゃんとphalconも追加されてる。

ここまで10分足らず。Vagrant素晴らしい

Phalcon デベロッパーツールインストール(追記)

実はPhalconにはデベロッパーツールがあって、スケルトン生成とかしてくれるらしい。

これはインストールしなければ、ということで関連パッケージ等々インストール

ここで気づいたんだけど、実はまだgit入れてなかったのでgitもインストール

git

sudo add-apt-repository ppa:git-core/ppa

sudo apt-get update

sudo apt-get install git -y

composer.phar

curl -s http://getcomposer.org/installer | php

phalcon/devtoolsはcomposerで入れる。方法はこちら

で、編集したビルドスクリプトがこちら

#!/bin/bash

#MySQLパスワードを設定する
MYSQL_PASS="password"


CheckStatus()
{
  if [ $? -eq 0 ]
  then
    echo "$1 : 成功"
  else
    echo "$1 : 失敗"
  fi
}



#共有ディレクトリ設定
sudo /etc/init.d/vboxadd setup  > /dev/null 2>&1
CheckStatus "共有ディレクトリ設定"

#aptリポジトリ更新
sudo apt-get update  > /dev/null 2>&1
CheckStatus "aptリポジトリ更新"

#MySQLインストール
dpkg -l |grep mysql-server > /dev/null 2>&1
if [ $? -ne 0 ]
then
  echo "mysql-server-5.5 mysql-server/root_password password ${MYSQL_PASS}" |sudo /usr/bin/debconf-set-selections
  CheckStatus "MySQLパスワード設定"

  echo "mysql-server-5.5 mysql-server/root_password_again password ${MYSQL_PASS}" | sudo /usr/bin/debconf-set-selections
  CheckStatus "MySQLパスワード設定2回目"

  sudo apt-get install mysql-server -y  > /dev/null 2>&1
  CheckStatus "MySQLインストール"
else
  echo "MySQLは既にインストールされています"
fi

#Apacheインストール
dpkg -l | grep apache2  > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install apache2 -y > /dev/null 2>&1
  CheckStatus "Apacheインストール"
else
  echo "Apache2は既にインストールされています"
fi

#Apache関連パッケージインストール
dpkg -l | grep apache2-utils > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install apache2-utils -y > /dev/null 2>&1
  CheckStatus "Apache関連パッケージインストール"
else
  echo "Apache2関連パッケージは既にインストールされています"
fi

#SQLite3インストール
#dpkg -l | grep sqlite3 > /dev/null 2>&1
which sqlite3 > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install sqlite3 -y > /dev/null 2>&1
  CheckStatus "SQLite3パッケージインストール"
else
  echo "SQLite3パッケージは既にインストールされています"
fi

#PHPインストール
dpkg -l | grep php5 > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install php5 -y > /dev/null 2>&1
  CheckStatus "PHPインストール"
else
  echo "PHPは既にインストールされています"
fi

#PHP関連パッケージインストール
dpkg -l | grep php5-mysql > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-get install php5-mysql -y > /dev/null 2>&1
  CheckStatus "php-mysqlパッケージインストール"
  sudo apt-get install php5-sqlite -y > /dev/null 2>&1
  CheckStatus "php5-sqliteパッケージインストール"
else
  echo "PHP関連パッケージは既にインストールされています"
fi

#Phalconインストール
dpkg -l | grep php5-phalcon > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo apt-add-repository ppa:phalcon/stable  > /dev/null 2>&1
  CheckStatus "ppa:phalcon追加"
  sudo apt-get update  > /dev/null 2>&1
  CheckStatus "aptリポジトリ更新"
  sudo apt-get install php5-phalcon -y > /dev/null 2>&1
  CheckStatus "Phalconパッケージインストール"
else
  echo "Phalconパッケージは既にインストールされています"
fi

#Gitインストール
which git > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo add-apt-repository ppa:git-core/ppa > /dev/null 2>&1
  CheckStatus "ppa:git-core追加"
  sudo apt-get update  > /dev/null 2>&1
  CheckStatus "aptリポジトリ更新"
  sudo apt-get install git -y > /dev/null 2>&1
  CheckStatus "Gitパッケージインストール"
else
  echo "Gitパッケージは既にインストールされています"
fi

#mod_rewrite有効化
sudo a2enmod rewrite > /dev/null 2>&1
CheckStatus "mod_rewrite有効化"

#ドキュメントルート設定
ls /var/www/html | grep index.php > /dev/null 2>&1
if [ $? -ne 0 ]
then
  sudo rm -rf /var/www/html 
  sudo mkdir /vagrant/docroot 
  sudo chown vagrant.vagrant /vagrant/docroot
  sudo ln -s /vagrant/docroot /var/www/html
  echo '<?php phpinfo();?>' > /vagrant/docroot/index.php
  ls /var/www/html | grep index.php > /dev/null 2>&1
  CheckStatus "ドキュメントルート設定"
else
  echo "ドキュメントルート設定は既にされています"
fi

#Apache2再起動
sudo service apache2 restart > /dev/null 2>&1
CheckStatus "Apache2再起動"

#composerインストール
which composer.phar > /dev/null 2>&1
if [ $? -ne 0 ]
then
  mkdir -p /usr/local/phptools/composer
  cd /usr/local/phptools/composer
  sudo chown -R vagrant.vagrant /usr/local/phptools
  CheckStatus "/usr/local/phptoolsオーナー変更"
  CheckStatus "/usr/local/phptools/composerディレクトリ作成"
  curl -s http://getcomposer.org/installer | php > /dev/null 2>&1
  CheckStatus "composer.pharインストール"
  sudo ln -s /usr/local/phptools/composer/composer.phar /usr/local/bin/composer.phar
  CheckStatus "composer.pharシンボリックリンク設定"
else
  echo "composer.pharは既にインストールされています"
fi
  
#Phalcon dev-toolインストール
which phalcon > /dev/null 2>&1
if [ $? -ne 0 ]
then
  mkdir -p /usr/local/phptools
  cd /usr/local/phptools
  sudo chown -R vagrant.vagrant /usr/local/phptools
  CheckStatus "/usr/local/phptoolsオーナー変更"
  cat << EOT > composer.json 
{
    "require": {
        "phalcon/devtools": "dev-master"
    }
}
EOT
  CheckStatus "composer.json作成"
  composer.phar install > /dev/null 2>&1
  CheckStatus "phalcon/devtoolsインストール"
  ln -s /usr/local/phptools/vendor/phalcon/devtools/phalcon.php /usr/local/bin/phalcon > /dev/null 2>&1
  CheckStatus "phalconシンボリックリンク設定"
  chmod ugo+x /usr/local/bin/phalcon > /dev/null 2>&1
  CheckStatus "phalconモード変更"
else
  echo "phalcon/devtoolsは既にインストールされています"
fi

実行は既にしてしまったので再実行のログ

$ vagrant provision
==> default: Running provisioner: shell...
    default: Running: /var/folders/yf/psgfw4xs3z5_dvfnyhtnx6c40000gn/T/vagrant-shell20150119-77177-xgz2zw.sh
==> default: stdin: is not a tty
==> default: 共有ディレクトリ設定 : 成功
==> default: aptリポジトリ更新 : 成功
==> default: MySQLは既にインストールされています
==> default: Apache2は既にインストールされています
==> default: Apache2関連パッケージは既にインストールされています
==> default: SQLite3パッケージは既にインストールされています
==> default: PHPは既にインストールされています
==> default: PHP関連パッケージは既にインストールされています
==> default: Phalconパッケージは既にインストールされています
==> default: Gitパッケージは既にインストールされています
==> default: mod_rewrite有効化 : 成功
==> default: ドキュメントルート設定は既にされています
==> default: Apache2再起動 : 成功
==> default: composer.pharは既にインストールされています
==> default: phalcon/devtoolsは既にインストールされています
$

ちょっと悩みどころなのがcomposer。

jsonでパッケージ指定しなきゃならないのだけど、今はヒアドキュメントでやってるから、もしもっと増えるようだとやり方考えなきゃならんなー。