サーバーサイドインクルード フォームとCGI目次 ファイルのアップロード

ダイナミックドキュメント機能

ダイナミックドキュメント機能は、主として株価情報や天気予報など時間とともに刻々と内容が変わるページやアニメーションの作成で使われます。ネットスケープ1.1からサポートされたダイナミックドキュメント機能には「クライアントプル」と「サーバプッシュ」の2種類があり、これらはHTML3.0の<meta>タグやMIMEを利用したものです。

クライアントプル
HTTP応答または文書のヘッダ部へ、たとえば5秒おきにデータを再ロードするというような、ダイナミックドキュメントのための指示を書き込むことで、サーバからクライアント(読者)へデータを送ります。
サーバプッシュ
サーバの好きな時にデータを送り、そのデータがブラウザ(閲覧ソフト)へ表示されます。

クライアントプルでは要求があるたびにHTTPへ接続し、サーバプッシュではHTTPを接続したままという点が大きな特長で、こちらはサーバ側でデータを送る時間や回数を指定したり、クライアント側から接続を切る要求がない限り続けられることになります。言い換えれば、クライアントプルの場合はローカルでも使えますが、サーバプッシュはサ−バを接続しないと機能しません。

クライアントプル

クライアントプルは<meta>タグを拡張した機能で、たとえば「doc1.html」という文書が毎秒再ロードされるための記述例は以下のとおりです。
	
	
	<meta http-equiv="refresh" content=1>
	<title>Document 1</title>
	
	<h1>これは文書1です</h1>
	
	ここにテキストがあります。<p>
	
	
最初の<meta>タグは次のように属性を指定します。

<meta http-equiv="refresh" content="n; url=http://server/file">

http-equiv
HTTPで送る指示、"refresh"なら再ロードをしなさいという意味です。
content
HTTPで送られるメタ情報、この場合は再ロードの間隔を秒単位で表わします。
url
ここで別の文書がリンク先に指定されていると、再ロードの時はその文書が表示され、同じ文書であれば省略しても構いません。

クライアントプルの用法

  1. 再ロード先へ違うURLを指定することでdoc1.htmldoc2.html...docn.htmlと文書を移動させられます。
  2. CGIスクリプトを使って行き先のURLをランダムに指定することでネットサーフィンを行えます。
  3. リンク先へ移動する際、数秒間だけ注意書を表示したりできます。
  4. cronの実行により再ロードする文書内容を刻々と書き換えられます。
  5. クライアントのエージェント種別を見分けられます。
  6. ページを開いた時に開始音(インライン音声)を鳴らせます。
    	
    	
    	<meta http-equiv="refresh" content="1; url=http://www.yokochin.com/sound/open.au">
    	
    	
    
開始音を鳴らす上記の記述例に続き、次は別のページへ5秒間だけ移動して戻るクライアントプルのデモです。

クライアントプルの実例

サーバプッシュ

サーバプッシュはクライアントが実行するのではなく、サーバ側からデータを送信し続けるためHTTP接続がオープン状態のままとなり、送るデータ次第で通信の負荷はかなり大きくなります。したがって、クライアントとサーバ間へじゅうぶんな回線容量が要求される場合もあります。

サーバプッシュの仕組は「multipart/x-mixed-replace」というMIMEタイプを使用し、1つの文書へ複数の文書を梱包する形式です。この複数の文書を作る際、ループ機能を使えば永遠に送り続けることも可能です。サーバ側でデータ送信を止めない限りデータは送り続けられますが、クライアント側からも「Stop」ボタンを押すことで中断はできます。

サーバプッシュの文書

下記の文書はboundaryで決められた「境界文字列」を境界とした2つのデータブロックに分けることができます。この「境界文字列」を続けることで、いくつもの送信したいデータブロックを作成できます。文書の境界は2つのスラッシュを付けた「--境界文字列」を使用し、サーバプッシュ文書の最後は2つのスラッシュで挟んだ「--境界文字列--」で終ります。

 
ブラウザはデータをバッファしてから表示するため、ある程度データが溜らないと表示してくれません。したがって、ブラウザでデータをバッファするのを防止するため、サーバプッシュのCGIスクリプトは、たとえば「nph-yokochin.cgi」といった具合で、ファイル名の頭へnph-を付けたNPHスクリプトとして実行させます。そのため、下記の記述例だと最初にHTTP応答ヘッダ「HTTP/1.0 200 Okay」を出力しなければなりません。
 

	
	
	#!/bin/sh
	echo "HTTP/1.0 200"
	echo "Content-type: multipart/x-mixed-replace;boundary=境界文字列"
	echo ""
	echo "--境界文字列"
	while true
	do
	echo "Content-type: text/html"
	echo ""
	echo "<title>PS</title>>"
	echo "<h2>Process on WWW</h2>"
	<pre>
	ps ax
	</pre>
	echo "--境界文字列--"
	sleep 5
	done
	
	

