HHVM-FastCGIを動かしてみたいので、
これまでApacheを導入することが多かったのですが、
nginxというHTTPサーバを入れてみようと思います。
nginx(http://nginx.org/ja/)は”えんじんえっくす”と読むようです。
読み方がわからなかったので、勝手に”にんくす”みたいに思っていました。
(余談:スターウォーズに「ニンクス」というキャラクターがいるようだ。)
まず、
/etc/yum.repos.d/nginx.repo
というファイルを作成して、以下を記述します。
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
そして、インストールします。
$ sudo yum install nginx
これでインストール完了です。
サービスを起動します。
$ sudo service nginx start
ブラウザで確認すると、
http://192.168.33.10/
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working.
ということで、web serverが出来ました。
2014年5月31日土曜日
ssh接続で、Host key verification failed.
vagrant ssh ではなく、プライベートのIPアドレスでSSH接続するときに
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
と怒られてしまうことがあります。
幾つかの仮想マシンを作って実験しているとプライベートネットワークの
IPアドレスが既存の仮想マシンのIPアドレスと一緒の場合に
「以前のKeyと違いますよ」と言われているようです。
プライベートのIPアドレスを別のものに変更すれば良いですが、
実は以前の仮想マシンは既に破棄していて使っていないということが
よくあり、Vagrantfileの既定値で記載されている192.168.33.10を
そのまま使いたい場合は、
メッセージに表示されている /User/(USER_NAME)/.ssh/known_hosts
を開いて、被っているIPアドレスのKeyを削除することで解決できます。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
と怒られてしまうことがあります。
幾つかの仮想マシンを作って実験しているとプライベートネットワークの
IPアドレスが既存の仮想マシンのIPアドレスと一緒の場合に
「以前のKeyと違いますよ」と言われているようです。
プライベートのIPアドレスを別のものに変更すれば良いですが、
実は以前の仮想マシンは既に破棄していて使っていないということが
よくあり、Vagrantfileの既定値で記載されている192.168.33.10を
そのまま使いたい場合は、
メッセージに表示されている /User/(USER_NAME)/.ssh/known_hosts
を開いて、被っているIPアドレスのKeyを削除することで解決できます。
vagrant で CentOS6.5にHHVMの環境構築
HHVMは、WEBサーバとPHPが実現できて、その上、PHPよりも高速だという話です。
これまでPHPを開発していたので移行しやすく有効活用できるらしいです。
vagrant は導入済みの前提となります。
(導入については過去記事またはを参照願います)
vagrant box を新規に作成
今回はこちらのCurrent BoxesからCentOS 6.5 x64をダウンロードする
http://puppet-vagrant-boxes.puppetlabs.com/
(以下、sudoが必要な場合も記載を省略しています)
$ vagrant box add centos65 ダウンロードディレクトリ/centos-65-x64-virtualbox-nocm.box
$ vagrant init centos65
$ vagrant up
既に、vangrant pluginにsaharaを導入しているので、
一旦ここで、sandboxをonにしておく。
$ vagrant sandbox on
仮想マシンへsshでログイン
$ vagrant ssh
まず、アップデート
$ yum -y update
不便なのでタイムゾーンが日本時間にします。
$ vi /etc/sysconfig/clock
で
ZONE="Asia/Tokyo"
と編集します。
それと、localtimeファイルを変更します。
$ cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
一度再起動します。
$ vagrant reload
すると起動時にマウントの失敗のメッセージが出ますので、
VirtualBox Guest Additionsの最新をインストールします。
(こちらの記事を参照)
再度、仮想マシンを起動して問題なければ、
一旦ここで、boxを残しておこうと思います。
まずは、sandboxのcommit
$ vagrant sandbox commit
そして、boxの作成をします。ファイル名は適当に。
$ vagrant package —output cento65-x64-ja.box
再始動します。
ここからが、HHVMの構築です。
$ vagrant up
$ vagrant ssh
epel repositoryをインストールします。
$ yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
hop5 repositoryをダウンロードします。
$ cd /etc/yum.repos.d <--追記(記載漏れ)
$ wget http://www.hop5.in/yum/el6/hop5.repo
そして、hhvmのインストールをします。
$ yum install hhvm
いろいろとインストールされますが、最後にComplete!と表示され、完了します。
$ hhvm —version
HipHop VM 3.0.1 (rel)
動かしてみます。
phpが動作するということなので、
$ vi hello.php
echo ‘hello php’;
とphpファイルを作成して、保存します。
$ hhvm hello.php
を実行すると、「hello php」と出力されます。
ちなみにphpinfo()を書いて実行すると
「HipHop」
と出力されます。
一旦、仮想マシンを抜けまして、
ホストPC上で、Vagrantfileを編集し、仮想マシンを
プライベートネットワークからアクセスできるようにします。
Vagrantfileを開いて、26行目付近の
config.vm.network :private_network, ip: "192.168.33.10"
のコメントを解除して保存します。
そして、
$ vagrant reload
$ vagrant sshで仮想マシンを再起動し、SSHログインします。
hhvmを以下のコマンドでサーバとして実行します。
$ hhvm -m server
(control + c で停止)
ホストPCからブラウザで、
http://192.168.33.10/hello.php
へアクセスすると、
「HipHop」
と出力されます。
これで一旦HHVMの導入を終了です。
2014年5月29日木曜日
CakePHPのControllerのテストでハマった
Cookbook http://book.cakephp.org/2.0/ja/development/testing.html#id23
にならって、テストケースを作成していたが、
ここで、test.phpで
Controller / ArticlesControllerをクリックすると
Error: Class 'AppController' not found
File: /var/www/html/cake_2_5/app/Controller/ArticlesController.php
とFatal Errorが出ている。
testでない場合は、ArticlesController.phpは問題ないようだが・・
いろいろとググって調べた。
こちらのサイトが参考になった。
http://y-stream.blogspot.jp/2013/08/cakephp-phpunit.html
TestCaseのほうで、
<?php
App::uses('AppController', 'Controller');
class ArticlesControllerTest extends ControllerTestCase {
と、App::usesのAppControllerの指定が抜けていた。
Cookbook通りだと忘れてしまうので、今後気をつけたい。
にならって、テストケースを作成していたが、
ここで、test.phpで
Controller / ArticlesControllerをクリックすると
Error: Class 'AppController' not found
File: /var/www/html/cake_2_5/app/Controller/ArticlesController.php
とFatal Errorが出ている。
testでない場合は、ArticlesController.phpは問題ないようだが・・
いろいろとググって調べた。
こちらのサイトが参考になった。
http://y-stream.blogspot.jp/2013/08/cakephp-phpunit.html
TestCaseのほうで、
<?php
App::uses('AppController', 'Controller');
class ArticlesControllerTest extends ControllerTestCase {
と、App::usesのAppControllerの指定が抜けていた。
Cookbook通りだと忘れてしまうので、今後気をつけたい。
2014年5月28日水曜日
CakePHPでユニットテスト
cakeでUnitTestを実施してみる。
Cookbookのように
ProgressHelperを作成してapp/View/Helperに保存する。
次に、テストケースを作成する。
Cookbookに合わせて、app/Test/Case/View/Helperに、
ProgressHelperTest.php
を作成。
テストを実行。
ブラウザで、http://192.168.33.11/cakephp/test.php
を開く、
AppのTestsをクリックすると、CakePHPでPHPUnitのときにはなかった
Test Caseに、「ProgressHelper」が現れる
で、ProgressHelperをクリックすると、
赤くErrorが出ている。
Error: syntax error, unexpected 'pubic' (T_STRING), expecting function (T_FUNCTION)
File: /var/www/html/cake_2_5/app/View/Helper/ProgressHelper.php
Line: 4
pubicとタイプミスだ。
'public'と修正して、再度テストを実行する。
!FAILED
と出ている。
ProgressHelper.phpにて、
divタグのclass名のタイプミスだ。
コロンが抜けていた。
修正して、テストを実行する。
こんなふうに何度でもテストが行える。
結果、グリーンに「1 passes」と出て、テストはパスしたことになる。
Cookbookのように
ProgressHelperを作成してapp/View/Helperに保存する。
次に、テストケースを作成する。
Cookbookに合わせて、app/Test/Case/View/Helperに、
ProgressHelperTest.php
を作成。
テストを実行。
ブラウザで、http://192.168.33.11/cakephp/test.php
を開く、
AppのTestsをクリックすると、CakePHPでPHPUnitのときにはなかった
Test Caseに、「ProgressHelper」が現れる
で、ProgressHelperをクリックすると、
赤くErrorが出ている。
Error: syntax error, unexpected 'pubic' (T_STRING), expecting function (T_FUNCTION)
File: /var/www/html/cake_2_5/app/View/Helper/ProgressHelper.php
Line: 4
pubicとタイプミスだ。
'public'と修正して、再度テストを実行する。
!FAILED
と出ている。
ProgressHelper.phpにて、
divタグのclass名のタイプミスだ。
コロンが抜けていた。
修正して、テストを実行する。
こんなふうに何度でもテストが行える。
結果、グリーンに「1 passes」と出て、テストはパスしたことになる。
2014年5月27日火曜日
vagrant plugin sahara
vagrant のpluginに「sahara」というのがある。
導入するとサンドボックスとして使用できるようになるものだ。
サンドボックスモードのON/OFF, COMMIT/ROLLBACKが可能となり、
サンドボックスモードがONであれば、その間に仮想マシンに対して行った変更を、
ロールバックすることで元に戻すことができる。
oracleやpostgreSQLなどのリレーショナルデータベースなどのトランザクション処理
のように、rollbackできるので、いろいろ試してみたい場合に便利だ。
というので、プラグインのインストール。
$ vagrant plugin install sahara
インストールしたプラグインを確認
$ vagrant plugin list
sahara (0.0.16)
saharaがインストールできたので、sandboxをonにする。
$ vagrant sandbox on
PHPUnitの導入で導入を失敗したときに、
$ vagrant sandbox rollback
として、sandbox onとしたタイミング、もしくは、前にcommitしたタイミングに
仮想マシンの状態を元に戻してから再度、PHPUnitの導入をやり直した。
そして、仮想マシンとして問題なければ
$ vagrant sandbox commit
する。
2014年5月24日土曜日
CakePHPでPHPUnit
PHPUnitの準備ができたので、
Cookbookに戻って、テスト用にDatabaseを作成する。
楽しようと思うので、
phpMyAdminを使うことにする。
ログインしたら、テスト用データベース「cake_test」を作成する。
照合順序は同じく「utf8_general_ci」とする。
データベース[cake_sample]を開いて、
postsテーブルを選択する。

「操作」メニュー

「cake_sample」を「cake_test」に変更して、
cake_testデータベースのpostsテーブルにコピーをする。
次に、cakeのapp/Config/database.phpを編集。
DATABASE_CONFIG クラスの$test配列にcake_testへの接続を記入する。
テストが実行できるか確認する
とあるので確認する
ブラウザで、http://192.168.33.11/cakephp/test.phpへアクセスする。
CoreのTestsを選択するとテストケースが並んで見れる。
「AllConfigure」をクリックする。
23/23 test methods complete: 23 passes, 0 fails, 54 assertions and 0 exceptions.と出て、テストすることが確認できた。
これで、CakePHPのテスト環境が完了。
PHPUnitの導入 (つづき)の続き
前回の続き、
やり直すことにした。
Cookbookのテストの記載の
内容は、こちらの環境では異なるようなので、別の方法として、
PEARをインストールすることからやらずに、直接PHPUnitをyumでインストールする
(※以下rootで実施)
$ yum install phpunit
Installing:
php-phpunit-PHPUnit
Installing for dependencies:
php-pear
:
などと表示され、pearとphpunitはインストールされるようだ。
(他にもいろんなものが一緒に入ったが・・・)
その結果、
/usr/share/php/PHPUnit/ができており、
中には、Autoload.phpも存在する。
再度、
http://192.168.33.11/cakephp/test.php
を確認すると
Warningが解消され、「CakePHP Test Suite 2.4.9」と
PHPUnitの準備ができたようだ。
やり直すことにした。
Cookbookのテストの記載の
内容は、こちらの環境では異なるようなので、別の方法として、
PEARをインストールすることからやらずに、直接PHPUnitをyumでインストールする
(※以下rootで実施)
$ yum install phpunit
Installing:
php-phpunit-PHPUnit
Installing for dependencies:
php-pear
:
などと表示され、pearとphpunitはインストールされるようだ。
(他にもいろんなものが一緒に入ったが・・・)
その結果、
/usr/share/php/PHPUnit/ができており、
中には、Autoload.phpも存在する。
再度、
http://192.168.33.11/cakephp/test.php
を確認すると
Warningが解消され、「CakePHP Test Suite 2.4.9」と
PHPUnitの準備ができたようだ。
PHPUnitの導入 (つづき)
※環境によってはうまくいかないことがあります。最後までお読みください。
ブラウザで以下へアクセスしても
http://192.168.33.11/cakephp/test.php
PHPUnit is not installed!
と、言われている。
phpunitはインストールできていると思うのだが。。
PHPUnit/Autoload.php云々とWarningが出ている。
そして、
To install with the PEAR installer run the following commands:
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
Once PHPUnit is installed make sure its located on PHP's include_path by checking your php.ini
とも言われている。
Cookbookによると、
“PHPの include_path 上にPHPUnitの ライブラリがあるか確認してください。”
とある
include_pathを確認すると、
.:/usr/share/pear:/usr/share/php
となっていた。
そこらには、"PHPUnit"は見当たらない。
phpunitは、/usr/local/bin/phpunit なので、
/usr/share/pearにシンボリックリンクを貼ってみる。
ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php
解消されず。
一応、/usr/share/phpにシンボリックリンクを貼ってみるが、解消されない。
一応、"PHPUnit"と大文字にしてみても意味が無い。
何かが根本的におかしい。
Failed opening 'PHPUnit/Autoload.php'
とエラーも出ているが、”PHPUnit”というのが見当たらない。
。。。
一からやり直すことにする。
ブラウザで以下へアクセスしても
http://192.168.33.11/cakephp/test.php
PHPUnit is not installed!
と、言われている。
phpunitはインストールできていると思うのだが。。
PHPUnit/Autoload.php云々とWarningが出ている。
そして、
To install with the PEAR installer run the following commands:
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
Once PHPUnit is installed make sure its located on PHP's include_path by checking your php.ini
とも言われている。
Cookbookによると、
“PHPの include_path 上にPHPUnitの ライブラリがあるか確認してください。”
とある
include_pathを確認すると、
.:/usr/share/pear:/usr/share/php
となっていた。
そこらには、"PHPUnit"は見当たらない。
phpunitは、/usr/local/bin/phpunit なので、
/usr/share/pearにシンボリックリンクを貼ってみる。
ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php
解消されず。
一応、/usr/share/phpにシンボリックリンクを貼ってみるが、解消されない。
一応、"PHPUnit"と大文字にしてみても意味が無い。
何かが根本的におかしい。
Failed opening 'PHPUnit/Autoload.php'
とエラーも出ているが、”PHPUnit”というのが見当たらない。
。。。
一からやり直すことにする。
2014年5月23日金曜日
PHPUnitの導入
※環境によってはうまくいかないことがあります。最後までお読みください。
CakePHPでの開発において、ユニットテストを実施するために、PHPUnitの導入を行う。
Cookbook記載の通りにやってみる。
$ sudo pear upgrade PEAR
“コマンドが見つかりません”となる。
PEARが入っていなかったようだ。
まず、PEARパッケージマネージャをインストールする
$ wget http://pear.php.net/go-pear.phar
$ php go-pear.phar
ディレクトリを変更するかどうか聞いてくるが、問題なければそのままEnterとする。
インストール完了。
次に、PHPUnitのインストール
$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ mv phpunit.phar /usr/local/bin/phpunit
これで良いようだ。
確認。
$ phpunit --version PHPUnit 4.1.0 by Sebastian Bergmann.
ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php
PHPUnit is not installed!
と、言われている。
何かおかしいようだ。
CakePHPでの開発において、ユニットテストを実施するために、PHPUnitの導入を行う。
Cookbook記載の通りにやってみる。
$ sudo pear upgrade PEAR
“コマンドが見つかりません”となる。
PEARが入っていなかったようだ。
まず、PEARパッケージマネージャをインストールする
$ wget http://pear.php.net/go-pear.phar
$ php go-pear.phar
ディレクトリを変更するかどうか聞いてくるが、問題なければそのままEnterとする。
インストール完了。
次に、PHPUnitのインストール
$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ mv phpunit.phar /usr/local/bin/phpunit
これで良いようだ。
確認。
$ phpunit --version PHPUnit 4.1.0 by Sebastian Bergmann.
ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php
PHPUnit is not installed!
と、言われている。
何かおかしいようだ。
2014年5月22日木曜日
FormHelperのpostLink
CakePHPを導入したらCookbookにある
「ブログチュートリアル」をベースに進めていくと大変わかり易い。
そこにある「記事投稿の削除」では、GETリクエストで投稿を削除するのはWEBクローラが不要に削除するので危険であるとあるので、POSTリクエストによる削除を行うことにするが、記事の追加、投稿記事の編集のようにFormHelperをつかって、createからendまで書くのは手間である。
そこで、postLinkというものがあるのでこれを解析してみる。
echo $this->Form->postLink('Delete', array('action' => 'delete', $post['Post']['id']), array('confirm' => 'Are you sure?'));
を書き、実際にページを作成してブラウザ(※Google Chromeを使用している)で表示したところで、
”Delete”リンクで右クリックし、”要素の検証”をクリックするとブラウザの下部に要素(ソースの一部)が表示される。
上記のpostLinkの箇所が以下のようになっているのがわかる。
その上で、4行目にて”Delete”としたaタグのonclickイベントで、先のformをsubmitするようになっている。
formのidは、自動で付加されているらしい。
また、postLinkでconfirmを指定しているので、確認ダイアログが出るようになっている。
「ブログチュートリアル」をベースに進めていくと大変わかり易い。
そこにある「記事投稿の削除」では、GETリクエストで投稿を削除するのはWEBクローラが不要に削除するので危険であるとあるので、POSTリクエストによる削除を行うことにするが、記事の追加、投稿記事の編集のようにFormHelperをつかって、createからendまで書くのは手間である。
そこで、postLinkというものがあるのでこれを解析してみる。
echo $this->Form->postLink('Delete', array('action' => 'delete', $post['Post']['id']), array('confirm' => 'Are you sure?'));
を書き、実際にページを作成してブラウザ(※Google Chromeを使用している)で表示したところで、
”Delete”リンクで右クリックし、”要素の検証”をクリックするとブラウザの下部に要素(ソースの一部)が表示される。
上記のpostLinkの箇所が以下のようになっているのがわかる。
- <form action="/cakephp/posts/delete/5" name="post_537d6ddaf1adf620659485" id="post_537d6ddaf1adf620659485" style="display:none;" method="post”>
- <input type="hidden" name="_method" value="POST”>
- </form>
- <a href="#" onclick="if (confirm("Are you sure?")) { document.post_537d6ddaf1adf620659485.submit(); } event.returnValue = false; return false;">Delete</a>
その上で、4行目にて”Delete”としたaタグのonclickイベントで、先のformをsubmitするようになっている。
formのidは、自動で付加されているらしい。
また、postLinkでconfirmを指定しているので、確認ダイアログが出るようになっている。
2014年5月20日火曜日
vagrant 仮想環境構築のイメージ
vagrant仮想マシンの構成の私が想像するイメージ図を以下に示す。(誤解があるかも)

コマンド vagrant box 〜で管理できるものは、右の緑で表したものになり、vagrant box listでは、a, b, cが表示される。
左が、vagrant upで稼働するVMにあたり、いずれかのboxによって作られていることになる。
ここでは、VMの色が、それぞれディレクトリが異なる(Vagrantfileが異なる)ものとして構成され、上の水色の3つのVMは同じディレクトリに存在する。
defaultは最初にできてしまったものなので無くてもよいのだが、構成として意味があるものであれば良い。
VagrantfileにVMを3つ記述することで、別のVMを構築することができる。(しなくても特に問題ない)
vagrant up で一度に3つのVMを起動できるし、vagrant up [vm-name]で個別に起動もできる。
関連があるのであれば、Multi-Machineとして複数のVMをひとつのVagrantfileで管理できるし、特に関連がないならば、別のディレクトリに分けて扱うのがよい。
vagrantでpackageの作成
vagrantで構築した仮想マシン(vagrant machine)をpackage化する。
コマンドをたたく
$ vagrant package
package.boxが作成される
仮想マシンをシャットダウンしていなかったため、自動でshutdownしてくれる。
—outputオプションで、packageファイル名(パス)を指定しない場合は、同じディレクトリに「package.box」として作成される。
packageされたboxファイルを別のPCへ持っていけば、同じ仮想環境をすぐに作ることができる。
$ vagrant init [box-name] [box-url]
box-urlにpackage.boxへのパスを指定する。
ただし、元の仮想マシンがprivate networkで構築している場合に新しいPCでもprivate networkを使用する場合は注意が必要で、
「vagrantのネットワークエラー」でも記載の通りエラーとなることがある。
コマンドをたたく
$ vagrant package
package.boxが作成される
仮想マシンをシャットダウンしていなかったため、自動でshutdownしてくれる。
—outputオプションで、packageファイル名(パス)を指定しない場合は、同じディレクトリに「package.box」として作成される。
packageされたboxファイルを別のPCへ持っていけば、同じ仮想環境をすぐに作ることができる。
$ vagrant init [box-name] [box-url]
box-urlにpackage.boxへのパスを指定する。
ただし、元の仮想マシンがprivate networkで構築している場合に新しいPCでもprivate networkを使用する場合は注意が必要で、
「vagrantのネットワークエラー」でも記載の通りエラーとなることがある。
2014年5月19日月曜日
CakePHP is NOT able to connect to the database.
cakephpのデータベースを設定(app/Config/database.php)しても
以下のメッセージがでる場合、
CakePHP is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.
接続するユーザの特権が不足している可能性がある。
phpMyAdminで対象ユーザの特権を確認し、
チェックが付いていなければ、チェックを付ける。

以下のメッセージがでる場合、
CakePHP is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.
接続するユーザの特権が不足している可能性がある。
phpMyAdminで対象ユーザの特権を確認し、
チェックが付いていなければ、チェックを付ける。
登録:
投稿 (Atom)