PHP

2008年05月24日

phpmybenchをコミット - mybenchをPHPに移植

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

mybench - simple benchmarking tool for MySQL


mybenchはPerlで書かれたMySQLのベンチマークツール。
PHPに移植したのがphpmybench。

CodeReposに登録した。
http://coderepos.org/share/browser/lang/php/phpmybench/trunk

PHPで書かれたプログラムの
テストやベンチマークを取るのに使える。


半袖 at 13:40|PermalinkComments(0)TrackBack(0)

2008年05月23日

PHP(CLI)からPHP(Apache)用に書いたプログラムへパラメタを渡す

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

ラッパーを書いてる人が居た


変数展開が上手く行かないと言う。

  • CLIからApacheモジュール用変数で代入したい
  • パラメタはコマンドラインから引数で指定
$ command.php "\$_REQUEST[param] = 'value'" "\$_SERVERT[param] = 'host'"

何だかゴチャゴチャした
パっと見、長めのコードになっていた。



小さな物を書いて見る


どうも難しい事をやってる様には思えなかった。
試しに書いて実行結果を見せてみた。

該当部分だけ抜粋。
array_shift($argv);
foreach ($argv as $param) {
    eval("$param;");
}
要求を満たしていた様だ。
悩む時間が長い時ほど、意外とあっさり解決する。


半袖 at 02:30|PermalinkComments(0)TrackBack(0)

2008年05月21日

PHP。getoptでハマッタ。

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

CLI版


Webアプリケーションを作っている訳ではない。
関わってるプロジェクトの開発言語がPHPなのでPHPで書いてる。

コマンドラインでオプションを指定するにはgetopt関数。

$ cat > getopt.php
#!/usr/bin/env php
<?php

$opt_map = getopt("a:b:c:d:e");
var_dump($opt_map);
^D
$ chmod +x ./getopt.php
$ php -l ./getopt.php
問題ないので実行。
$ ./getopt.php -a1 -b2 -c3 -d4 -e5
array(5) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  string(1) "2"
  ["c"]=>
  string(1) "3"
  ["d"]=>
  string(1) "4"
  ["e"]=>
  bool(false)
}
eに何も入ってない…
getoptの引数、eの後にコロンが無い!
< $opt_map = getopt("a:b:c:d:e");
> $opt_map = getopt("a:b:c:d:e:");
再度実行
$ ./getopt.php -a1 -b2 -c3 -d4 -e5
array(5) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  string(1) "2"
  ["c"]=>
  string(1) "3"
  ["d"]=>
  string(1) "4"
  ["e"]=>
  string(1) "5"
}
成功した。



まとめ


  • 勝手な思い込みで「:」がデリミタだと思ってた
  • 「半角英数 + :」で初めて意味がある。
  • しっかりマニュアルを読め


半袖 at 22:35|PermalinkComments(0)TrackBack(0)

2007年02月05日

CakePHP HTMLヘルパーのformTag使い方メモ

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

formTagの使い方を探したけど欲しい情報を得られなかった。
ソースを読んで解決。


■関数
function formTag($target = null, $type = 'post', $htmlAttributes = array())

■概要
form要素を生成する
<form action="$target" method="$type" htmlAttributes...>

■引数
▼target
・action属性の属性値に指定するURI
▼type
・formのmethodタイプ
・defaultはpost
▼htmlAttributes
・form要素に付与したい属性値
・例: array('id' => 'register')


無事にid属性を指定出来た。


半袖 at 13:05|PermalinkComments(0)TrackBack(0)

2007年01月25日

CakePHPでbehaviourヘルパーを使っていて困った

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

DOMでinput要素を動的に追加したらonblurが効いてくれない。


<form id="register">
<table>
<tr><td>foo</td><td><input type="text" id="foo" /></td></tr>
<tr><td>bar</td><td><input type="text" id="bar" /></td></tr>
</table>
</form>

<?php $behaviour->addAjaxRule('#update-table input', 'onblur', $options); >


1. script要素で/js/behaviourRules.phpを読み込まれる
2. /js/behaviourRules.phpでForm.serialize('register')が評価される
3. DOMでinput要素を追加

input要素を動的追加してもserializeしたデータには含まれていな
いのでonblurが効かない。input要素を追加したら、その都度
behaviourRules.phpを読み直してやるしかないか。


半袖 at 14:20|PermalinkComments(0)TrackBack(0)

2007年01月23日