サーバプッシュのインラインイメージ

サーバプッシュでは<img src>タグで表示したインラインイメージだけを刻々と変更できるため、ちょうどアニメーションやスライドショーの効果が得られます。Nick Bicanicのスクリプトを参考に、その方法を説明すると、

  1. アニメーションを実行するスクリプトはバッファを避けるため、nph-で始まるNPHスクリプトとします。
  2. アニメーション用のスクリプトを作成します。
  3. アニメーション用の画像をGIFファイルで作成します。
  4. アニメーションを表示したいHTML文書へ次のように記述します。
    	
    	
    	<img src="/scripts/nph-script.cgi?anything.txt">
    	
    	
    
また、スクリプトを作成する際の注意点は以下のとおりです。
  1. Perlが標準出力stdoutをバッファさせいないため、以下の記述を最初に行います。

    	
    
    	$|=1
    
    	
    
  2. 次にhttp_user_agent環境変数を使って、ネットスケープであるかの判断を行います。
    	
    	
    	$browser = $env{"http_user_agent"};
    	if ($browser =~ /^Mozilla/i) {
    	       print "Netscape\n";
    	       &アニメーションルーチン;
    	} else {
    	       print "HTTP/1.0 200 Okay\n";
    	       print "Content-Type: image/gif\n\n";
    	       print GIFまたはJPEGイメージ;
    	}
    	
    	
    
  3. 次にNPHスクリプトですので、HTTPの応答ヘッダを記述します。
    	
    	
    	print "HTTP/1.0 200 Okay\n";
    	
    	
    
  4. アニメーションルーチンで必要なMIMEをヘッダを記述します。
    	
    	
    	print "Content-Type: multipart/x-mixed-replace;boundary=境界文字\n\n";
    	
    	
    
    境界文字は任意の文字を指定します。

  5. 境界文字とGIFイメージリストファイルの読み込みを行います。
    	
    	
    	print "--境界文字\n";
    	open(imagefiles, @atgv[0]) || die "can not open @argv[0]: $!";
    	
    	
    
    これをnph-script.cgi?list.txtで実行し、list.txtはイメージのリストを次のように記述します。
    	
    	
    		gif0.gif
    		gif1.gif
    		  :
    		  :
    		gifn.gif
    	
    	
    
  6. 最後にアニメーション部を記述します。
    	
    	
    	while (<imagefiles>) {
    		chop $_;
    		print "Content-Type: image/gif\n\n";
    		open (S,$_);
    		print (<S>);
    		close (S);
    		print "\n--境界文字\n";
    		}
    		close(imagefiles)
    	
    	
    

サーバプッシュのインラインイメージ例

以上をまとめ、gif0.gifgif8.gifのGIFイメージ8枚を使ってユーザがストップをかけるまでアニメーションを行う記述例をご紹介します。

	
	
	#!/usr/bin/perl
	
	# ブラウザ名
	$browser = $env{"http_user_agent"};
	
	# Perlで標準出力バッファしません。
	$|=1;
	
	# ブラウザがネットスケープかどうかを判断します。
	if ($browser =~ /^Mozilla\/1.[1-9]/i) {
	    &animation;
	} else {
	    print "HTTP/1.0 200 Okay\n";
	    print "Content-type: image/gif\n\n";
	    open (s, "gif0.gif");
	    print (<s>);
	    close s;
	}
	
	# アニメーションルーチン
	sub animation {
	    print "HTTP/1.0 200 Okey\n";
	    print "Content-type: multipart/x-mixed-replace;boundary=sometex\n\n";
	
	    print "--sometext\n";
	
	    while (1) {
		for ($i=0; $i<17; $i++) {
		    print "Content-type: image/gif\n\n";
		    open (s, "gif$i.gif");
		    print (<s>);
		    close s;
		    print "\n--sometext\n";
		}
	    }
	}
	
	
このNPHスクリプトをインラインイメージの<img>タグ部で次のように設定します。
	
	
	<img src="/scripts/nph-script.cgi">
	
	
結果はこのとおりです。

アニメーションの実例
 
ネットスケープのサーバプッシュのスクリプト例でCによるソースコードがあり、このコードはパブリックドメインです。このコードを使った場合、ブラウザのバッファ問題が起こることもあるため注意して下さい。NPHスクリプトになるよう改造してみました。
 

imagemapと組み合わせる場合

インラインイメージの<img src>タグ部を以下のように変更します。
	
	
	<a href=" /scripts/imagemap/...><img border=0 src=../scripts/nph-script.cgi" ismap></a>
	
	

サーバプッシュの注意点

NCSA httpdの場合、「Content-type: multipart/x-mixed-replace;boundary=境界文字」は解釈できますが、「Content-type: multipart/x-mixed-replace; boundary=境界文字」のようなboundryの前にスペースが空いている場合は解釈できないことがあります。



Copyright (C) 1996-2003 by Yasukazu Yokoi. All Rights Reserved.