$year, "month" => $month, "day" => $day, "hour" => $hour, "minute" => $minute, "second" => $second, "fraction" => $fraction, "timezone" => $timezone, "timestamp" => $timestamp); return $result; } // ------------------------------------------------------------------------- // array http_request(string Method, string URI, string Version [, array headers // [, string Server [, int Size [, int Timeout1 [, int Timeour2]]]]]) // URIに対してMethodでHTTPリクエストを行います。HTTPのバージョンはVersionで指 // 定できます。追加のリクエスヘッダーは連想配列headersで指定します。 // 返り値にはHTTP-Version、Status-Code、Reason-Phraseが必ず含まれ、それ以外 // にサーバが返した情報(index: value)が含まれます。 // Status-Codeが9xxの場合、それはホストが存在しない場合などHTTPリクエストが // 正常に行われなかったことを意味します。 // ------------------------------------------------------------------------- function http_request($method, $uri, $version, $headers = array(), $server = "", $limit_size = 51200, $tos = 2, $tor = 4) { if ($server == "") { // serverが空の場合はuriから取得 // absoluteURIならそこから if ($uri && substr($uri, 0, 1) != "/") { $temp = parse_url($uri); $host = $temp["host"]; $port = $temp["port"]; // それ以外ならHostフィールドから } else { // サーバをホスト名とポートに分離 $temp = explode(":", $headers["Host"]); $host = $temp[0]; $port = $temp[1]; } } else { // サーバをホスト名とポートに分離 $temp = explode(":", $server); $host = $temp[0]; $port = $temp[1]; } // ポートが空の時はデフォルトの80にします。 if (! $port) { $port = 80; } // リクエストフィールドを制作。 $msg_req = $method . " " . $uri . " HTTP/". $version . "\r\n"; foreach ($headers as $name => $value) { $msg_req .= $name . ": " . $value . "\r\n"; } $msg_req .= "\r\n"; $status = array(); // 指定ホストに接続。 if ($handle = @fsockopen($host, $port, $errno, $errstr, $tos)) { if (socket_set_timeout($handle, $tor)) { fputs ($handle, $msg_req); $buffer = fread($handle, $limit_size); fclose ($handle); $status = array(); $status["Raw-Data"] = $buffer; $temp = explode("\r\n\r\n", $buffer); $buffer_header = array_shift($temp); $entity_body = implode("\r\n\r\n", $temp); $temp_line = explode("\r\n", $buffer_header); foreach ($temp_line as $line_no => $line_contents) { if($line_no == 0) { $temp_status = explode(" ", $line_contents); $status["HTTP-Version"] = $temp_status[0]; $status["Status-Code"] = $temp_status[1]; $status["Reason-Phrase"] = $temp_status[2]; } else { $temp_status = explode(":", $line_contents); $field_name = array_shift($temp_status); $status[$field_name] = ltrim(implode(":", $temp_status)); } } if ($entity_body != "") { $status["entity-body"] = $entity_body; } } else { $status["HTTP-Version"] = "---"; $status["Status-Code"] = "902"; $status["Reason-Phrase"] = "Response Timeout"; } } else { $status["HTTP-Version"] = "---"; $status["Status-Code"] = "901"; $status["Reason-Phrase"] = "Connection Timeout"; } return $status; } // ------------------------------------------------------------------------- // array parse_http_date(string Date) // DateはRFC1123、RFC 850、ANSI C's asctime() formatのいずれか。 // ------------------------------------------------------------------------- function parse_http_date($string_date) { // 月の名前と数字を定義 $define_month = array("01" => "Jan", "02" => "Feb", "03" => "Mar", "04" => "Apr", "05" => "May", "06" => "Jun", "07" => "Jul", "08" => "Aug", "09" => "Sep", "10" => "Oct", "11" => "Nov", "12" => "Dec"); if (preg_match("/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), ([0-3][0-9]) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{4}) ([0-2][0-9]):([0-5][0-9]):([0-5][0-9]) GMT$/", $string_date, $temp_date)) { $date["hour"] = $temp_date[5]; $date["minute"] = $temp_date[6]; $date["second"] = $temp_date[7]; // 定義済みの月の名前を数字に変換する $date["month"] = array_search($temp_date[3], $define_month); $date["day"] = $temp_date[2]; $date["year"] = $temp_date[4]; } elseif (preg_match("/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), ([0-3][0-9])-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-([0-9]{2}) ([0-2][0-9]):([0-5][0-9]):([0-5][0-9]) GMT$/", $string_date, $temp_date)) { $date["hour"] = $temp_date[5]; $date["minute"] = $temp_date[6]; $date["second"] = $temp_date[7]; // 定義済みの月の名前を数字に変換する $date["month"] = array_search($temp_date[3], $define_month); // 年が2桁しかないので1900を足して4桁に $date["day"] = $temp_date[2]; $date["year"] = 1900 + $temp_date[4]; } elseif (preg_match("/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-3 ][0-9]) ([0-2][0-9]):([0-5][0-9]):([0-5][0-9]) ([0-9]{4})$/", $string_date, $temp_date)) { $date["hour"] = $temp_date[4]; $date["minute"] = $temp_date[5]; $date["second"] = $temp_date[6]; $date["month"] = array_search($temp_date[2], $define_month); // 日が1桁の場合先、半角スペースを0に置換 $date["day"] = str_replace(" ", 0, $temp_date[3]); // 定義済みの月の名前を数字に変換する $date["year"] = $temp_date[7]; } else { return false; } // UNIXタイムスタンプを生成。GMTなのに注意 $date["timestamp"] = gmmktime($date["hour"], $date["minute"], $date["second"], $date["month"], $date["day"], $date["year"]); return $date; } // ------------------------------------------------------------------------- // int str_to_num(string code) // codeは任意の文字列。引数が扱えない値の場合FALSEを返します。 // ------------------------------------------------------------------------- function str_to_num($target) { // アルファベットの定義 $alphabet = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); // 変数の方を調べて不正な値を弾く if (!is_string($target) || $target == "") { return false; } $length = strlen($target); for ($i = 1; $i <= $length; $i++) { // 末尾の1桁を取り出して $one = substr($target, - $i, 1); // 数字に変換。この時aが0から始まることに注意 $num = array_search($one, $alphabet); if ($i == 1) { // 1桁目はa=0なのでそのまま $result = $num; } else { // 2桁目以降はa=1なので1足してから桁を掛ける $result += ($num + 1) * pow(26, $i - 1); } } return $result; } // ------------------------------------------------------------------------- // string num_to_str(int number) // numberは任意の整数。 // ------------------------------------------------------------------------- function num_to_str($target) { // アルファベットの定義 $alphabet = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); // 不正な引数を弾く。負の値は無効。 if (!is_numeric($target) || $target < 0) { return false; } // まず、1桁目。a=0なのでそのままmodを求める $one = fmod($target , 26); $result = $alphabet[ $one ]; // 1桁目を引いた余りから繰り上がり分を求める $carry = ($target - $one) / 26; // 繰り上がりが無くなるまで繰り返し while ($carry != 0) { // a=1なので1引いてからmodを求める。 $one = fmod($carry - 1 , 26); $result = $alphabet[ $one ] . $result; $carry = ($carry - 1 - $one) / 26; } return $result; } // ------------------------------------------------------------------------- // string relative_str(string base [, int distance, bool overflow ]]) // baseは任意の文字列。distanceは移動距離、overflowは桁溢れに対応するか。 // 省略された場合、それぞれ1、TRUEが初期値になります。 // ------------------------------------------------------------------------- function relative_str($str_base, $distance = 1, $option = true) { // 文字列を数値に変換して距離を足し、条件に合わせて戻り値を返す $num_base = str_to_num($str_base); $num_target = $num_base + $distance; if ($str_target = num_to_str($num_target)) { if (!$option && strlen($str_target) > strlen($str_base)) { return false; } else { return $str_target; } } else { return false; } } // ------------------------------------------------------------------------- // array make_dirtree(str Directory) // Directory以下の階層のファイルを取得。 // ------------------------------------------------------------------------- function make_dirtree($target, $sort = 1, $depth = 0) { // ディレクトリ、ファイルが格納される配列を初期化 // 別々に分けるのは後でソートするときのため $temp_dir = array(); $temp_file = array(); // $target == "/" ? "/" . $filename : $target . "/" . $filename // この記述はルートディレクトリのファイル名が「//foo」にならないようにするため if ($handle_dir = opendir($target)) { while (false !== ($filename = readdir($handle_dir))) { // ファイルとディレクトリのリストを制作 // カレントと上位ディレクトリは除外 if ($filename != "." && $filename != "..") { // 拡張子取得 if (preg_match("/^(.*)\.(.*)$/i", $filename, $temp_name)) { $basename = $temp_name[1]; $extensiton = $temp_name[2]; } else { $basename = $filename; $extensiton = ''; } // ディレクトリが存在したらディレクトリとして扱う。 if (is_dir($target == "/" ? "/" . $filename : $target . "/" . $filename)) { $temp_dir[$filename] = array("type" => "dir", "name" => $filename, "basename" => $basename, "extensiton" => $extensiton, "dir" => $target, "path" => $target == "/" ? "/" . $filename : $target . "/" . $filename, "sub" => make_dirtree($target == "/" ? "/" . $filename : $target . "/" . $filename, $sort, $depth + 1)); } else { $temp_file[$filename] = array("type" => "file", "name" => $filename, "basename" => $basename, "extensiton" => $extensiton, "dir" => $target, "path" => $target == "/" ? "/" . $filename : $target . "/" . $filename, "depth" => $depth); } } } closedir($handle_dir); } else { exit("エラー:ディレクトリ $target が開けません。"); } // それぞれソートしてからくっつける。 ksort($temp_dir); ksort($temp_file); if ($sort === 1) { $tree = array_merge($temp_dir, $temp_file); } else { $tree = array_merge($temp_file, $temp_dir); } return $tree; } ?>