スポンサーリンク

コマンドラインからファイルをダウンロードする方法  (PHPで拡張DLLを呼び出すexeを作る)


コマンドプロンプト上で,サーバと通信し,Webページの内容を表示する。


ftpを使わず,単にコマンド名とURLを打ち込むだけで,そのWebページのHTMLが標準出力に流れるようにしたい。


イメージとしてはコマンドライン上で

   get http://hatena.ne.jp/

と打てば,はてなのトップページのHTMLが取得できるようになればいい。


色々方法があるが,そういうEXEなりバッチなりを作って,C:\WINDOWS\system32 にいつも置いておくのが一番速い。

ネットワーク処理のコードを書く手間を省く方法

ネットワーク関係のソースコードは,何かと接続を開いたり閉じたり長くなりがちだ。


この手間を省くためには,最初からネットワークに特化して作られた言語をローカル用に転用すればよい。


つまり,サーバサイドスクリプト(phpなど)をローカルアプリ(.exe)に変換するツールを使えば,かなりの楽ができるのだ。

PHPでexeを作る

bambalamをダウンロード,解凍。

http://www.bambalam.se/bamcompile/



geturl.php とかの名前で,下記のコードをコピペ

<?
	if( isset( $argv[1] ) ) {
		readfile( $argv[1] );
	}
?>

たった3行で済む。



そして,ダウンロードした bambalam を使って,PHP を exe にコンパイルする。

	bamcompile.exe geturl.php

geturl.exe が出来上がる。



コマンドラインで

geturl http://hatena.ne.jp

と打てば,はてなのトップページがコマンドプロンプトに表示される。

geturl.exe http://hatena.ne.jp | find /n "a href" > link.html

と打てば,はてなのトップページにあるリンクを抽出してHTMLに書き出す。



なお,実質3行のコードだが,実行ファイルのサイズは1メガ。

argv[1]は一つ目のコマンドライン引数を指す。

改善

ただし,上のコードは非常に短くて助かるのだが,文字コードを指定していないので文字化けしてしまう。

エンコードも加味してWebページを取得するよう,下記のように修正する。

<?php

if( isset( $argv[1] ) ) {
	$arr = file( $argv[1] );
	foreach( $arr as $str ) {
		echo mb_convert_encoding( $str, "Shift-JIS", "auto" );
	}
}

?>

というコードで保存し直す。


このコード中で自動エンコーディングのために使われている mb_convert_encoding() は,PHPでは,拡張DLLによって動作している関数。


localhostのApacheの中にもちゃんとDLLがある。

XAMPPでインストールしてあるならば

	〜\xampp\php\extensions\php_mbstring.dll

が呼び出されている。


だから,mb_convert_encoding() を利用するアプリケーションは,このDLLが必要だ。

bambalamで上記のコードをコンパイルする際にも,geturl.php と同じフォルダ上に php_mbstring.dll を持ってきて

	bamcompile.exe -e:php_mbstring.dll geturl.php

とする。(-e:はエクステンションの設定)

これで,文字化け対策済みのコマンドラインダウンローダができる。