外部ネットワークにあるウェブページを取得する方法がいくつかあります。 ▼ 手っ取り早く取得する この他にfopen()やfile()などでも同様のことができます。 但し、この方法を使うにはfopenラッパーが有効になっている必要があります。 [php.ini] allow_url_fopen = On ▼ ヘッダーを指定 $opts = array( 'http'=>array('method' => "GET", 'header' => "Accept-language: ja\r\n" . "User-Agent: PHP-Script/1.0\r\n") ); $context = stream_context_create($opts); $html = file_get_contents('http://www.example.com/', false, $context); これでリクエストヘッダーの指定まではできましたが、これの弱点はやはりfopenラッパーの設定によっては使えないこと、レスポンスヘッダーを取得できないことなどがあります。 次はfopenラッパーの設定に依存しなくて、レスポンスヘッダーの取得もできる方法を書いてみます。 ▼ fsockopen() \n"); } $out = "GET / HTTP/1.1\r\n" . "Host: www.example.com\r\n" . "User-Agent: PHP-Script/1.0\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n" . "Connection: Close\r\n\r\n"; fwrite($fp, $out); stream_set_timeout($fp, $timeout); $header = $html = ''; while (!feof($fp)) { $info = stream_get_meta_data($fp); if ($info['timed_out']) die("timeout!"); if (empty($html) && substr($header, -4) !== "\x0d\x0a\x0d\x0a" && $header .= fgets($fp)) continue; $html .= fgets($fp); } fclose($fp); echo "[header]--------------------------------\n"; echo nl2br(htmlspecialchars($header)); echo "[html]--------------------------------\n"; echo nl2br(htmlspecialchars($html)); ▼ 関数として定義する "foo","param2"=>"bar","param3"=>'日本語テスト')); echo "[header]-------------------------------\n"; echo nl2br(htmlspecialchars($header)); echo "[html]-------------------------------\n"; echo nl2br(htmlspecialchars($html)); function wget($url, $param=array()) { $timeout = 30; $method = count($param) ? 'POST' : 'GET'; // $param要素あればPOST if (!$purl = parse_url($url)) return array('', ''); // URL分解 if (empty($purl['port'])) $purl['port'] = 80; // HTTPリクエスト $fp = fsockopen($purl['host'], $purl['port'], $errno, $errstr, $timeout); if (!$fp) { die("$errstr ($errno)\n"); } if (!empty($purl['query'])) $purl['path'] .= "?{$purl['query']}"; if (substr($purl['path'], 0, 1) !== '/') $purl['path'] = '/' . $purl['path']; $data = $method === 'POST' ? http_build_query($param, '', '&') : ''; $cl = empty($data) ? '' : "Content-Length: " . strlen($data) . "\r\n"; $out = "$method {$purl['path']} HTTP/1.1\r\n" . "Host: {$purl['host']}\r\n" . "User-Agent: PHP-Script/1.0\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n" . $cl . "Connection: Close\r\n\r\n" . $data; fwrite($fp, $out); // HTTPレスポンス取得 stream_set_timeout($fp, $timeout); $header = $html = ''; while (!feof($fp)) { $info = stream_get_meta_data($fp); if ($info['timed_out']) die("timeout!"); if (empty($html) && substr($header, -4) !== "\x0d\x0a\x0d\x0a" && $header .= fgets($fp)) continue; $html .= fgets($fp); } fclose($fp); return array($header, $html); } ▼ cURLモジュールを使う インストール時にcURLモジュールが組み込まれている必要があります。 [php.ini] extension=php_curl.dll 設定する必要があればコメントを外してウェブサーバを再起動させて反映させます。 "foo", "param2" => "bar", "param3" => "日本語テスト"); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/foo.php"); curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダーも取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 文字列で取得 curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $output = curl_exec($ch); curl_close($ch); list($status, $header, $html) = explode("\x0d\x0a\x0d\x0a", $output, 3); echo "[status]------------------------\n"; echo nl2br(htmlspecialchars($status . "\r\n")); echo "[header]------------------------\n"; echo nl2br(htmlspecialchars($header . "\r\n")); echo "[html]------------------------\n"; echo nl2br(htmlspecialchars($html));
外部ネットワークにあるウェブページを取得する方法がいくつかあります。
この他にfopen()やfile()などでも同様のことができます。
但し、この方法を使うにはfopenラッパーが有効になっている必要があります。
これでリクエストヘッダーの指定まではできましたが、これの弱点はやはりfopenラッパーの設定によっては使えないこと、レスポンスヘッダーを取得できないことなどがあります。
次はfopenラッパーの設定に依存しなくて、レスポンスヘッダーの取得もできる方法を書いてみます。
インストール時にcURLモジュールが組み込まれている必要があります。
設定する必要があればコメントを外してウェブサーバを再起動させて反映させます。
HTTP/1.0にはなかったHostヘッダーがHTTP/1.1では必須