2013年12月05日

cURL 関数で、任意の URL からのヘッダ情報を収集する

cURL 関数を使うと細かいコントーロールが可能な状態で、WEB 上のコンテンツにアクセスする事ができます。

CURLOPT_NOBODY で、本文を削除しています。CURLOPT_HEADER を指定しているので、ヘッダー情報のみを取得できます。

その結果から、正規表現で良く使われる情報を取り出しています。

( 画像の URL を指定すると、Content-Length を取得できます )
( ▼ この下の iframe に結果を表示します )
<?php
$ch = curl_init($_GET['url']);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// *********************************************************
// https 用
// *********************************************************
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
	echo 'cURL failed';
	exit;
}

$result = array();
if (preg_match('/(Content-Type: .+)/i', $data, $matches)) {
	$result[] = $matches[1];
}
if (preg_match('/(charset.+)/i', $data, $matches)) {
	$result[] = $matches[1];
}
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/i', $data, $matches)) {
	$result[] = $matches[1];
}
if (preg_match('/Content-Length: (\d+)/i', $data, $matches)) {
	$result[] = $matches[1];
}

header( "Content-Type: text/plain" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print_r($result);
print "----------------------------------------------------------------\n";
print $data;


?>

関連する記事

任意のサイトのソースコードを表示させる PHP



タグ:Curl
posted by at 2013-12-05 20:55 | 通信 | このブログの読者になる | 更新情報をチェックする

2013年11月29日

file_get_contents を使って http 経由でコンテンツを読み込んだ際の http ヘッダのレスポンスを取得する

オンライン実行( rextester.com )

$http_response_header は、http ラッパーを使ったアクセスでローカルスコープで作成される変数です。(最大の大きさは、1024 なので注意)

以下では、PHP 5.3.0 以降で有効なオプションを json_encode の第二引数に指定して実行しています
<?php
function get_contents() {
	file_get_contents("https://www.google.co.jp/");
	print json_encode($http_response_header,JSON_PRETTY_PRINT|JSON_FORCE_OBJECT);
}
get_contents();
?>


▼ 実行結果
{
    "0": "HTTP\/1.0 200 OK",
    "1": "Date: Fri, 29 Nov 2013 00:55:45 GMT",
    "2": "Expires: -1",
    "3": "Cache-Control: private, max-age=0",
    "4": "Content-Type: text\/html; charset=Shift_JIS",
    "5": "Set-Cookie: PREF=ID=fc5e4a8a0f498e60:FF=0:TM=1385686545:LM=1385686545:S=oyVcq_yknWKcwmMs; expires=Sun, 29-Nov-2015 00:55:45 GMT; path=\/; domain=.google.co.jp",
    "6": "Set-Cookie: NID=67=Qq_GXb5dblL6R9IukUa_2tGxBAQnOAJ-yRA_bDG7nmyQ9HkLSiakRS5hyp7bAog5bTyJ_9sP35c3jaHTgEfyB6I8QP12Xf_FIBNzeC4_yFv4gPAam1D4hgckzxc0jcAp; expires=Sat, 31-May-2014 00:55:45 GMT; path=\/; domain=.google.co.jp; HttpOnly",
    "7": "P3P: CP=\"This is not a P3P policy! See http:\/\/www.google.com\/support\/accounts\/bin\/answer.py?hl=en&answer=151657 for more info.\"",
    "8": "Server: gws",
    "9": "X-XSS-Protection: 1; mode=block",
    "10": "X-Frame-Options: SAMEORIGIN",
    "11": "Alternate-Protocol: 443:quic"
}


posted by at 2013-11-29 10:01 | 通信 | このブログの読者になる | 更新情報をチェックする

2010年07月15日

file_get_contents による比較的小さなファイルのダウンロード

PHP: file_get_contents - Manual

以下のようなコードで成功しますが、普通に考えてメモリ上に全ての大きさを占有してしまうので、あまり巨大なファイルを対象とするものではありません。( 大きなファイルには、readfile を使用します )

テスト仕様

ファイルサイズ : 50M
確認 : コマンドプロンプトより、FC /B オリジナルファイル ダウンロードファイル
<?
// 比較的小さなファイルのダウンロード
file_put_contents(
	"mysql.zip",
	file_get_contents("http://example.jp/mysql514.zip")
);

?>
OK


以下では、メモリは 4096 バイトしか使用しません。但しその分、全体の処理にかかる速度は落ちる事になります。また、ファイルの書き込みに file_put_contents を使用していますが、この部分でも open write close を繰り返すのでプログラムとして効率が良いとは言えません
<?
// 大きなファイルのダウンロード

ini_set("max_execution_time", 90 );	// ダウンロードに必要な時間( 秒 )

$fp = fopen("http://example.jp/mysql514.zip", "r" );
if ( $fp !== FALSE ) {
	file_put_contents("mysql.zip", "" );
	while( !feof( $fp ) ) {
		$buffer = fread( $fp, 4096 );
		if ( $buffer !== FALSE ) {
			file_put_contents("mysql.zip", $buffer, FILE_APPEND );
		}
	}
	fclose( $fp );
}

?>
OK


以下は、C 言語での記述と同等の書き方です。
<?
// 大きなファイルのダウンロード

ini_set("max_execution_time", 90 );	// ダウンロードに必要な時間( 秒 )

$fp = fopen("http://example.jp/mysql514.zip", "r" );
if ( $fp !== FALSE ) {

	$fp_out = fopen("mysql.zip", "w" );
	if ( $fp_out === FALSE ) {
		fclose( $fp );
		exit("出力ファイルを開く事ができません");
	}

	file_put_contents("mysql.zip", "" );
	while( !feof( $fp ) ) {
		$buffer = fread( $fp, 4096 );
		if ( $buffer !== FALSE ) {
			fwrite( $fp_out, $buffer );
		}
	}
	fclose( $fp_out );
	fclose( $fp );
}

?>
OK



posted by at 2010-07-15 12:03 | 通信 | このブログの読者になる | 更新情報をチェックする