肉とご飯と甘いもの @ sotarok

2010/07/17

モダンなPHPの開発環境の構築方法

誰か書くんじゃないかと思いつつ、まあ、お決まりのパターンとしてPHP版も書いてみよう。

PHPのこと見てると、書き方とか取り巻く環境ってあんま変わってないなーとか思いつつ、そして何がモダンなんだっけ?新しければいいのか?って話だけど。

一般的な OSX 環境および Linux 環境における、モダンPHP 開発環境の構築方法についてまとめてみた。最新のPHPxdebugがあれば十分。

PHP 5.3.2 のインストール

ソースから入れてた時期もあるけどやっぱパッケージが楽だな。。オフィシャルじゃないリポジトリを使えばパッケージで入れられる。

pearpeclは、パッケージ入れるときに一緒に入れちゃう。

pearpecl そのものは、PHPよりも頻繁にバージョンアップされるし、パッケージになってたりなってなかったりの管理が面倒だから基本的にpear/peclコマンドで。

Mac OS X

Snow LeopardならデフォルトPHP 5.3.1入ってる。が、Mac Portsから入れるのがいいならPortsから入れる(Perl は脱Portsの流れなの?)。最近はvariantsで入れるのではなくモジュールごとにパッケージが分けられるようになった。ばんざーい。でもpearコマンドやらpeclコマンドのために +pear は必要っていうね...

% sudo port install php5 +pear
% sudo port install php5-mbstring

ports で入れたPHPを使うには、パスの調整が必要(以下は、OpenSolaris(!)、Mac(ports), Linux全般対応版)。

PATH=$HOME/bin:/usr/gnu/bin:/opt/local/bin:/usr/local/bin:$PATH:/sbin:/usr/sbin
Debian

dotdeb から PHP 5.3 むけのaptパッケージを入れる。

% sudo vim /etc/apt/sources.list

#末尾に以下の2行を追加
deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all

% sudo apt-get update
% sudo apt-get install php5 php5-dev php-pear php5-mbstring

update の時点で、以下のようなエラーが出る場合があるが、

W: GPG error: http://php53.dotdeb.org stable Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY E9C74FEEA2098A6E
W: これらの問題を解決するためには apt-get update を実行する必要があるかもしれません

その場合は、以下のように対応(参考 Dotdeb » Blog Archive » Dotdeb packages are now signed!)

% gpg --keyserver keys.gnupg.net --recv-key 89DF5277
% gpg -a --export 89DF5277 | sudo apt-key add -
CentOS

epelとremiを使えばyumで入る。remiはデフォルトでenabledにならないので、enabledにする。

% sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
% sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
% sudo vim /etc/yum.repos.d/remi.repo

### [remi] セクションで 0 を 1 に
enabled=1

% sudo yum install php php-devel php-pear php-mbstring

xdebug

開発環境なら当然xdebugは入れる。

% sudo pecl install xdebug

最後にiniに extension=xdebug.so って書け、と出てくるが、正しくは zend_extension。php.ini には書かないで、Config File Scan Dirxdebug.ini ってファイルを作成して、そこに書く。

に、

zend_extension=/path/to/xdebug.so

を記述。zend_extensionには絶対パスを書かなければいけないので、分からない場合は pear config-show の ext_dir を参考にすること。

deploy の手法

pearディレクトリをまるごとrsyncでもいいな。peclは、アーキテクチャによって違うから個別にインストールしたほうが良い。

xdebug

xdebugはdeploy環境にいれるなよ!

APC

開発環境には xdebug 必須だけど、本番環境にはやっぱAPCでしょ。PHP 5.3対応版はbeta

% pecl install apc-beta

メモリなどの設定は、pear の doc_dir の doc/APC/INSTALL を参考。以下はdebianの場合のファイルの場合。

% sudo vim /etc/php5/conf.d/apc.ini

extension=apc.so

apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1

apc の管理画面は、pear の php_dir から apc.php をウェブでアクセス出来る場所にコピーして使う。

複数アプリケーションを開発していて、それぞれの依存モジュールがそれぞれことなる場合の運用

