fseek.phpで出たWarning

このサイトのpotatoエリア(イモネタの集積)のディレクトリ構造は2階層だった。他のエリアがすべて3階層なのでこれを3階層にすることは作成時の能率化にも寄与するので喫緊の課題だった。それがやっと昨日いちおう完了した。階層が1つ深くなるわけであるから、リンクの修正(*.htmlと*.js)と画像の対応に欠落がないかのチェックは最低限必要である。そのためのログを見るのも当分欠かせない(リンク間違いや画像の欠落がすぐにわかる)。

そうして見ている中で出くわしたのが次のようなアクセスである。
LOG
101.111.245.227 [03/Apr/2016:11:01:40] site_search.html "PHP" "サイト検索" "日本語"
このファイル(site_search.html)に飛んでくるのは珍しい。プログラミング的なことに興味をもつ人間は今や絶滅危惧種に近いからである(笑)。ついでにちょっと動作も確認しておくか、とその中のfseek.phpのサンプルリンクをクリックすると次のようなものが出てきた。これをアップロードした時は正常に動作していたはずであるが、、、。

資料 【 4 】 ログファイル内のタグの削除(No.0033) (http://www.mermaid-tavern.com/marine/perl/p1/perl_0033.html) Update: 2016/04/04(Mon) Size: 14399 bytes Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in /****/*******/******_****/***/fseek.php on line 126 Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in /****/*******/******_****/***/fseek.php on line 126 Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in /****/*******/******_****/***/fseek.php on line 126

このプログラム(GET方式専用版)を使うキーワード検索のページはすでに削除していたために、今では使うことはほとんどなくなっていた。それで放置していたものである。しかし、このページにはまだその呼び出しが残っていたようである。同じものが3個連続しているのは、このファイルの中に「Unable to detect character encoding」になる部分が3個所あったということである。

さて、問題のfseek.phpの126行目はこれである。
SAMPLE
$line = mb_convert_encoding($lines[$i], "EUC-JP", "UTF-8,SJIS");

PHPもエラーチェックが厳しくなったこと。あまり使わないので点検してこなかったことが原因のひとつになったのかもしれない。
この原因はすぐわかるのでこれを次のように修正する。
SAMPLE
$line = @mb_convert_encoding($lines[$i], "EUC-JP", "UTF-8,SJIS");

これで上のような「Warning:」が出ることは防止できる。なお、この修正は同種の検索ツールであるfinder1.phpfinder2.phpにはすでに行っていた。ということは、あまり使うことがなくなったfseek.phpだけが無修正で残っていたことになる。

システムのこまかいバージョンの変更などの外部的要因による修正(メンテナンス)は面倒である。特に、以前は正常に動作していたものがいつの間にかエラーになったりすることがあるが、それに気がつく機会がほとんどないからである。今回はたまたまそれに気がつくことができた。しかし、常時点検していくのも面倒だし、困ったものである。


改造余話

本来のfseek.phpは特定エリアのファイル(プログラムのソース)に対して指定したキーワード(関数)があるかないかを調べるだけのものである(これはfseekp.phpにリネイム)。これを少し改造して一般エリアのファイル中の最初にヒットした1行を表示して、次のファイルの検索に進むようにした。列挙型検索に比べて時間がほんの少しだけ短縮される(当然)。同時に、アクセス制限エリア用にfseekx.phpも作っておいた。

ちなみに、eseek.cgi,eseekx.cgi.eseek.php,eseekx.phpのように「e」で始まる検索プログラムは列挙型検索である。
また、eseekx.cgi,fseekx.php.eseekx.phpのように「x」で終わる検索プログラムはアクセス制限エリアの検索である。

PHPやCGIをGET方式で直接呼び出すようなストレート版はロボットやワームのターゲットになるので実際には使えない。そこで、JavaScriptから呼び出す間接パターン(併用版)にした。

日本語のキーワードにはShift_JISまたはUTF-8のナマの日本語でよい。下記は「コーヒーブレイク」エリアから「集団的自衛権」という語のあるファイルを探す例である。

参考
CGIでの列挙型検索の場合/「集団的自衛権」のあるファイル一覧
PHPでの非列挙型検索の場合/「集団的自衛権」のあるファイル一覧(現在は使っていない)

列挙型はすべてのファイルを先頭から末尾まで読み込む必要がある。これに対して非列挙型の場合はファイルに1つでもキーワードが見つかれば以後の読み込みはしなくてよいが、キーワードが1つもない場合は末尾まで読み込むことになる。この点で、速度の差はほとんど生じないといってもよいぐらいになる。

いずれにしても、実用性の点からみて、この種の固定的なGET検索(特に非列挙型)の必要性がどの程度あるのかは考えておくべくきことである。その使用範囲は極めて狭いはずである。このタイプの原型はfseekp.phpである。これはプログラミングで出てくる関数の有無の検索用に作ったものである。指定した関数が使われているかいないかを調べることが目的だったのでこういう仕様にしていた。

一般的な検索にはeseek.cgi(eseek.phpでも同等)を使う(略称esk)。アクセス制限エリアの検索にはeseekx.cgi(WEB用ではfseekp.php)を使う(略称esx)。

- 2016/04/04 -