講義用スタイル
印刷用スタイル

サーバサイドプログラミングについて

WWW のさらなる仕組み

動的WEBページ

WWWとは で説明したように、 WWW サー バは基本的にはあらかじめ用意されたページを返すのですが、 もっと自分のページを動的 にしたい、例えば、「来訪者カウン タ(自分のページに何人来たか)を表示させたい」とか「メッセージを何 か書きこんでもらう」などという要求があるのは当然のことです。

これを実現しようと思えばやはり「プログラム」が必要です。ただ一言 で「プログラム作ってWEBページで動かす」といっても、大きく次の2つ に分れました。

です。これらのうち前者のクライアント側(ブラウザ)で動くものとしては、 JavaScript などがあります。これらは原則 的に 状態が保存できない ため、ユーザの使い勝手をよくするとか、 見た目を修飾する等の用途に使われます(説明は別資料)。

過去にはクライアント側で Java applet や VBScript が使われていたこともあ りますが、最近はほとんど見なくなりました (JavaScript で十分いろいろなこ とが出来る)。逆に、サーバー側で JavaScript を動かす Node.js というのも あります。
後者は、最近では「Webアプリケーション」と呼ばれることが多いも のですが、「サーバ側で動かす」ことにより、サーバー上のデータ(情報) を変化・保存 することが可能となりますので、多彩な応用ができます。 ネット通販に代表されるように、現在のインターネットビジネスは、この技術 無しでは考えられません。サーバー側でプログラムを動かす方法としては、 Java Servletや ASP.NET 等があります。歴史的に、まず最初に実現されたの は CGI (Common Gateway Interface) とSSI (Server Side Include, 仕組みは CGI とほぼ同様なので詳細は略) です。
なぜ歴史的にサーバー側が先か、ということですが、サーバー側で動かす分に はクライアント側(ブラウザ)の変更は必要ないから、という理由が大きかっ たと思われます。圧倒的にクライアント側のほうが数が多く、かつ当時のクラ イアントコンピュータ(パソコン)は計算能力がさほど高くなかったので、ブ ラウザの変更と普及をいきなりするのは結構大変だったと思われます。

ちなみに CGI の最初とされる 1993 年当時、前田所有のパソコンのCPUは Intel i486/DX2 66MHz でメモリは 8Mb, ディスクは200Mb 程度 でした。それ でも Linux がちゃんと動いて感動した覚えがあります。

CGIとは?

CGI とは、サーバーホスト上で、WWW サーバプログラムが自分以外のプロ グラムを呼び出し、目的とする処理を依頼し、(HTML形式で記述されてい る)処理結果をWWW ブラウザに送りかえす仕組みです。ここで、呼び出した外 部プログラムのことをゲートウェイと呼ぶことがあり、CGI という言葉ができ ました。以下の図のように、サーバーが外部プログラムの助けを借りて処理を おこなっています。(上の普通の WWW の場合と見比べながら仕組みを理解する のが良いかもしれません。)

CGI

この外部プログラムはそのサーバー上で動くプログラムであればどのような言 語・開発環境でも良いです。とはいえ、初期の CGI では perl が最も一般的で した。それは、perl の特徴が CGI の要求によくマッチしていたからです。す なわち、

しかし、今では、perl でごりごり書くのは流行らなくて、PHP/Python/Ruby で 書き、さらに言うと、スクラッチから書くのではなくアプリケーションフレー ムワーク使って開発、というものが大規模サイトでも主流となっているようで す(ここでは詳細は略)。

CGIの次に

上の説明のように、 Web アプリケーションの元祖(?)である CGI とは、 サーバホスト上で WWW サーバ(デーモンプロセス)が自分以外のプ ログラム を呼び出し目的とする処理を依頼し、(HTML形式で記述さ れている)処理結果をWWW ブラウザに送りかえす仕組みです。つまり、サー バが外部プログラムの助けを借りて処理をおこなっているわけです。

この外部プログラムを起動する、ということは、サーバ自身を改造するこ となくサーバサイドプログラミングを実現するという意味では意義があっ たのですが、実はこれはサーバマシンにとって重い(CPU,メモリを消 費する)処理で、CGI が発明された時から(同時に多数のアクセス をうけた場合パフォーマンスが低下したり、ひどい場合にはサービスが停 止する等の)問題がありました。そこで、WWW サーバから別のプログラム を呼び出すのではなく、サーバの一部としてプログラムを動かしたいとい う要求が出て来ました。サーバでもクライアントでもどちらで動かして もいい場合はクライアント側での JavaScript などで対応できますが、ネッ ト通販、ブログ等の永続的(セッションを切ってもサーバー側に保存 される)データ処理等はどうしてもサーバ側での処理じゃないと、 構造的に実現不可能です。

そこで発明されたのが PHP です。PHPは、Webサーバソフト (Apache etc.) の モジュール として動作する、スクリプト言語を実行 する環境です。

