vim + Xdebug を使用して remote debug
Xdebug をインストール中にハマって検索を掛けて問題を解決しようとしたら、別の面白そうなことが載ってた。
参考にしたサイト
- PHPをXDebugとVimでデバッグする (Ubuntu 8.10編とCentOS 5.4/4.5編) - 山歩きプログラマー
- XdebugとVimを使ったPHPのリモートデバッグ | 株式会社インターエデュ・ドットコム
- Xdebug + VimでPHPのWebアプリをステップ実行してみた - Lounge Programmers Killer
面白そうなので実装してみるお!
Xdebug
デバッグにvar_dump()を多用してる今日この頃。
Xdebug なるものがどうも便利らしいとの情報。お試しで入れてみる。
Xdebug のインストール pecl コマンドを使うらしい。
pecl ってなんぞ
PECL(ピクル、PHP Extension Community Library)は、PHPで利用できる拡張ライブラリ(パッケージ)を提供しているサービス。
PECLで提供されるライブラリはCで記述されているため、PHPで記述されたPEARのライブラリよりも高速に動作する。PECLにより提供されるライブラリはPHPの拡張モジュールとしてインストールされる。
==== 中略 ===
PECLのインストール用には、PEAR同様に「pecl」コマンドが提供されている。インストール方法もほぼPEARと同じだが、インストール後に設定ファイル(php.ini)の「extension」でインストールしたモジュールを指定する必要がある点が異なる。
参照:wikipedia
fgetcsv と ロケール
お勉強してて、軽くハマったのでメモ
fgetcsv ってなんぞ
要約すると
csv形式のファイルをfgets()みたいに取得するよ!
じゃあ fgets() でいいんじゃね?
fgets() に動作は似ていますが、 fgetcsv() は行を CSV フォーマットのフィールドとして読込み処理を行い、 読み込んだフィールドを含む配列を返すという違いがあります。
配列で返してくれるところがミソと。
ハマり箇所
fgetcsv() でファイルを読み込んで、読み込んだ配列を foreach() で回して表示させると日本語が表示されない。
ソースはこんな感じ
csvファイル読み込み
public function getMessageData() {
$dataFilePath = "./hogehoge.dat";
// ファイルよりCSVデータ取得
$fp = fopen($dataFilePath, 'r');
$data = array();
while ($row = fgetcsv($fp)) {
$data[] = $row;
}
fclose($fp);
return $data;
}
呼び出し
// メッセージデータ取得、表示
$data = getMessageData();
// メッセージデータをもとに表のHTML生成
foreach ($data as $row) {
echo '<tr>';
echo sprintf('<td>%s<td>', $row[0]);
echo sprintf('<td>%s<td>', $row[1]);
echo sprintf('<td>%s<td>', $row[2]);
echo '</tr>';
csvファイル
1,てすと名前,テストめっせじ
実行した結果
1 空白 空白
と、テスト名前とテストめっせじが表示されない。
原因
注意:
この関数はロケール設定を考慮します。
もし LANG が例えば en_US.UTF-8 の場合、 ファイル中の 1 バイトエンコーディングは間違って読み込まれます。
文字コード。おまえか。
対策
// メッセージデータ取得
public function getMessageData() {
setlocale(LC_ALL, 'ja_JP.UTF-8');
// ファイルよりCSVデータ取得
$fp = fopen($this->dataFilePath, 'r');
$data = array();
while ($row = fgetcsv($fp)) {
$data[] = $row;
}
fclose($fp);
return $data;
}こいつを追加したら、無事日本語も表示されました。
setlocale(LC_ALL, 'ja_JP.UTF-8');
地味に、ファイルの文字コードを調べるのがわからない。
nfkコマンドとかでいいのかなーっと。
glob — パターンにマッチするパス名を探す
あるディレクトリ内のファイルを確認したい時、まず思いついたのが
- system()
$list = system("ls -la");システムコマンドを使うのは何かと拙いだろうと。
次に、調べて発見したのが
- opendir() 参照:PHP: opendir - Manual
<?php
$dir = "/etc/php5/";
// 既知のディレクトリをオープンし、その内容を読み込みます。
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
?>一般的には、これが使われてるのかな?使われているのを見た気もする。
opendir() を使えばいいかなと思っていたら
便利な関数があるらしい
参照:PHP: glob - Manual
参照:blog.paz-para.com » Blog Archive » PHPでカレントディレクトリのファイルを取得する
参照:PHPのglob()がすっごい便利だった件 | IDEA*IDEA