@blog.justoneplanet.info

日々勉強

PHP to HTTP Headers(PHPによるHTTPヘッダの操作)

基本的に、PHPではHTTPヘッダが自動的に生成され、クライアントに送信される。ユーザ側で任意のHTTPヘッダを加えるときには、以下のようにheader関数を使う。また、header関数はあらゆる出力の前に記述しなくてはならない。

<?php
header('Location: http://google.com');//redirect to google
?>

■リダイレクト

リダイレクトを行いたいときは、header関数の引数に以下のような記述をする。またスクリプトの実行中にユーザが読み込みを中止するなども考えられるので、exit関数を使用してスクリプトの終了を明示したほうが安全である。

<?php
header('Location: http://yahoo.com');
exit;
?>

HTTPの仕様では、Locationヘッダには(相対パスや絶対パスでなく)完全な形のURLを指定しなくてはならない。

■ページのキャッシュと有効期限

通常プロキシやブラウザはページをキャッシュするが、その有効期限を以下のように明示することができる。

<?php
$date = date("D, j M Y H:i:s", time() + (60 * 60 * 24 * 10));//10 days from now
header("Expires: {$date} UTC");
header('Cache-Control: Public');
header('Pragma: Public');
?>

また、キャッシュさせたくない場合は、以下のようにキャッシュをさせない指定とページの有効期限を過去にする指定の両方を用いるのが一般的である。

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Thu, 31 May 1984 04:35:00 GMT');
?>

但し、ブラウザ側で無視するような設定にすることもできるため、上述の設定が正しく反映されている事を前提としたプログラムを実装してはならない。

■圧縮

HTTPプロトコルはgzipによる圧縮と解凍をサポートしていて、一般的に5KBを超えるようなページに有用であり、ほとんどのブラウザでサポートされている。以下のようにスクリプトの先頭に出力バッファリング(output buffer)を開始する関数、ob_startを使用することで対応する。

<?php
ob_start('ob_gzhandler');
?>

ob_gzhandlerはページを圧縮するための組み込み関数である。また、以下のようにphp.iniファイルの記述を変更する方法でも対応できる。

zlib.output_compression = on
zlib.output_compression_level = 6

■クッキー

クッキーはWebアプリケーションがブラウザに保存する小さなテキストデータである。

クッキーは

  • 1つのクッキーは4KB以下とする
  • 1つのドメインで最大20個とする
  • 1つのクライアントで最大300個しか保持できない

クッキーをブラウザにセットする

クッキーをブラウザにセットするには、以下のようにsetcookie関数を使用する。

<?php
setcookie(name[, value[, expire[, path[, domain[, secure]]]]]]);
?>
引数について
name
クッキーの名前(空白やセミコロンは使用できない)
value
任意の文字列値
expire
有効期限。1970年1月1日午前0時から秒数でカウントした値(=time関数)。セットしなかった場合は、ブラウザが閉じられると削除される。
path
指定の配下のページのみクッキーを送信する。デフォルトは発行ページのディレクトリ以下
domain
指定のドメインのみクッキーを送信する。発行サイトのサブドメインのみ指定が可能。デフォルトは現在のサーバのホスト名
secure(bool値)
trueにするとhttps通信時のみ、クッキーを送信する。デフォルトはfalse
使用例
<?php
setcookie('key', 'value', time() + (60 * 60 * 24 * 30));
?>

クッキーをブラウザから読み取る

厳密にはブラウザは対象の全てのリクエストでクッキーを送信しているので、PHP側でのデータの受け取り方ということになる。以下のようにスーパーグローバル変数$_COOKIEを使用するとアクセスできる。

<?php
if($_COOKIE['key'] === 'value'){
    //code
}
?>

また、以下のようにクッキーに配列リテラルが含まれる場合

<?php
setcookie('name[nick]', 'value', time() + (60 * 60 * 24 * 30));
setcookie('name[john]', 'value', time() + (60 * 60 * 24 * 30));
setcookie('name[mike]', 'value', time() + (60 * 60 * 24 * 30));
?>

以下のように、$_COOKIE[‘key’]の値も配列となる。

<?php
var_dump($_COOKIE['name']);
/*
array(3) {
  ["nick"]=>
  string(5) "value"
  ["john"]=>
  string(5) "value"
  ["mike"]=>
  string(5) "value"
}
*/
?>

PHPにおいてクライアントリクエストに含まれる配列リテラルは、PHP内部で配列に変換される。COOKIEの扱い方について個人的には、PHPはPerlよりも簡単で扱いやすいと思う。

1件のコメント»

PHPでHTMLコンテンツをテキスト・ファイルに変換する

PHPを使い、インターネット上のHTMLコンテンツをシフトJISのテキスト・ファイルに変換するプログラムを作ってみる。≫デザインを一新しました。タイトルを変更しました。

RSS feed for comments on this post.TrackBack URL

Leave a comment