ちなみに PHPの生い立ちを簡単になぞると…
1994年秋、Rasmus Lerdorf(グリーンランド生まれのデンマーク育ち)が自分 の履歴書ページの閲覧者を調べるために作っていた Perl スクリプト 「Personal Home Page Tools」 を C言語で書き直し、HTMLフォームを扱える動 的な Webアプリケーションのための機能 「Form Interpreter」 に拡張したの が始まりとされ、その頭文字をとって、「PHP/FI」と呼ばれました。 Lerdorf はこのソフトウエアの開発に誰でも参加できるようにしていたこと、 つまりオープン・ソースとしたことで大勢の開発者の支持を得ました。その後、 PHP開発の主体は個人からグループへ変化し、やがて、C、Perl 等の仕様まで取 り入れるように拡張され、技術者にとって非常に取り組みやすい言語として発 展ました。現在では、PHPは「PHP is Hypertext Pre-processer」 の 略ということになっています。
モジュール とは、プログラムに後で組み込んで機能を拡張す る仕組みのことです。つまりHTML文書中に記述されたスクリプトを apache に モジュール として組み込まれた PHP エンジン(インター プリタ)が実行し、結果を HTMLデータとしてWebブラウザに出力する仕 組みです。

PHP

ちなみに最近の apache では、perl, python 等もモジュールとして動く仕組 みができていますので、昔ほど負荷は高くないようです。が、それでも php の軽さにはかなわないようです。あと、perl に関しては仕様の複雑さ(同じ 処理をいろんな書き方で書けるので、他人が書いたコードが読み辛い)も近年 避けられてる要因の1つです。

PHP の利点

サーバーサイドのWebアプリケーションを開発する言語は、お馴染みの Perl、 Java、ASP などがあります。CGIプログラムを開発する perl言語は、多くの Webアプリケーションで利用されてきました。多分これからも無くなることは 無いと思いますが、perl は、言語的に複雑で、柔軟性がありすぎてソー スコードが汚くなりやすいですし、なにより CGI として起動する場合に は処理が重いという欠点があります。 PHPは、perl と同様にテキス トベースで構築できる手軽さがあり、基本的に HTMLファイルに埋め込む言語 であるため、簡単なテキストエディタがあれば、誰でも書くことができるとい う利点はそのままです。

PHPが利用されている理由を整理すると以下のようになるかと思います。

こうした特徴を持つ PHPは、いろいろなサイトでも採用されています。また、 apache 以外の Webサーバでも PHPを実装しつつあることから、より多くのサイ トでも PHP が使われています。
とはいえ直近で言うと、php はセキュリティ的に潜在的な弱さがある(php 自 体というわけではないが、つい脆弱なプログラムを書いてしまう可能性がある) ので、人気は翳りをみせています。

PHP はじめの第一歩

まずはとにかく動かしてみる、ということで、スクリプトを 作ってみましょう。
  1. TeraTerm で liweb にログインして、
    $  cd public_html 
    $  nano phpinfo.php 
    
    ($ はプロンプトなので、赤字のところだけ入力する)して nano エディタ を開き、
    <?php
    phpinfo();
    ?>
    
    を入力して、^X で保存して終了します。

  2. そうしてサーバに

    http://liweb.hannan-u.ac.jp/~giXXXXX/phpinfo.php

    (giXXXXX は各自のユーザ名)で(サーバプログラム経由で!)アク セスすれば、php に関するいろいろな情報がえられます。これは実際インストー ル後のテストの定番です。

    【超重要!!】

    「サーバプログラム経由で」のアクセスが本質です。つまりWindows のファイル操作として ローカルに phpinfo.php を作ってダブルクリック しただけでは駄目(!) で、HTTP により WWW サーバプログラムである apache (のmod_phpモジュール)が動くようにアクセスしないと phpエン ジンは動きようがない =プログラムは動作しない、です。

    JavaScript は ブラウザ側に処理エンジン(インタープリタ)があ る ので、javascript-sample.html を Edge等で開くだけで動かすことが 出来るわけです。この違いを是非理解してください(過去の受講生でこれを全 く理解出来てない人が少なからずいました…)

PHPコードの埋め込み

PHPは、Webアプリケーション構築を前提に開発された言語です。そ のため、Webアプリケーション開発で頻繁に使用される処理などを簡単に利用 できます。また、HTMLとの相性が良いことでも知られています。

HTMLテキストの中にPHPコードを埋め込むには、<?php 〜 ?>を用います。 PHPは、HTMLテキストのデザインを崩すことなくコードを埋め込むこ とができるため、プログラマーだけでなく本格的なプログラミング経験がない Webデザイナーなどからも支持されています。

もちろん HTMLタグと閉じタグの間にも処理を埋め込むことができます。

<span style="color: red"><?php print "こんにちは" ?></span>

