PHPに惚れました

今でも多分惚れてます。

file_get_contents関数

よそのコンテンツを取得するのに便利なfile_get_contents関数。
文書やHTMLファイルを取得するにはよく使ってるけど画像ファイルをgetしたらどうなるんだろうと思い試してみる。
ちゃんと画像が表示されるのか化けたテキストが出るのか。もちろんダメでしたけど。

ちなみにhtaccessでErrorDocumentを指定しているとfile_get_contentsでデッドリンク検証は出来ない。
存在しないファイルを指定すると指定した403ページを呼び出してしまうため。
そんな時は以下のここのソースで検証。
一応ソースも。

<?php
function get_http_header( $target ) {

    // URIから各情報を取得
    $info = parse_url( $target );
    $scheme = $info['scheme'];
    $host = $info['host'];
    $port = $info['port'];
    $path = $info['path'];
    // ポートが空の時はデフォルトの80にします。
    if( ! $port ) {
        $port = 80;
    }
    // リクエストフィールドを制作。
    $msg_req = "HEAD " . $path . " HTTP/1.0\r\n";
    $msg_req .= "Host: $host\r\n";
    $msg_req .=
        "User-Agent: H2C/1.0\r\n";
    $msg_req .= "\r\n";
    // スキームがHTTPの時のみ実行
    if ( $scheme == 'http' ) {
        $status = array();
        // 指定ホストに接続。
        if ( $handle = @fsockopen( $host, $port, $errno, $errstr, 1 ) ) {
            fputs ( $handle, $msg_req );
            if ( socket_set_timeout( $handle, 3 ) ) { 
                $line = 0;
                while( ! feof( $handle) ) {
                    // 1行めはステータスライン
                    if( $line == 0 ) {
                        $temp_stat =
                            explode( ' ', fgets( $handle, 4096 ) );
                        $status['HTTP-Version'] =
                            array_shift( $temp_stat );
                        $status['Status-Code'] = array_shift( $temp_stat );
                        $status['Reason-Phrase'] =
                            implode( ' ', $temp_stat );

                    // 2行目以降はコロンで分割してそれぞれ代入
                    } else {
                        $temp_stat =
                            explode( ':', fgets( $handle, 4096 ) );
                        $name = array_shift( $temp_stat );
                        // 通常:の後に1文字半角スペースがあるので除去
                        $status[ $name ] =
                            substr( implode( ':', $temp_stat ), 1);
                    }
                    $line++;
                }
            } else {
                    $status['HTTP-Version'] = '---';
                    $status['Status-Code'] = '902';
                    $status['Reason-Phrase'] = "No Response";
            }
            fclose ( $handle );
        } else {
            $status['HTTP-Version'] = '---';
            $status['Status-Code'] = '901';
            $status['Reason-Phrase'] = "Unable To Connect";
        }
    } else {
        $status['HTTP-Version'] = '---';
        $status['Status-Code'] = '903';
        $status['Reason-Phrase'] = "Not HTTP Request";
    }
    return $status;
}
?>

コイツを使ってこんなものを作ってみた。

<style>
dl{
 width:300px;
 text-align:left;
 margin:0px;
}

dt{
 float:left;
 width:60px;   
 text-align:center;
}

dd{
 margin-left:60px;
 width:230px;
 padding:0px 0px 0px 0px;
}
</style>
<?php
$dir ="画像が収められているディレクトリを指定";

print "<div><h7>過去のTop絵</h7><dl>";
for($j=8;$j<=date(y);$j++){
   print"<dt>".sprintf('%02d', $j)."年</dt>";
   print"<dd>";
   for($i=1;$i<=12;$i++){
      $status= get_http_header($dir.sprintf('%02d', $j)."-".sprintf('%02d', $i)."top.jpg");
      if (substr($status['Reason-Phrase'], 0, 2) == 'OK') {
         echo "<a href=".$dir.sprintf('%02d', $j)."-".sprintf('%02d', $i)."top.jpg>".sprintf('%02d', $i)."月</a> \n";
        }
     }
     print"</dd>";
  }
print"</dl></div>";
?>

画像ファイル名の書式がyy-mmtop.jpg(例:08-07top.jpg)の物に対してリンクを貼るもの。
サイトのtop絵を月別に変更しているとどんどん溜まってきますが、
過去のtop絵として毎月リンクを手打ちで追加していくのは面倒。

ってな時に使えそうなもの。

絵の更新をさぼった月はリンクは表示されない。
でも後からその月のファイル名で補完すればちゃんと表示されます。

定義済みリストをCSSで横並びにした。

deltacolorsにて動作してます。