CakePHPのbehaviourjsヘルパーでハメられたので解決策をメモしておく

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

BehaviourJS Helper

検証環境ではヘルパーが動いているようで動いてないと言う何とも
やり切れない状態が続いた。ソースを追いかけて問題箇所を発見。


▼問題箇所
$(apps)/webroot/js/behaviourRules.phpで指定しているPATH_TO_TEMP。
こいつが指定しているディレクトリへの書き込みが失敗し、
behaviourへコード変換されず何も動作しなかった。

▼解決例

- define('PATH_TO_TEMP', '../../tmp/behaviourTmp.js');
+ define('PATH_TO_TEMP', '../../cake/tmp/behaviourTmp.js');

これで解決した。

▼解決策
・パスを変更
・Behaviourヘルパーのデフォルトのディレクトリに対してapacheへ
 書き込み許可を出す

どちらかが必要。


ヘルパーをインストールしてもすぐ使えなかったのは、自分のCakePHP
開発環境の設定が変なのかもしれない。ソースを追いかけたおかげで
Behaviourヘルパーの動作を把握した。


半袖 at 20:40|PermalinkComments(0)TrackBack(0)

2007年01月15日

CakePHPのコントローラで複数のモデルを使用する

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

7.3 コントローラの変数より


▼$uses

コントローラは複数のモデルを使用するでしょうか。

例えば、 FragglesController は自動的に $this->Fraggle を
読み込みますが、 $this->Smurf も同じようにアクセスしたい
場合には、コントローラに次のように書いてください:

 var $uses = array('Fraggle','Smurf');

これまで自動的に使用できていた Fraggle モデルを $uses 配列に
含める必要があることに注意してください。


なるほど。こうするのか。


半袖 at 16:55|PermalinkComments(0)TrackBack(0)

2007年01月09日

PHPで終了コード・標準出力・標準エラー出力を扱う

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

exec, systemなでは標準出力と標準エラー出力を別々に扱ってくれない。
proc_openを使ってやると解決する。



▼コード

#!/usr/bin/php -q
<?php
function execWrap($command = "") {
$fd = array(
1 => array("pipe","w"),
2 => array("pipe","w"),
);
$stdout = array();
$stderr = array();
$code = null;
$process =proc_open($command, $fd, $pipes);

/* stdout */
while(!feof($pipes[1])) {
array_push($stdout, fgets($pipes[1]));
}
fclose($pipes[1]);
/* stderr */
while(!feof($pipes[2])) {
array_push($stderr, fgets($pipes[2]));
}
fclose($pipes[2]);
/* exit status code */
$code = proc_close($process);

return array('code' => $code, 'stdout' => $stdout, 'stderr' => $stderr);
}

print_r(execWrap("date"));
print_r(execWrap("date >&2"));
?>


▼実行結果

$ ./fd-test.php
Array
(
[code] => 0
[stdout] => Array
(
[0] => 2007年 1月 9日 火曜日 13:06:34 JST

[1] =>
)

[stderr] => Array
(
[0] =>
)

)
Array
(
[code] => 0
[stdout] => Array
(
[0] =>
)

[stderr] => Array
(
[0] => 2007年 1月 9日 火曜日 13:06:34 JST

[1] =>
)

)



無事、別々に取得出来た。


半袖 at 13:10|PermalinkComments(0)TrackBack(0)

2007年01月06日

Rails風のPHPフレームワーク『CakePHP』を触ってみた

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

CakePHP

1. tarballをダウンロードし、DocumentRoot以下で伸張する
2. 伸張先を仮にこれを $DocumentRoot/cake/ とする
3. apacheのconfigをいじり、.htaccessを使用可能にする
4. app/config/database.php.defaultを元にapp/config/database.phpを生成
5. app/config/database.phpのDB周りの設定を追加する
6. app/config/database.phpに追記したデータベース名でDBを生成
7. app/config/sql/db_acl.sql, app/config/sql/sessions.sql をDBに反映させる
8. apacheがapp/tmp/に書込出来るようにディレクトリ属性を変更する
9. http://${servername}/cake/にアクセスし、Fatalエラー出力されているパスとコードに従いファイルを生成して行く。

確かにRails風。
CakePHPで面白いなと思ったのは必要とされるファイルと、書かれ
るべきコードのサンプルコードが表示される所。tarballを伸張す
るだけで配布出来ると言う点がお手軽な所。


半袖 at 16:05|PermalinkComments(0)TrackBack(0)