カテゴリー
PHP

Phpstorm6 リモートデバッグ

Vagrant + Chef で開発環境を簡単に立ち上げることができるようになったので、Phpstorm6を使ってリモートデバッグできる環境を整えてみたいと思います。

Vagrant+ChefでApache、PHP、MySQLがインストールされていることが前提となりますが、何らかの仮想サーバやリモートサーバでもほぼ同じ作業でOKだと思います。

1.はじめに

まずはサーバにxDebugをインストールしますが、Chefでやっちゃいます。

chef-repoのcookbooksにあるレシピに、definitionsディレクトリがあるので、そこにpeclのDSLを定義します。

上記の例では/chef-repo/cookbooks/myrecipe/definitionsにpecl.rbというファイル名で、下記内容のファイルを作成します。

define :pecl do
    bash "install-#{params[:name]}" do
        code <<-EOC
            pecl install #{params[:name]}
        EOC
        not_if 'pecl list xdebug'
    end
end

次に、レシピファイル(今回の例では/chef-repo/cookbooks/myrecipe/recipes/default.rb)に次の一文を追加します。

pecl 'xdebug'

これで vagrant up すると自動的にxdebugがインストールされます。

2.php.iniの編集

xdebugを有効化するため、php.iniを編集します。

ウチの環境では下記のような設定をphp.iniに追加しました。

[XDebug]
zend_extension = "/usr/lib/php/modules/xdebug.so"

xdebug.collect_params = 4
xdebug.default_enable = "On"
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "xdebug_profile.%R::%u"
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = 192.168.xxx.xxx
xdebug.remote_log = "/val/log/xdebug.log"
xdebug.remote_port = 9000

Chefを使っているなら、templateかcookbookfilesで処理するといいでしょう。

だがしかし!ここでいろいろハマりました。

「xdebugのマニュアル読みましょうw」というのはひとまず置いといて。

・xdebug.remote_autostart
これが0だと、スクリプトが走っても仮想サーバ側のデバッグ情報がホストOS側に投げられませんでした。

以前、xampp環境でxdebugを使った時はここが0でも上手く動いていたのですが...。

ちなみに、マニュアルにはここが0だと、GETかPOSTまたはCookieが投げられたらデバッグ情報投げるよ、1だと関係なく毎回デバッグ情報投げるよ、みたいに書かれているのですが、ウチの場合は期待通りに動作してくれませんでした。

・xdebug.remote_host
インターネット上の情報を拾ってきて設定を進めていて、最初は下記のような記述にしていたのですが...、

;xdebug.remote_host = "localhost"
xdebug.remote_connect_back = 1

これだとホストOS側にデバッグ情報が送信されてきませんでした。

ここも、以前xamppで環境を作ったときはremote_connect_back = 1で上手く動作していたのですが...。

あと、ウチの環境だけかどうかわかりませんが、xdebugが動作したとき(PHPスクリプトが実行されたとき)にデバッグクライアント(今回の場合はPhpstorm)がデバッグポートを待ち受けていない場合、PHPの実行が非常に遅くなりました。

いろいろ試して気が付いたのですが、どうやらxdebugがデバッグクライアントのポートに接続しにいっても接続先がないため、timeoutするまで延々スクリプトの実行が遅延しているようです。

3.Phpstorm側の設定

Ctrl+Alt+SでPhpstormの設定画面を開きます。

Project SettingsのPHP->Debugを開きます。

中央付近のXdebugのDebug portに9000を設定します。

環境によってはこれだけでOKなのですが、ウチの場合はサーバーと作業フォルダのマッピングが必要でした。

4.ファイルマッピング

完全にローカルPCだけで完結している開発作業ならともかく、Vagrantで立てた仮想サーバとホストOSといった具合にサーバマシンと開発マシンが分かれている場合、サーバ側のファイルが、ローカルのどのファイルに相当するのかをマッピングしてやる必要があります。

まずはCtrl+Alt+Sで設定画面を開きます。

Project SettingsのPHP->Serversを選択。

サーバー情報がまだ追加されてない場合は「+」をクリック、既に仮想サーバが追加されている場合はそれを選択します。

Name: 適当にサーバ名を入力
Host:仮想サーバのIPかアドレス
Port:80(デフォルト)
Debugger:Xdebug
Use path mappings:チェックを入れて、ディレクトリツリーを表示します

File/Directoryに現在のローカル(ホストOS)側のプロジェクトで使用しているディレクトリやファイルが表示されるので、それらがサーバ側のどれに該当するかをAbsolute path on the serverに指定します。

ファイルを1個づつ指定しなくても、ディレクトリ構造が同じであればトップディレクトリをマッピングすればOKですが、もし仮想サーバと作業フォルダで構造が異なっている場合はサブディレクトリ単位またはファイル単位で指定する必要があります。

