コマンドラインからファイルをダウンロードする方法 (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:はエクステンションの設定)
これで,文字化け対策済みのコマンドラインダウンローダができる。