アプリケーション以下に lib/ などとディレクトリを作って、その中に pear コマンドなどでパッケージを入れる+ include_path を調整するのが良い(まあ、だいたいフレームワークがやってるよ)。

アプリケーションの中で include_path を調整するには以下。

<?php

set_include_path('/path/to/lib' . PATH_SEPARATOR . get_include_path());

ちなみにシステムのpearディレクトリじゃなくて任意のディレクトリpearインストールをするには、 .pearrc を作れば良い。kayacさんのブログをご参考のこと。


余談だけど、Ethnaなら pear-local コマンドってやつがあるよ!

異なるバージョンのPHPをまとめて入れる場合

id:hnw 先生による phpall を使って入れる。複数環境でテストを実行したい場合には非常に役に立つ。ただし、インストールには時間かかりまくる。

使用するPHPのバージョンの選定

PHP 5.3.2 択一(2010/07/17現在)。

PHP 5.3.0のころから5.3は使っているけど、今はだいぶ安定してるし(nequalのサービスは全部PHP 5.3で動いてるよ)、やっぱ名前空間無名関数使いたい。PHP 5.2.x 使ってた人が移行する場合は、特に注意すべきはE_DEPRECATED。それ以外はわりとすんなりいくとおもう。

PHP 4とか使ってる場合すぐさま今すぐ本当に今すぐとにかく今すぐJust Now、PHP 5にアップグレードするべきですね。

追記

これはこれでイイ!のだが、個人的には開発環境と本番環境は極力バージョンやパッケージも含め完全同一化するほうが後で悩まされなくてすむと思う。ということでいつも仮想化。

はてなブックマーク - Ryuzeeのブックマーク
  • 僕もいつも仮想化(ですが、それはまた別の話)。たぶん仮想化すべき、って話とこのエントリ自体は対立する話じゃなくて、仮想化した中での環境構築方法。本番と開発環境のバージョンは完全同一化すべきですね!モダンならね... 最新のPHP 5.3.2でね... (理想は)。

2010/05/03

MacでRealforce使うときの設定

Realforceには変なマークの謎キーがたくさんついていて,最近までずっとMac上でそれが何と認識されるのかがわからなかったんだけど,KeyRemap4MacBookが6.5になってEventViewerというどのキーが押されたときにどのキーコードが発せられているかを確認するアプリがついたので,色々確認して設定した*1

ついでに,PCKeyboardHackも入れて,for Japanese んとこすべてにチェックを入れておきました.


E/J

左上の謎キー.Windowsだと全角/半角のやつ