Absolute path on the serverは、そう書かれているように仮想サーバ(Vagrant)側の絶対パスで指定します。

例えばプロジェクトの作業フォルダが c:\project で、そこにindex.phpを作成したとします。

CentOSなどでyumからApacheをインストールした場合のデフォルトは/var/www/htmlがWebサーバのドキュメントルートになるはずなので

c:\project/var/www/html にディレクトリ単位でマッピングするか、

c:\project\index.php/var/www/html/index.php のようにファイル単位で個別にマッピングするかのどちらかになりますが、多くの場合はディレクトリ単位で指定する方がお手軽に済むでしょう。

以上で設定は完了になります。

あとは、Phpstorm側のリモートデバッグをOn(リモートデバッグスイッチをクリック)にしてブラウザから仮想環境のPHPスクリプトを実行すればブレークポイントで停止するはず!

カテゴリー
未分類

エロいイケメンなシェフがこっち見てソロ活動してる件について

RubyでできてるChefはえらいイケメンならしく、巷でモテモテならしいです。

勉強会とかでも話題に上ることが多く、エロいChefに見られてる気がしたので重い腰を上げて取り掛かってみました。

釣くさいタイトルはどうでもいいからChefって何さ?

ザックリまとめると「サーバの状態を保持するツール」ですが、「同じ規格の開発環境を何個も用意したり、配布できるツール」といった使い方も可能で、私としては後者の用途に非常に興味があるわけです。

開発環境を乱立するにあたって、手っ取り早くもめんどくさいXamppとかより「Chefでレシピ用意して立てた方がいいよね!」ってのが、最近の流れかと。

本番環境の運用ではなく、あくまで開発環境の高速乱立(?)を目指すので、ここではChef soloを使っていきたいと思います。

よーいするもの(Windows7での実行を想定)

  1. Ruby・・・1.9.2だとなぜかgemのjsonインストールでコケたので、2.0.0を用意。
  2. Chef・・・Rubyをインストールしたあと「gem install chef」で、サクッとインストール。
  3. VirtualBox・・・仮想マシンツール。開発環境をこれで作成します。
  4. Vagrant・・・VirtualBoxのフロントエンドになるツール。
    http://www.vagrantup.com/ ここからダウンロードしてインストーラに従ってインストールしました。
  5. Git・・・みんな大好き“間抜け野郎”(git)。インストールしてない人は、Windows環境でもvagrant sshを使えるようにするため、同梱されるssh.exe目当てでインストールしよう。
    MacとかLinuxはsshが既にあるはずなので、Gitがあっても無くてもどっちでもいいです。
    ちなみに、Windows環境ではインストール後、環境変数PATHにssh.exeへのパスを当しておきます→「C:\Program Files (x86)\Git\bin\」

Vagrantで、仮想環境のサーバをたてる

上記の準備が出来たら、Vagrantを使ってVirturalBoxの仮想サーバを作成→起動→停止を行ってみます。

まずは仮想サーバの入手からですが、下記URLで好みの環境を選びます。
http://www.vagrantbox.es/

2013/06/03時点では、各サーバのURLの手前に「Copy」と表示されているので、それをクリックすればクリップボードにURLがコピーされます。

コンソール(コマンドプロンプト)等を開いて、以下のコマンドを実行。

#仮想環境の/Vagrantディレクトリと同期されるホスト側フォルダを作成して移動
mkdir c:\project
cd c:\project

#仮想環境追加
vagrant box add [title] [virtual machine image url]

#仮想環境にcentosという名前を付け、CentOS6.3 64bitのサーバを作成する場合の例
vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box

#仮想環境の設定ファイルを自動作成
vagrant init centos

#仮想環境を起動!
vagrant up

これで仮想環境が起動します。

ここまで確認したら、

vagrant halt

で、一旦仮想環境を停止しておきます。

Vagrantfileのせってー

先ほどvagrant upを実行したフォルダにはVagrantfileが出来上がっています。

仮想マシンの動作環境などを事細かく記載する設定ファイルですが、ここでIPを指定して起動するよう変更しておきます。

#下記行のコメントを外す
config.vm.network :private_network, ip: "192.168.33.10"

まずはChefによる連携等を行うだけであれば、これだけの設定でOKでしょう。

コマンドプロンプトからvagrant upで再度、仮想環境を起動します。

Chefの厨房さくせい

Chefの世界ではリポジトリとかキッチンとか呼ばれるものを作成します。

コマンドプロンプトで、作成したprojectフォルダに移動し、knife soloを実行します。

knife solo prepare vagrant@192.168.33.10

