2011年 4月 4日 はてなブックマーク -
タグ: #php
階層的なファイルを探索
glob(‘pear/*/DB/*’) のようにして、階層的にファイルを探索することが出来る

第二引数を活用
第二引数は個人的に使ったことなかったのですが、これはかなり便利そう
glob(“*.gif”, 第二引数);

GLOB_MARK: 返ってきたディレクトリの最後に / を付ける
GLOB_NOSORT: ソートを行わない
GLOB_NOCHECK: 検索パターンにマッチするファイルが見つからない場合は検索パターン自身を返す
GLOB_NOESCAPE: メタ文字のquoteを行わない
GLOB_BRACE - {a,b,c} を展開し、a, b, c のいずれかにマッチさせる
GLOB_ONLYDIR - ディレクトリのみを返す
GLOB_ERR - ディレクトリの読み込みエラー時に停止。デフォルトは無視

glob(‘img/{*.jpg,*.gif}’, GLOB_BRACE) でjpgもgifも一括GET

glob(‘html/*’, GLOB_ONLYDIR) でディレクトリのみをGET

という感じで複数のファイルに対して一括で何らかの処理を行う場合には絶対に使うであろうこの関数。

PHPでバッチ処理する際に便利なglob使いこなしテクニック:phpspot開発日誌

パターンマッチで該当したファイル名を配列で取得出来るglobを覚えておくと便利です。


1年前 | | 2011年 4月 4日 | このエントリーを含むはてなブックマーク
2011年 3月 25日 はてなブックマーク -
タグ: #php

phpdcd

どこからもコールされていないメソッドなどを検出してくれます。ファクタリング対象として確認に役立ちます。

$ phpdcd /path/to/project
phpdcd 0.9.2 by Sebastian Bergmann.

  - Foo::execute()
    declared in Foo.php:42

  - Bar::getActionName()
    declared in Bar.php:27

  - Hoge::execute()
    declared in Hoge.php:34

ウノウラボ by Zynga Japan: PHPで利用出来るテストと開発に便利なツール

テストや普段の開発に便利なツール


1年前 | | 2011年 3月 25日 | このエントリーを含むはてなブックマーク
2011年 3月 25日 はてなブックマーク -
タグ: #php

phpmd

if文のネスト階層数などの複雑さ、短すぎる、または長すぎる変数名や、使われていない変数の検出など様々な条件に応じて検出を行ってくれます。

$ phpmd /path/to/project text codesize,unusedcode,naming

/path/to/project/hoge/huga/AAA.php:76   Avoid unused local variables such as '$foo'.
/path/to/project/hoge/huga/AAA.php:129  Avoid unused local variables such as '$bar'.
/path/to/project/hoge/huga/AAA.php:185  Avoid unused local variables such as '$foo'.
/path/to/project/hoge/huga/BBB.class.php:29    Too many fields
/path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $a
/path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $b
/path/to/project/hoge/huga/foo/EEE.php:5     The method create() has a Cyclomatic Complexity of 12.
/path/to/project/hoge/huga/foo/EEE.php:5     The method create() has an NPath complexity of 288.
/path/to/project/hoge/huga/foo/FFF.php:10     Avoid unused local variables such as '$type'.
/path/to/project/hoge/huga/foo/GGG.php:7    Avoid unused private fields such as '$object'.
/path/to/project/hoge/huga/bar/HHH.php:64  Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/HHH.php:74  Avoid unused private methods such as 'setStatus'.
/path/to/project/hoge/huga/bar/JJJ.php:26    Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/KKK.php:3    This class has too many methods, consider refactoring it.
/path/to/project/hoge/huga/bar/KKK.php:13   Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/LLL.php:44    Avoid unused parameters such as '$status'.

ウノウラボ by Zynga Japan: PHPで利用出来るテストと開発に便利なツール

テストや普段の開発に便利なツール


1年前 | | 2011年 3月 25日 | このエントリーを含むはてなブックマーク
2011年 2月 7日 はてなブックマーク -
タグ: #PHP #cURL #pecl_http

環境:

$ \php -v
PHP 5.3.2-1ubuntu4 with Suhosin-Patch (cli) (built: Apr  9 2010 08:23:39) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
$ pear list | grep Net_Socket
Net_Socket              1.0.9    stable
$ pear list -a | grep HTTP
HTTP_Client             1.2.1    stable
HTTP_Request            1.4.4    stable
HTTP_Request2           0.5.2    alpha
$ pear list -a | grep ZF
INSTALLED PACKAGES, CHANNEL PEAR.ZFCAMPUS.ORG:
ZF      1.10.5  stable
$ pecl list | grep http
pecl_http  1.6.6   stable

某テンプレートエンジンの各HTTPクライアントで100リクエスト投げた時のベンチマーク - 例えば、PHPを使う

以下手法で100回ループのベンチマークをした結果、cURLとpecl_httpのものが最速でした。
詳細なコードや環境情報はリンク先を参照して下さい。
・file_get_contents
・pear/HTTP_Request
・pear/HTTP_Request2
・ZendFrameworkのZend_Http_Client
・CURL(sudo apt-get php5-curlしたやつ)
・pecl_http
・pecl_http
・lithium0.9.5


1年前 | | 2011年 2月 7日 | このエントリーを含むはてなブックマーク
2011年 1月 11日 はてなブックマーク -
タグ: #PHP #PHP-Extension

今日は私が学んできたPHP Extension作成についてのノウハウの一部を 公開しようと思います。

PHPExtension作成についての資料はklabさんやyoyaさん rskyさんの記事が参考になりますが私のようにPHPは書けてもCが書けない人には具体的にhello world以降何をすればいいのかがサッパリよく分かりません。

そこで先人達が作ってくれた偉大なライブラリをPHPで扱えるようにする為にC/MigemoのPHPバインディングを作ってみましょう

C/Migemoをインストールしてみる

読者の方の中にはC/Migemoをご存知でない方もいらっしゃるかと思いますので簡単に説明するとC/MigemoはKoRoNさんが作成されているローマ字のまま日本語を(インクリメンタルに)検索する」ための正規表現を生成するライブラリです。

http://www.kaoriya.net/#CMIGEMO

私は普段Ubuntuで開発をしているのでUbuntuでのC/Migemoの導入方法の説明を書きます。 OSXやWindowsの方はC/MigemoのREADMEを読みつつコンパイルしてください。

ウノウラボ by Zynga Japan: 30分でわかる PHP Extensionの作り方を学べる記事をかいたよー \(^o^)/

PHP Extensionの作り方です


1年前 | | 2011年 1月 11日 | このエントリーを含むはてなブックマーク
2011年 1月 10日 はてなブックマーク -

WEBファイルマネージャーを試してみた : AjaXplorer : PHP Navigator - rapidlymage

■AjaXplorer
AjaXplorerはエクスプローラー風Webファイルマネージャー。RelayはDBが必要だが、こちらはPHPが利用できるサーバーならインストールが可能だ。

画面構成はいたってシンプル。画面上部にコントロールツール、画面左にツリー、画面右がファイル一覧となっている。ファイル一覧でファイルを選択すると画面左下にファイルの情報が表示される。

1年前 | | 2011年 1月 10日 | このエントリーを含むはてなブックマーク
2010年 12月 27日 はてなブックマーク -

LinuxでPHPをインストールすると、後からDBをmysqlからpostgres

に変更することになって困ったことはりませんか?

※Linuxのみで、Windowsでは関係ありません。

その場合のモジュール追加方法をPostgreを例に説明いたします。

1.PHPソースファイルにあるextensionフォルダに移動します。

# cd /usr/local/src/php/php-5.2.1/ext/pgsql


2.phpizeを実行し、configureファイルを作成します。

# phpize


3.configureを実行

# ./configure —with-pgsql


4.makeを実行

# make


5.インストール

# su

# make install

これで pgsql.soファイルが作成されました。

作成された場所は

/usr/local/lib/php/extensions/no-debug-non-zts-20060613

にあります。

※環境によってフォルダ名が変わります。


6.私の場合は、 PDOを使っていたので同様に pdo_pgsqlについても実行しました。

# cd /usr/local/src/php/php-5.2.1/ext/pgsql

# phpize

# configure —with-pdo-pgsql

# make

# su

# make install


7.次にphp.iniファイルを編集します。

 ; extensionsの置かれている場所
extension_dir = /usr/local/lib/php/extensions/no-debug-non-zts-20060613
 ; 利用するextension
extension = pgsql.so

extension = pdo_pgsql.so


8.apacheを再起動してください。

PHPインストール後のPostgresモジュールインストール方法(Linux)|IT資料館(覚え書き)

checking for pg_config… not found
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
もし上記のエラーとなる場合には、「locate libpq-fe.h」の結果に出たパスの最下位のディレクトリを以下のように指定してあげると、動きます。
./configure —with-pgsql=/usr/local/some-app/postgres/


1年前 | | 2010年 12月 27日 | このエントリーを含むはてなブックマーク
2010年 12月 13日 はてなブックマーク -
タグ: #PHP #Linux #ionotify

前回の「inotifyを使ってファイルやディレクトリに起きたイベントを簡単に監視する 」にてinotifyの機能を使ってみましたが、PHPのプログラムからも利用できるようなので、試しにログを監視するスクリプトを作ってみました。


inotifyの機能を使って独自のPHPスクリプトを書けば、何かのファイルを監視したり、ディレクトリにおきた変化をトリガーにして何か処理をするというようなスクリプトも簡単に書くことができます。

[PHP] inotify関数を使ってログを監視するスクリプトを作ろう|A Day In The Boy’s Life

PECLのionotifyを入れれば、ファイル変更を検知してメールを送るプログラムが結構簡単に出来そうです。


1年前 | | 2010年 12月 13日 | このエントリーを含むはてなブックマーク
2010年 12月 6日 はてなブックマーク -
タグ: #PHP
hp
eval("echo 'hello';");  #=> hello
eval("<?php echo 'hello' ?>")  #=> Syntax error...

通常evalの中では<?php 〜 ?>で囲まれた状態になっています。evalに渡す文字列の中に<?phpとかを使うとエラーになってしまいます。HTML文字列を渡してその中に含まれるPHPを展開したいということを行いたいのですが、evalに渡すだけではだめ・・・だと思っていたらやる方法があるみたいです。

<?php
$html = <<<EOS
<div id="content">
  <?php echo \$email ?>
</div>
EOS;

$fail = false;

ob_start();

// PHP終了タグに続けてコードを渡す
if (eval('?>'.$html) === false) {
  $fail = true;
}

$evaluatedHtml = ob_get_clean();

if ($fail) {
  throw new RuntimeException(sprintf("Evaluation failed: %s", $evaluatedHtml));
}

eval(‘?>’.$code)とやるとHTMLモードで展開が行われるみたいです。ちょっと感動した。

PHPのeval関数のウルテク - ゆっくり*ゆっくり

面白い技です。


1年前 | | 2010年 12月 6日 | このエントリーを含むはてなブックマーク
2010年 11月 26日 はてなブックマーク -
タグ: #PHP

blog.plastik.jp » PHP5 の fgetcsv() で読み込み内容が腐る現象」という記事を読みました。fgetcsv()だとSJISCSVファイルがうまく読めないので、UTF-8に直してテンポラリファイルに保存してfgetcsvで読み込む、という筋書きのようです。


ちゃんとtmpfile()を使っていたりしてナイスなコードだと思います。でも、すぐ不要になるデータをディスクに書き込むのはイマイチじゃないでしょうか。ここはメモリに書いた方がカッコいいと思うんです。僕なら下記のようにします。


<?php

$data = file_get_contents("example.csv");
$data = mb_convert_encoding($data, "UTF-8", "Shift_JIS");
$fp = fopen('php://memory', 'r+');
fwrite($fp, $data);
rewind($fp); // 先ほど書き込んだデータを読み込みます。
$current_locale = setlocale(LC_ALL, '0'); // 現在のロケールを取得
setlocale(LC_ALL, 'ja_JP.UTF-8');
while ($values = fgetcsv($fp, 10000)) {
  print_r($values);
}
setlocale(LC_ALL, $current_locale); // ロケールを戻す
fclose($fp);

php://memoryというのが、メモリ上に作れるファイルのようなものです。詳しくは「PHP: PHP 入出力ストリーム - Manual」を参照してください。


PHPストリームというのは、ファイルのみならず、シーケンシャルに読み書き可能なリソースURL、標準入出力、ソケットなど)を統一的に扱うための概念です。PHP4.3.0から存在するのですが、あまり使っている人を見ない機能ですね。


php://tempだとサイズが一定以上のときだけディスクに書くらしいので、こっちの方がカッコいいかもしれません。上の例はメモリ消費量が気にならない状況を仮定していると考えてください。


php://memoryはPHP5.1.0から使える、とマニュアルには書いてありますが、僕が確認した範囲ではPHP 5.1.4から正常に動作するようです。

PHPでメモリ上に一時ファイルを作る - hnwの日記

1年前 | | 2010年 11月 26日 | このエントリーを含むはてなブックマーク
2010年 11月 16日 はてなブックマーク -
タグ: #PHP #Windows

今回はPHPをwindowsのサービスとして動作させるwin32serviceを試してみました。

準備した環境

  • Windows 7 Professional(32bit)
  • PHP 5.3.3
  • win32service 0.1.0-dev

インストール

PHPは「VC9 x86 Non Thread Safe」を利用しました。
http://windows.php.net/download/
どこに配置してもいいと思うのですが、
便宜上

C:\PHP\5.3.3

にインストールしたことにします。
もちろんPATHもとおします。

win32serviceについては、別途こちらからダウンロードが必要です。
http://downloads.php.net/pierre/
今回は「php_win32service-svn20091206-5.3-nts-vc9-x86.zip」を利用しました。
先ほどPHPをインストールした配下、

C:\PHP\5.3.3\ext

にdllをコピーしましょう。

ウノウラボ Unoh Labs: PHPでwin32serviceを使ってみる

1年前 | | 2010年 11月 16日 | このエントリーを含むはてなブックマーク
2010年 11月 15日 はてなブックマーク -
タグ: #PHP

// **********************************************************
// 接続
// **********************************************************
$Cn = new PDO(
“odbc:Driver=$strDriver;Server=$strTarget;” .
“Database=$strDB;Uid=$strUser;Pwd=$strPass;”);

// デフォルトエラーモード
$Cn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );

// 存在しない列を更新
$Query = “update [社員マスタ] set [生年月] = ‘2005/01/01’”;
$Query .= ” where [社員コード] = ‘0001’”;
$ret = $Cn->exec( $Query );
if ($ret===false) {
print_r( $Cn->errorInfo() );
}


// エラー表示( デバッグに有効 )
// 抑制する場合は、@$Cn->exec( $Query );
$Cn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

// 存在しない列を更新
$Query = “update [社員マスタ] set [生年月] = ‘2005/01/01’”;
$Query .= ” where [社員コード] = ‘0001’”;
$ret = $Cn->exec( $Query );
if ($ret===false) {
print_r( $Cn->errorInfo() );
}

// try catch 用
$Cn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// 存在しない列を更新
$Query = “update [社員マスタ] set [生年月] = ‘2005/01/01’”;
$Query .= ” where [社員コード] = ‘0001’”;
try {
$ret = $Cn->exec( $Query );
}
catch( PDOException $e ) {
print $e->getMessage();
}

$Cn = null;

PHP : PDO のエラー処理

PDO エラー処理には3通りあります。

最初はその名の通り、エラーが起きてもなにも起こりません。
そのまま実行されますが、エラー情報は設定されていますし、戻り値も正しく返ります。
一番簡単でバグさえなければ問題は発生しにくいですが、
複雑な問題を確認する為には戻り値とメッセージを常に確認して正しい
エラー処理を行う必要があります

二つ目は、さらにPHPの通常のエラーメッセージを出力させるようにした
バージョンです。初期段階のデバッグに有効です

三つ目は、try 〜 catch を使うようにしたものですが、慣れていないと
扱いは少し難しくなります。しかし、例外によりスクリプトが終了した際
には、トランザクションは自動的に ロールバックされるそうです。


1年前 | | 2010年 11月 15日 | このエントリーを含むはてなブックマーク
2010年 11月 9日 はてなブックマーク -
タグ: #PHP #jQuery
Snippet jQuery Syntax Highlighter

多数の言語に対応して色合いも選べるシンタックスハイライト用jQueryプラグイン。
メジャーな以下の15の言語は標準サポートしていて、他にも多数のフォーマットに対応できます。
このプラグインのユニークなところは、39のカラースキームから選べるという部分。



実に多数の色合いから好きなものを選べるので、様々なタイプのデザインのマッチさせることが出来るでしょう。



実装は必要なライブラリを読み込んで、$(element).snippet(“pascal”) といった感じでハイライト言語を引数で渡してあげるだけです。
実装もかなり簡単です。

.snippet(“php”,{style:”navy”,showNum:false});

styleで色合いを簡単に指定。行番号のあり・なしも指定可能です。
技術系のサイトを運営している人は覚えておくとよさそうですね。

関連エントリ

多数の言語に対応して色合いも選べるシンタックスハイライト用jQueryプラグイン:phpspot開発日誌

1年前 | | 2010年 11月 9日 | このエントリーを含むはてなブックマーク
2010年 11月 2日 はてなブックマーク -
タグ: #PHP #PDO
’); if ($dbh == null){ print(‘接続に失敗しました。
’); }else{ print(‘接続に成功しました。
’); } $dbh->query(‘SET NAMES sjis’); print(‘追加前のデータ一覧:
’); $sql = ‘select id, name from shouhin’; $stmt = $dbh->prepare($sql); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ print($result[‘id’]); print($result[‘name’].’
’); } $sql = ‘insert into shouhin (id, name) values (?, ?)’; $stmt = $dbh->prepare($sql); $flag = $stmt->execute(array(6, ‘扇風機’)); if ($flag){ print(‘データの追加に成功しました
’); }else{ print(‘データの追加に失敗しました
’); } print(‘追加後のデータ一覧:
’); $sql = ‘select id, name from shouhin’; $stmt = $dbh->prepare($sql); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ print($result[‘id’]); print($result[‘name’].’
’); } }catch (PDOException $e){ print(‘Error:’.$e->getMessage()); die(); } $dbh = null; ?>

データの追加(INSERT) - PDOの利用 - PHP入門

PDOの最小限のサンプル


1年前 | | 2010年 11月 2日 | このエントリーを含むはてなブックマーク