バッククオート(`) として認識されているので,for Japanese から EISUU/KANA toggleに設定

f:id:sotarok:20100503005930p:image


KANA

スペースキーの2つ右のキー

Command_Rとして認識されているので(PCKeyboardHack により),for Japanese から単体でおしたときは KANA となるように設定

f:id:sotarok:20100503010139p:image


リサイクルマークみたいなやつ

スペースキーの1つ右のヤツ。

PCKeyboardHackのEnable XFERによってKANAキーになる.


リサイクルマークとバッテン

スペースキーの1つ左のやつ.

PCKeyboardHackのEnable NFERによってEISUUになる


その他

個人的な設定

  • CapsLock:これはMacの機能でCtrlに
  • Windowsキー:Command L。単体押しでEISUUに(KeyRemap4MacBookにより)。
  • alt左:Option L。
  • Home/End:まあほとんど使わないけど一応,for PC User から「Use PC Style Home/End (behave like Commend+Right/Left)。
  • F1〜F5:Brightness +, -, Mute, Volume +, -

Realforce最高です

あとKeyRemap4MacBookもPCKeyboardHackも最高です.いや本当に最高です


ちなみにRealforceテンキーレスな91UBKをベースにしたやつを使っていて,自宅では 91UBK ,会社では 91UDK-G ってやつです(均等荷重FPS用awsd別色キーつきw).どちらも快適ですごいです.特に 91UDK-G のほうは,キー印字が黒なので黒々でかっこよい.

あとあれですね,懸念事項としては,新しいマシンを買うときにいつも英字配列にするかどうか迷うんですけど,自分を取り巻く全ての環境を英字配列にリプレースできないと非常に混乱する気がしていつも日本語配列にしてしまっています,まあ記号の位置はWindows時代のもので慣れてしまっているので.CapsLockはだいたいCtrlにマッピングしているので問題ないしね.


自宅用:REALFORCE91UBK

東プレ NG01B0 REALFORCE91UBK

東プレ NG01B0 REALFORCE91UBK

会社用:Realforce91UDK-G

*1アップグレードはしてたんだけど気づいてなかった

2010/05/01

オープンソースのプロジェクトには時には空気を読まない人も必要(反省文)

どうも,sotarokです.

昨日のいろいろで,ちょっと自分で考え直して,反省すべきことがあったのでブログに書いておきます.

4/28に,PHP本体の開発者ML(PHP Internals)で,名前空間の区切り文字に異を唱える人がいて,いや,さすがに今更過ぎるだろー(名前空間区切り文字に関する)と思い,Twitter で

おい,今更PHP名前空間区切り(バックスラッシュ)に異を唱えてる人がいるぞw 怒り心頭でござるw http://bit.ly/c3BdLq

と発言してしまったのですが*1,これはあとから考えたら,なんかダメだったなーと思うに至りました.

今更であること自体は考え直した今でも今更だと思っていますが,こういう人をばかにしたように晒したり(いやまー晒してやろうってつもりもなかったんですが)しては,オープンソースプロジェクトの開発は育っていかんな,と思いました.自分がもし,勇気を出してプロジェクト本体に意見を表明したときに,「こいつ今更かよばかじゃんw」とかいわれたら,それは今後関わりたくなくなるなあ,と思います.

そういう小さな周囲の態度がそのプロジェクトに関わる人の間口を狭くしてしまうんじゃないかなあとか.

今回は,やはり自分の考えによって見えている世界観に凝り固まった頭の固いリアクションをしてしまったな,と恥ずかしくなりました.

まあ,そういうわけなので,オープンソースの開発ってのはいろんな人が関わって,いろんな人が突然変なことをいったことがきっかけでとてつもない方向に成長できる可能性みたいなものってのもあるんだろうし(とはいえ,ある程度そのプロジェクトでこれまでどのような議論がされて,どのような開発方針で今やっているのか,などは意見を発する前に調べたりするってのも必要かとも思いますが),空気の読まない発言をした人でも,そういう人が,もしかしたら将来そのプロジェクトに大きく貢献する人になるかもしれない可能性があるということを忘れてはいけないな,

と,自分に言い聞かせるためのエントリでした.

いろんな人から意見をもらって,あーでもないこーでもないと議論できるのがオープンソースの良いところだもんねえ.


名前空間区切りがこれで考え直されるなんてことはないとはおもうけど,あったらさすがPHPとしか言えないか

*1:削除済みなんですが

2010/04/10

Gtags.vim の活用を試みる

引き続きvimの設定をいじり中。

GNU Global については,以前machuさんのブログを見て知っていて,gtags.vimも入ってたんだけど,いつもコマンドとか忘れて使えてなかったので,せっかくなので再入門してみることにした。今度は忘れないようにちゃんとキーバインド登録しておこう。

詳しいことは以下参照ってことで。

で,自分も先のブログを参考にしつつ,加えてちょっと設定した。

" gtags
    " 検索結果Windowを閉じる
    nnoremap <C-q> <C-w><C-w><C-w>q
    " Grep 準備
    nnoremap <C-g> :Gtags -g
    " このファイルの関数一覧                                                                                                                                                
    nnoremap <C-l> :Gtags -f %<CR>
    " カーソル以下の定義元を探す
    nnoremap <C-j> :Gtags <C-r><C-w><CR>
    " カーソル以下の使用箇所を探す
    nnoremap <C-k> :Gtags -r <C-r><C-w><CR>
    " 次の検索結果
    nnoremap <C-n> :cn<CR>
    " 前の検索結果
    nnoremap <C-p> :cp<CR>

まあこんなかんじで。GtagsCursor は使わなかった。

これで,関数の定義先,使用箇所,一覧にジャンプできるので大満足です。キーの設定使ってみてもうちょいいじるかもだけど。


あと,先のブログのコメントで,

■1 おどんこ (2009-03-10 (火) 16:35) 

ジャンプする前にの位置に戻るがあると完璧なのにぃ〜(┳◇┳) 
■2 おどんこ (2009-03-10 (火) 16:35) 

ジャンプする前にの位置に戻るがあると完璧なのにぃ〜(涙)

と,大事なことなので二回言いましたばりに2回コメントしている方がいたが,実は <C-o> で前の場所に戻れることを知った(逆は <C-i>) ので,今後これを活用していきたいと思う!

まあ,GNU Global が必要であるという環境制限はあるけど,これさえあればIDEなんていらないよねーってことで。


acp.vim で補完候補が表示されてるときにEnter押したら入力されてる途中までの文字列で決定して改行する

なんつーわかりづらいタイトル.

AutoComplPop のときはできてたんだけど,acp.vimのバージョンになってから例えば,

fal

まで入力してて,補完候補に

false
FALSE

みたいに表示されてるとき,ここでEnter押すと,最初の候補が挿入されて改行されてしまうようになってしまっていた。(つまり,false となって改行されていた)

で,ずっとなんでだろって思ってたんだけど,vimrc に以下のような設定を書いてたのが問題だったくさい.

inoremap <expr> <CR> pumvisible() ? "\<C-Y>\<CR>" : "\<CR>"

これは前のAutoComplPopのときに,この問題を解決するために本体に手をいれてこの設定を加えてたんだけど*1,どうやらこの設定ではだめになってたようで。

pumvisible() 関数はポップアップが表示されてるかどうかを判断する関数らしいので(それを知らなかった),まあ挙動がす気になるように修正。

inoremap <expr> <CR> pumvisible() ? "\<C-p>\<CR>" : "\<CR>"

これで,

fal

の状態で Enter を押したときに,

fal

で下の行にカーソルがある感じの挙動になった。

細かいけどこういうのって割と身体に染み付いちゃってるからシビアな設定だよね。



追記:

いや,これじゃだめだった,普通に選択できないwどうすりゃいいんだべ

*1:なんでだっけな, http://subtech.g.hatena.ne.jp/cho45/20071111/1194766579 このへんの見て設定してたのかも

2010/04/06

foreach 中に変更するべき要素を見つけて取っておきたい

単純化すると、配列に入っているオブジェクトを舐めて、

条件を満たすものを取り出してそれを後で変更したい、みたいなコードを書く。

とりだしたもののオブジェクトの状態を変更。

で、大本の配列を回してみたら中身かわってねえ……。

要するにPHPの参照の挙動なんですが、

なんでこんなことに。

PHPの参照が使いにくい件について - 神様なんて信じない僕らのために

foreach で参照とると地雷があったりするので(気づいてらっしゃるっぽいけど),こういう場合は,キーを保存してくのがわりとよくやるやり方かな.

<?php
$hoge_list = array(
    array('Hoge'=>array('value'=>100)),
    array('Hoge'=>array('value'=>101)),
    array('Hoge'=>array('value'=>102)),
    array('Hoge'=>array('value'=>103)),
    array('Hoge'=>array('value'=>104)),
);

echo "----- Before -----\n";

$select_hoge_key = null;
foreach ($hoge_list as $key => $hoge) {
    echo $hoge['Hoge']['value']."\n";
    if ($hoge['Hoge']['value'] == 100) {
        $select_hoge_key = $key; // キーを保存
    }   
}

$hoge_list[$select_hoge_key]['Hoge']['value'] = 999;

echo "----- After -----\n";                                                                                                                                                 

foreach ($hoge_list as $hoge) {
    echo $hoge['Hoge']['value']."\n";
}

PHPはオブジェクト以外基本的に値渡しだし,参照周りは色々ドロドロしてるし,スコープもすごい(w)から,こういう方向のほうが安全かもですね.

あ,望んでいることが違ったらごめんなさいですけど.