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 | 通信 | このブログの読者になる | 更新情報をチェックする

PHP : セッションの注意事項 : 絶対に知っておくべきこと

セッションはアプリケーションを作成する上でのとても重要な機能で、今日の PHP の地位は、この機能を使いやすく実装したおかげだと言えるくらいです。確かに、理屈を知らなくても、簡単に使えてしまうのですが、あらためてドキュメントに目を通すと、良く知らない人では混乱するような事しか書いていません。

セッションを使う為のニ原則

1) ソースコードの先頭で、session_start(); を実行する。
2) セッションの内容をクリアしたい場合は、$_SESSION = array(); を実行する。

とりあえずこの二つを知っておけば間違い無いでしょう。クッキーの存在が基本事項ですが、いまどきクッキーを遮断するようなクライアントもいないでしょうから、特別意識する必要は無いと思います。

で、この裏付けページが以下のページにあるサンプルです。

PHP: session_destroy - Manual

ここに、$_SESSION = array() の記述と、もう少し込み入った内容があります。しかし、通常完全にセッションを削除する理由は見当たらないので、そこは気にせず、以下を気にして下さい

 $_SESSION を使っていない古いコードでのみ session_unset() を使用するようにしましょう。 
つまり、session_unset() を使うなと言う事で、さらに、session_unset() のページへ行くと、以下のように注意が書かれています
$_SESSION が使用されている場合、セッション変数の登録を削除するために unset() すなわち、unset ($_SESSION['varname']); を使用してください。 
$_SESSION スーパーグローバルを使用した セッション変数の登録が不可能になってしまうため、 unset($_SESSION) を使って $_SESSION を完全に unset しないでください。 
これは、つまり 個別の変数の削除は、unset ですが、unset($_SESSION) は、絶対にするなというややこしい警告です。ですから、そのような処理が必要な場合は、$_SESSION = array();で全てをクリアする事を推奨します。 unset ($_SESSION['varname']); は、最後の手段です
posted by at 2013-11-29 09:12 | 環境 | このブログの読者になる | 更新情報をチェックする

2013年05月04日

PHPモードとHTMLモード : breaks out of PHP mode and returns to HTML mode

PHP のマニュアルで PHP モードという表現は結構頻繁にあらわれますが、HTML モードという表現はあまり見る事ができません。そもそも、PHP パーサのモードの事を言っているのですが、PHP の主体は PHP モードであって、HTML に埋め込むように表現されているからです。

ですが、HTML モードは、PHPパーサにとっては print の対象そのものだと言えます。
HTML mode という表現のある英文ページ PHP: Comments - Manual 上記英文ページの日本語訳ページ PHP: コメント - Manual
<pre>
ここは HTML モード部分です
以下の PHP 開始タグ以降から PHP モードとなります
<?

	print "PHPモードの実行中です"

?>

HTML モード中は、PHP パーサから無視されます。
つまりそのまま print されると言う事です。

しかし、以下のような埋め込みを行う事が多くなります

以下は、最も良く使われる「変数の埋め込み」です
<?= $_SERVER['SCRIPT_NAME'] ?>

途中のバージョンから可能になった、「関数の戻り値の埋め込み」です
<?= str_replace(" ", "", "a b c" ) ?>

以下の方法は可能ですが通常使用しません
<? print str_replace(" ", "", "a b c" ) ?>


それ以外にも、制御構造のみを PHP 開始タグと終了タグで挟む事もあります

<SELECT>
<? for( $i = 0; $i < 10; $i++ ) { ?>

<OPTION><?= $i ?></OPTION>

<? } ?>
</SELECT>

</pre>

※ PHP 終了タグの直前では、文の終わりを示す ; (セミコロン) は省略できます


更新履歴
2010-10-06 : 記事作成
2013-05-04 : フォントサイズ・改行調整



posted by at 2013-05-04 13:41 | ドキュメント | このブログの読者になる | 更新情報をチェックする

4種類のスカラー型

PHP: 導入 - Manual

PHP のマニュアルの「導入」部分で、PHP で使用されるデータ型について書かれています。その中で実際の中心となるのは、「スカラー型」と呼ばれる「量」をあらわす数値型ですが、文字列もその中に含まれます。

スカラー [scalar]

大きさだけで表せる量。
時間温度密度等。
4 種類のスカラー型  ■ 論理値 (boolean)  ■ 整数 (integer)  ■ float (浮動小数点数, double も同じ)  ■ 文字列 (string) スクリプト言語では、データ型を明示して変数を作成するという事をしません。与えられた実際の値によって自動的に変数内部が変換されていきます。また、意図的にその型へと変換したい場合は、C言語と同じキャストか関数で行います。 ※ マニュアルにある float 型の補足説明
マニュアル内のいくつかの場所で "double" 型という記述が残っているかもしれません。 

double は float と同じものだと考えてください。2 種類の名前が存在するのは、 歴史的な理由によるものです。 
通常は PHP にまかせる 例えば、boolean 型に関して以下のような説明があります。
boolean に明示的に変換を行うには、キャスト (bool) または (boolean) を使用します。

しかし、演算子、関数、制御構造が boolean 型の引数を必要とする場合には、値は自動的に変換されるため、 多くの場合はキャストは不要です。 
これは、以下のような値が FALSE として PHP の実行が行われる事で納得する事ができます。  ■ integer の 0 (ゼロ)  ■ float の 0.0 (ゼロ)  ■ 空の文字列、 および文字列の "0" ※ PHP: gettype - Manual
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$a = (int)0;

if ( $a == FALSE ) {
	print "整数<br>";
	print gettype($a) . "<hr>";
}

$a = (float)0;

if ( $a == FALSE ) {
	print "浮動小数点数<br>";
	print gettype($a) . "<hr>";
}

$a = "0";

if ( $a == FALSE ) {
	print "文字列<br>";
	print gettype($a) . "<hr>";
}

$a = "";

if ( $a == FALSE ) {
	print "空文字列<br>";
	print gettype($a) . "<hr>";
}

$a = NULL;

if ( $a == FALSE ) {
	print "NULL<br>";
	print gettype($a) . "<hr>";
}

?>

整数
integer
浮動小数点数
double
文字列
string
空文字列
string
NULL
NULL
但し、=== 演算子を使用するとその限りではありません
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$a = false;

if ( $a === FALSE ) {
	print "真偽値<br>";
	print gettype($a) . "<hr>";
}

$a = (int)0;

if ( $a === FALSE ) {
	print "整数<br>";
	print gettype($a) . "<hr>";
}

$a = (float)0;

if ( $a === FALSE ) {
	print "浮動小数点数<br>";
	print gettype($a) . "<hr>";
}

$a = "0";

if ( $a === FALSE ) {
	print "文字列<br>";
	print gettype($a) . "<hr>";
}

$a = "";

if ( $a === FALSE ) {
	print "空文字列<br>";
	print gettype($a) . "<hr>";
}

$a = NULL;

if ( $a === FALSE ) {
	print "NULL<br>";
	print gettype($a) . "<hr>";
}

?>


if ( (bool)$a === FALSE ) { と書くと一致します


更新履歴
2010-10-17 : 記事作成
2013-05-04 : フォントサイズ・改行調整



posted by at 2013-05-04 13:37 | 文法 | このブログの読者になる | 更新情報をチェックする