PHP5.3でHTMLPurifier4.2を使おうと思ったらNOTICEエラーが発生。

悪意あるHTMLコードをきれいにするHTMLPurifierを試してみました。
試したPHPコードは以下の通り。

// HTMLPurifierを生成する
$dirty_str = 'hogehoge';

$config = HTMLPurifier_Config::createDefault();
$config->set('Core', 'Encoding', 'UTF-8');
$config->set('Core', 'Language', 'ja'); 
$config->set('Attr', 'AllowedFrameTargets', array('_blank','_self'));

$hp = new HTMLPurifier($config);
//危険なHTMLタグを無効化
$clean_str = $hp->purify( $dirty_str );

他の参考サイトにならってconfigオブジェクトに設定を格納しようと思ったら以下のようなエラーが出ました。

Notice: Using deprecated API: use $config->set('Core.Encoding', ...) instead on line 8 in file ... in Config.php on line 564
Notice: Using deprecated API: use $config->set('Core.Language', ...) instead on line 9 in file ... in Config.php on line 564
Notice: Using deprecated API: use $config->set('Attr.AllowedFrameTargets', ...) instead on line 10 in file ... in Config.php on line 564

NOTICEエラーなのでerror_reporting(0);とか書いておけばもちろん非表示に出来ますがそれだと気持ち悪いので修正しました。
setメソッドに渡す値を引数で連結せずに.(ドット)で連結するとエラーが消えるみたいです。
修正したコードは以下の通りです。

// HTMLPurifierを生成する
$dirty_str = 'hogehoge';

$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('Core.Language', 'ja'); 
$config->set('Attr.AllowedFrameTargets', array('_blank','_self'));

$hp = new HTMLPurifier($config);
//危険なHTMLタグを無効化
$clean_str = $hp->purify( $dirty_str );

SQL_CALC_FOUND_ROWSを使うとインデックスが使われない?

MySQLテーブルのレコード数が多くなってきて検索が徐々に遅くなってきたのでチューニング。
EXPLAINでSELECT文を解析してみたところ、どうも一番肝心のレコードが多いテーブルでインデックスが使われていないみたい。

インデックスの作り方が悪いのか、テーブルの構造が悪いのか、はたまたSQL文が悪いのかいろいろ試しました。
結局どうしてもインデックスが使われずにusing filesortが表示されて泣きそうになりました。

途方に暮れていた時なにげなーくSQL_CALC_FOUND_ROWS文を外してクエリを実行したところ・・・

possible_keysとkeyにしっかりとインデックス名が表示されている・・・
そしてExtraにはUsing where表記のみに・・・!

まさか原因がそこだったとは自分の中では盲点でした。

ということでLIMITを解除した件数の取得は別でクエリを発行することを検討中。
調べてみたらレコード数が多い場合はSQL_CALC_FOUND_ROWSを使って一つのクエリで済まそうとせず、
件数取得のクエリを別で発行した方が早いこともあるみたいです。
ただ、件数取得用のSQLは出来る限りシンプルに、そして表示するフィールドは最小限(idのみなど)などしたほうがいいようです。

これがきっかけでいろいろとMySQLチューニングについては勉強できました。
収穫も多かったです。

秀丸のマクロPHPMAN.macで開いたページをFirefoxで開くようにする

私の環境では既定のブラウザをFirefoxにしているのですがIEが起動したので、
他の任意ブラウザで起動するようにPHPMAN.macを変更したのでメモ。

今回は直接Firefoxのパスを指定して起動させた。
8行目を以下の通りに変更。

//run $app + "jp2.php.net/manual-lookup.php?lang=ja&function=" + gettext(seltopx,seltopy,selendx,selendy);
run "C:\\Program Files\\Mozilla Firefox\\firefox.exe " + "jp2.php.net/manual-lookup.php?lang=ja&function=" + gettext(seltopx,seltopy,selendx,selendy);

元のコードはコメントアウトにしてます。
ちなみに私は秀丸マクロの文法などは全然詳しくないのであくまで応急的な対応です。
汎用的な対応ではないと思いますが参考になれば。