File#flock が実装された
いつのまにか File#flock が実装されていた。ticket #251で足りないと指摘されていた #flock, #truncate, #chown, #mtime, #lstat はどれも実装されたようだ。
よかった。これで rbTenjin を Rubinius ready にできそうだできた。
PHP のファイルから PHP の文と式だけを抜き出す
PHP ファイルに Syntax error があると、該当箇所を見つけるのはかなり困難である。理由は簡単で、HTML と PHP コードとが混じっているから。
たとえば <?php foreach ($list as $item) { ?> と <?php } ?> のあいだにたくさんの HTML タグが入っていると、それだけで '{' と '}' の対応を確認するのが難しくなる。
例えば次のような PHP ファイル (hoge.php) を考える (htmlspecialchars() は省略)。
<html> <body> <h1><?php echo $title; ?></h1> <?php if (! $list) { ?> <p>not found.</p> <?php } else { ?> <table> <thead> <tr> <th>#</th> <th>Name</th> <th>Site</th> </tr> </thead> <tbody> <?php $i = 0; ?> <?php foreach ($list as $item) { ?> <?php $i += 1; ?> <?php $color = i % 2 == 1 ? '#FFCCCC' : '#CCCCFF'; ?> <tr bgcolor="<?php echo $color; ?>"> <td><?php echo $i; ?></td> <td><?php echo $item->name; ?></td> <?php if ($item->url) { ?> <td><a href="<?php echo $item->url; ?>"><?php $item->url; ?></a></td> <?php } else { ?> <td>-</td> <?php } ?> </tr> </tbody> </table> <?php } ?> </body> </html>
この hoge.rhtml には Syntax error がある。それは次のようにして確かめることができる。
$ php -l hoge.php Parse error: syntax error, unexpected $end in hoge.php on line 34 Errors parsing hoge.php
しかし、実際にどこが原因で Syntax error になっているのかは分からない。hoge.php をみても、HTML と PHP コードが入り交じっていて、見つけるのが困難である。
こんなときは、phpTenjin を使うとよい。phpTenjin は PHP で作られた高速なテンプレートエンジンで、式を「[= $var =]」(HTML エスケープあり) と「[== $var =]」(HTML エスケープなし) で書く以外はほぼ PHP そのままなテンプレートを使う。そして、phpTenjin には PHP コードだけを抜き出すオプション -S が用意されている。
$ phptenjin -S hoge.php <?php echo $title; if (! $list) { } else { $i = 0; foreach ($list as $item) { $i += 1; $color = i % 2 == 1 ? '#FFCCCC' : '#CCCCFF'; echo $color; echo $i; echo $item->name; if ($item->url) { echo $item->url; $item->url; } else { } } ?>
また -U をつけると連続する空行を圧縮し (uniq)、-C をつけると空行を取り除き (compact)、-N をつけると行番号が表示される (number)。
$ phptenjin -SNC hoge.php 1: <?php 3: echo $title; 4: if (! $list) { 6: } else { 16: $i = 0; 17: foreach ($list as $item) { 18: $i += 1; 19: $color = i % 2 == 1 ? '#FFCCCC' : '#CCCCFF'; 20: echo $color; 21: echo $i; 22: echo $item->name; 23: if ($item->url) { 24: echo $item->url; $item->url; 25: } else { 27: } 31: } 34: ?>
これを見れば一目瞭然。17 行目の foreach 文に対応する '}' が抜けていることがわかる。
このように、phpTenjin の -S オプションを使うと PHP のコードだけを抜き出してくれるので、チェックが簡単になる (同様の機能はErubisにもある)。ただし、<? ?> や <?= ?> を使っているとその部分はチェックできない。あくまで <?php ?> となっている部分だけが対象である。
なお Tenjin では -z を指定すると Syntax error をチェックしてくれる。これは php -l hoge.phpと比べると、複数ファイルを一度にチェックできるという利点がある。
### php -l だと Syntax error があればそれ以降はチェックされない $ php -l hoge.php hoge2.php hoge3.php Parse error: syntax error, unexpected $end in hoge.php on line 34 Errors parsing hoge.php ### phptenjin -z だとすべてのファイルをチェックしてくれる $ phptenjin -z hoge.php hoge2.php hoge3.php [NG] hoge.php Parse error: syntax error, unexpected $end in hoge.php on line 35 Errors parsing hoge.php [NG] hoge2.php Parse error: syntax error, unexpected $end in hoge2.php on line 35 Errors parsing hoge2.php [NG] hoge3.php Parse error: syntax error, unexpected $end in hoge3.php on line 35 Errors parsing hoge3.php
追記: Ruby on Rails を使っている人はこちらをどうぞ。