ひさびさにコード遊び

4/27/2009
(注) この記事は 2008年7月5日の記事の再録です。

最近、仕事ばかりやっていてここのメンテナンスがあまり出来てないなぁ、
と思っていたところで、アクセス統計を見てみたら、数年前にまじめにやっていた(?)頃に
比べてだいぶ減っている事に気づきました(笑)

そりゃ、メルマガもやっていましたし、毎日何かしら書いていたし、というのが
頻度はがた落ち、ネタもマニアックすぎて(苦笑)読む人が減るのは当然、なのですが
とはいえ、ちょっとなんとかしてみたいなぁ、と思い、こういうものを入れてみました。





正直入れたばかりなのでどうなるのかは今後のお楽しみなのですが、
今回はこれを導入するにあたっていろいろはまったので(苦笑)
php のお勉強の復習、の乗りでちょっと導入記を残そうかと思います。


この




は、php で書かれたファイル群をサーバーに置いて、アクセスするごとにリンクを管理するサーバーから
情報を得てその結果をだす、という形態を取っています。
登録などのプロセスを経て、そこで規定したディレクトリにおいてアクセスすれば、
# 登録等は Q&Aをみればわかるので割愛しますね。
php が動くサーバーであれば動くはず、なのですが。。。

いきなりエラー。mb_convert なにがしが未定義だよ、って。。。

実はこのサイト、アメリカで管理されているので php のモジュールのうちマルチバイトの
取り扱いをする mbstrings が入っていないのです。
そのおかげで実はこの nucleus のプラグインを作るのにも日本人的なものを作るのが
大変なのですが。。。

じゃあ、そういう場合、どうすればいいか。
mb_* を外部ライブラリとして呼び出して使えばいい、ということになるのですが
要は、Cでいうところの #include <>ですね、
それを実現できるのは mb-emulator です。

これをtooland からもらって来たファイルのどこに入れるか。
サーバーでアクセスするときに呼び出される index.php では駄目でした。(多分順番が悪かったような気がするのですが。。。)
で、index.php が読み込む tsearch.ini の書き出しにある



の直後に

require './mb-emulator/mb-emulator.php'>

と書き込み、ファイル群をおいたディレクトリの下に mb-emulator のディレクトリを
作って mb-emulator のファイル関連を一通りおくことでなんとか稼働する、はずでした。
でも、またエラー。今度は

GET /too-search/top.php にアクセスしても帰ってこないよー

とのこと。該当するコードを見ると。。。

$host = "www.tooland.net";
$port = "80";

$path = "/too-search/" . $gsc . '.php';
$path .= "?gkey=" . urlencode($gkey);
$path .= "&gch=" . urlencode($gch);
$path .= "&gfg=" . urlencode($gfg);

if($gct){$path .= "&gct=" . urlencode($gct);}
if($gpg){$path .= "&gpg=" . urlencode($gpg);}
if($gcd){$path .= "&gcd=" . urlencode($gcd);}
if($gkw){$path .= "&gkw=" . urlencode($gkw);}

$path .= "&rsv=" . urlencode(trim($_SERVER["SERVER_NAME"]));
$path .= "&rsc=" . urlencode(trim($_SERVER["SCRIPT_NAME"]));


$str="";
sleep(1);
$fp = fsockopen ($host, $port,$trash, $trash, $timeout);

if ($fp) {

socket_set_timeout($fp, $timeout);
$req = "GET $path HTTP/1.0\r\n" ."User-Agent: {$_SERVER["HTTP_USER_AGENT"]}\r\n\r\n";

fputs ($fp, $req);
$flg=0;

while($line = fgets ($fp, 1024)){

if (eregi("^\r\n$", $line))
$flg = 1;

if ($flg)
$str .= $line;
}
fclose ($fp);
}

echo $str;
}


とある。ソケットがおかしいのか?とおもってつながっていない場合の
if ($fp) に else 文をいれてトラップしても変わらない。
ということは fsockopenまでは動いているという事だから。。。
で、サイトに対する要求文をみると。。。

$req = "GET $path HTTP/1.0\r\n" ."User-Agent: {$_SERVER["HTTP_USER_AGENT"]}\r\n\r\n";

fputs ($fp, $req);


となっている。あれ?確か Host : でアクセスするサイトのホストの明示も必要だよな、
と思い出したので

$req = "GET $path HTTP/1.0\r\n"."Host: $host\r\n" ."User-Agent: {$_SERVER["HTTP_USER_AGENT"]}\r\n\r\n";

と入れたら。。。こんな風にばっちり動きました!
登録サイトでも動き出した事を認識してくれたしあとは
リンクサイトが増えるだけ(爆笑)

ということで、もし tooland の関係者の方、これを見たらちょっとコードの見直しを
お願いしますね! ;-)


いやぁ、久しぶりにコードいじりなんてしましたが、楽しいですねぇ(笑)
いい気分転換でした。

0 件のコメント:

Copyrights Emichanproduction, 1996 - 2011. Powered by Blogger.