プログラミング言語としての PHP

PHP は型の無い言語です。変数は perl 同様$で始まる英 数字であらわし、宣言も不要です(インタープリタ系のデフォルト)。文 (statement) のおわりは ";" (semicolon) で終わるのも、 C/C++/Java/perl/... と同じです。

あと、当たりまえなのですが、PHP は他のプログラミング言語が持つ制御構造 はほとんどすべてサポートしてます。(リンクをはってるので実行結果も確認 して)以下の例を参考にしてく ださい。

<html>
<head>
<title>
PHP examples
</title>
</head>
<body>
<?php
$var1 = 10;
$var2 = 2;
print "var1: $var1, var2: $var2 <p> " ;

print "var1 + var2= "; print $var1 + $var2 ; print "<br>" ;
print "var1 - var2= "; print $var1 - $var2 ; print "<br>" ;
print "var1 * var2= "; print $var1 * $var2 ; print "<br>" ;
print "var1 / var2= "; print $var1 / $var2 ; print "<br>" ;

if ($var1 == 1) {
  print "var1 is one\n";
} else {
  print "var1 is not one\n";
}
print "<p>" ;
while ($var1 > 0) {
  print "Now var1 is $var1.<br>" ;
  $var1 -= 1;
}
?>
</body>
</html>

フォーム処理

Webアプリケーションで頻繁に使用される処理に「フォーム処理」が あります。通常、<form>タグのaction属性で指定されたWebアプリケー ションは送信されたデータの解析、各フォームデータの抽出、格納などの複雑 な手順を踏む必要があります。しかし、PHPではそのような複雑な手順を省略 して、GET method で渡されるデータに関しては「$_GET["name属性"]」 で値を取り出せます。 下記リスト(htmlと、それが呼び出す php スクリプト)は入力&送信されたフォー ムデータを「$_GET["input1"]」「$_GET["input2"]」を利用して、画面に表示させる例です。

sample.php

<!doctype html> <html> <head> <meta charset="utf-8"> </head> <body> <h1> php input sample</h1> <?php print "結果: "; print $_GET["input1"]; print " and "; print $_GET["input2"]; ?> <hr> <form action="sample.php" method="GET"> <input type="text" name="input1"> <input type="text" name="input2"> <input type="submit" value="送信"> </form> </body> </html> ここでは漢字コードの処理は省略しているので ASCII 以外の文字列を入力す ると文字化けするかもしれません。
最近の環境では、とりあえず UTF-8 にしておけばなんとかなる可能性が大です。
あと、<form>タグのmethod属性を「GET」から「POST」に変更する場合 は、「$_POST["name属性"]」を使用します。GETメソッドでは送信できるデー タの大きさに限界がありますし、またデータ内容を URL の一部として簡単に 盗み見ることができるため、多くの場合は POSTメソッドが使用されるます。 しかし逆に、検索結果まで URL として他人に教えたい場合は GET も使われる ということも、ここで再確認しておいてください。

ちなみに $_POSTや$_GETはスーパーグローバル変数と呼ばれ、PHPであらかじ め用意された連想配列(配列のインデックスとして数字ではなく文字列で指定 できるもの)です。ちなみに、ほかにもPOSTとGETどちらにも対応する 「$_REQUEST["name属性"]」があります。

ファイル I/O

他のプログラミング言語同様、ファイルの入出力をサポートしています。 操作の基本は;
  1. まずファイルをオープンします。その時に、読込用か、書き出し用か、書 き足し(追加)用かを指定します。オープンした時に帰って来る値は以降その ファイルを指し示すのに使うもので、ファイルディスクリプタと呼びます。
  2. ファイルの入出力処理をおこないます。
  3. 処理がおわったら、ファイルを閉じます(クローズ)
です。ここで、使われるファイルはクライアント側ではなく サーバー側 であることに注意してください。これで、Web アプリケーションによる (保存もできる)データ処理が可能になるわけです。以下に 簡単な例 をしめします。

<?php $fp = fopen("no-flock.txt", "a+"); // ファイルを書き足しでオープン for ($i=0;$i<10;$i++) { // $i が 0 から 9 (10 未満)まで=10回繰り返し $s = "Write " . $i . ";\n"; // $i を表示するための文字列をつくって fwrite($fp, $s); // その文字列をファイルに出力 sleep(1); // 1秒待つ } fclose($fp); // ループを抜けたらファイルを閉じる ?> Finished!

おわりに

以上のような機構により、非常に簡単にサーバーサイドの処理ができるように なっています。実際には php というのはもっと奥が深い(オブジェクト指向 をサポートしてる、等…データベースアクセスに関しては続編)のですが、詳 細は他の資料にゆずりますので、興味のある人は自分でいろいろ調べてくださ い。
前田としゆき maechan@hannan-u.ac.jp

講義用スタイル
印刷用スタイル (開いてから、ページを再度更新してください)