パスワードを求められればvagrantでOKです。

Cygwinを入れてる環境では以下のようなエラーが発生するかもしれません。

Bootstrapping Chef...
ERROR: ArgumentError: non-absolute home (ArgumentError)

その場合は、下記のようにHOMEを空にするとうまく行くと思います。
たんめん日記さんの記事を参考にしました。

set HOME=

キッチンできたし、レシピ作るよー

projectフォルダ内にて狂ったようにナイフを振るいます。

なぜ、キッチンでナイフを振り回したらレシピが作られるのか、風景を想像するとかなり謎ですが細かいことは気にせずコマンドを打つべし。

#cookbooksフォルダにcookbookを作成
knife cookbook create myrecipe -o cookbooks

これでc:\project\chef-repo\cookbooks\myrecipe\recipes\default.rbというレシピファイルができるはずです。

このファイルに、Chefに実行させたい内容を書いていく事になります。

レシピ書くぜー

出来上がった上記レシピに実際に処理を書いてみます。

いきなりですが、httpサーバをインストールさせたいと思います。

下記の内容をc:\project\chef-repo\cookbooks\myrecipe\recipes\default.rbに追記します。

package "httpd" do
    action :install
end

Chefにレシピ読まそう!

このままでは、まだChefは作ったレシピを読めません。nodeのjsonファイルとVagrantfileを変更して、Chefがmyrecipeを読み込むよう設定します。

まずはVagrantfile。

config.vm.provision :chef_solo do |chef|
#   cookbookのありか。Vagrantfileからの相対パス
    chef.cookbooks_path = "./chef-repo/cookbooks"

# 使用するrecipeの名前
    chef.add_recipe "myrecipe"
end

次にc:\project\chef-repo\nodes\192.168.33.10.jsonを編集。

{"run_list":[" recipe [ myrecipe ]"]}

さぁ、料理の時間ですよ!

ここまでくれば、あとは仮想環境を再起動してやればChefがレシピに従って、httpdをインストールしてくれます。

#仮想環境の停止
vagrant halt
#仮想環境の起動
vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /tmp/vagrant-chef-1/chef-solo-1/cookbooks
[default] Running provisioner: chef_solo...
Generating chef JSON and uploading...
Running chef-solo...
[2013-06-08T17:20:06+00:00] INFO: *** Chef 11.4.4 ***
[2013-06-08T17:20:06+00:00] INFO: Setting the run_list to ["recipe[myrecipe]"] from JSON
[2013-06-08T17:20:06+00:00] INFO: Run List is [recipe[myrecipe]]
[2013-06-08T17:20:06+00:00] INFO: Run List expands to [myrecipe]
[2013-06-08T17:20:06+00:00] INFO: Starting Chef Run for localhost
[2013-06-08T17:20:06+00:00] INFO: Running start handlers
[2013-06-08T17:20:06+00:00] INFO: Start handlers complete.
[2013-06-08T17:20:06+00:00] INFO: Processing package[httpd] action install (myrecipe::default line 9)
[2013-06-08T17:20:26+00:00] INFO: package[httpd] installing httpd-2.2.15-28.el6.centos from updates  repository
[2013-06-08T17:20:36+00:00] INFO: Chef Run complete in 29.548068181 seconds
[2013-06-08T17:20:36+00:00] INFO: Running report handlers
[2013-06-08T17:20:36+00:00] INFO: Report handlers complete

めでたく、自動でhttpサーバがインストールされました!

レシピはインストールだけでなく、サービス登録やファイル、ディレクトリの作成はもちろん、configファイルの自動設定なども盛り込むことができます。

気が向いたらそれらも記事にします。

参考文献
入門Chef Solo – Infrastructure as Code

Windows7上で Vagrant + Chef solo + knife-soloを使い、Ubuntu + ubuntu-desktopの環境を構築してみた

カテゴリー
cakephp2

Cakephp2 DBの変更がmodelに反映されない

データベーステーブルの構造を変更(カラムの追加や変更など)したのに、追加したカラムに対して$result[‘Model’][‘field_added’]とかでアクセスしたら怒られました。

本番環境でのみ発生するので最初悩みましたが...。

Debugモードが0の場合、Cakephpではモデルのキャッシュが結構長い時間有効になっているようで、モデルにテーブルの変更内容が反映されないことが原因でした。

で、ググって見つけたサイトがCakePHPでテーブル構造を変更しても反映されないでしたが、単純に/app/tmp/cache/modelsにある問題のテーブルに該当するキャッシュを消しても解決しませんでした。

んでもって、次に消したキャッシュファイルが、
/app/tmp/cache/persistent/myapp_cake_core_method_cache

これで変更が反映されました。

めでたし、めでたし。