PHP
2008年05月24日
mybench - simple benchmarking tool for MySQL
mybenchはPerlで書かれたMySQLのベンチマークツール。
PHPに移植したのがphpmybench。
CodeReposに登録した。
→http://coderepos.org/share/browser/lang/php/phpmybench/trunk
PHPで書かれたプログラムの
テストやベンチマークを取るのに使える。
2008年05月23日
ラッパーを書いてる人が居た
変数展開が上手く行かないと言う。
- CLIからApacheモジュール用変数で代入したい
- パラメタはコマンドラインから引数で指定
$ command.php "\$_REQUEST[param] = 'value'" "\$_SERVERT[param] = 'host'"
何だかゴチャゴチャした
パっと見、長めのコードになっていた。
小さな物を書いて見る
どうも難しい事をやってる様には思えなかった。
試しに書いて実行結果を見せてみた。
該当部分だけ抜粋。
array_shift($argv);
foreach ($argv as $param) {
eval("$param;");
}
要求を満たしていた様だ。悩む時間が長い時ほど、意外とあっさり解決する。
2008年05月21日
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"
}
成功した。まとめ
- 勝手な思い込みで「:」がデリミタだと思ってた
- 「半角英数 + :」で初めて意味がある。
- しっかりマニュアルを読め
2007年02月05日
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属性を指定出来た。
ソースを読んで解決。
■関数
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属性を指定出来た。
2007年01月25日
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を読み直してやるしかないか。
<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を読み直してやるしかないか。
2007年01月23日
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ヘルパーの動作を把握した。
検証環境ではヘルパーが動いているようで動いてないと言う何とも
やり切れない状態が続いた。ソースを追いかけて問題箇所を発見。
▼問題箇所
$(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ヘルパーの動作を把握した。
2007年01月15日
7.3 コントローラの変数より
▼$uses
コントローラは複数のモデルを使用するでしょうか。
例えば、 FragglesController は自動的に $this->Fraggle を
読み込みますが、 $this->Smurf も同じようにアクセスしたい
場合には、コントローラに次のように書いてください:
var $uses = array('Fraggle','Smurf');
これまで自動的に使用できていた Fraggle モデルを $uses 配列に
含める必要があることに注意してください。
なるほど。こうするのか。
▼$uses
コントローラは複数のモデルを使用するでしょうか。
例えば、 FragglesController は自動的に $this->Fraggle を
読み込みますが、 $this->Smurf も同じようにアクセスしたい
場合には、コントローラに次のように書いてください:
var $uses = array('Fraggle','Smurf');
これまで自動的に使用できていた Fraggle モデルを $uses 配列に
含める必要があることに注意してください。
なるほど。こうするのか。
2007年01月09日
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] =>
)
)
無事、別々に取得出来た。
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] =>
)
)
無事、別々に取得出来た。
2007年01月06日
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を伸張す
るだけで配布出来ると言う点がお手軽な所。
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を伸張す
るだけで配布出来ると言う点がお手軽な所。