スクリプト言語PHP攻略法

45
Webとデータベースの連携プログラミング ~スクリプト言語 PHP攻略法~ 日本PHPユーザー会 http://www.php.gr.jp/ 廣川 <[email protected]> <[email protected]> 日時:2000523日(火曜日)18:3021:00 会場:日本オラクル株式会社 本社 12Fセミナールーム

description

2000年5月23日 Project Blueで行ったPHP4紹介とデモ

Transcript of スクリプト言語PHP攻略法

Page 1: スクリプト言語PHP攻略法

Webとデータベースの連携プログラミング ~スクリプト言語 PHP攻略法~

日本PHPユーザー会 http://www.php.gr.jp/

廣川 類 <[email protected]> <[email protected]>

日時:2000年5月23日(火曜日)18:30~21:00会場:日本オラクル株式会社 本社 12Fセミナールーム

Page 2: スクリプト言語PHP攻略法

1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)

Page 3: スクリプト言語PHP攻略法

Webアプリケーション

「Webブラウザ+Webサーバー+データベース」により3層アプリケーションを容易に実現する。→開発が容易

Webアプリケーションに必要な機能 ユーザ入力に応じて動的にコンテンツを生成。

安定性

ユーザ入力に対する迅速な応答

開発効率・メンテナンス性に優れること。(低コスト)

Page 4: スクリプト言語PHP攻略法

動的Webコンテンツの実現方法

クライアントサイドスクリプト サーバーサイドスクリプト

長所

短所

実装

サーバーへの負荷が低い

CGIの場合、サーバーへの負荷がやや高い

必要な機能をクライアントによらず実現できる

実現可能な機能がブラウザに依存する

コードがユーザに見えてしまう

JavaScript, VBScript Perl-CGI, PHP, ASP

Webブラウザ側で実行 Webサーバー側で実行

Page 5: スクリプト言語PHP攻略法

PHPと他のソリューション

WinNT IIS ASP SQL-Server

O/SWebサーバ

Webミドルウエア RDBMS

これから Linux Apache PHP PostgreSQL

従来

PHP+Apache+PostgreSQLは現在最強の組み合わせ

シェア60%

Page 6: スクリプト言語PHP攻略法

PHP:Hypertext Preprocessor の特徴

データベース連携アプリを容易に実現可能

HTML埋込型Webスクリプト言語

HTMLとの高い親和性。→開発効率が高い。

オープンソース

コミュニティによる開発。無償で使用可能。

マルチプラットホーム

UNIX系(Linux等), MS-Windows等で動作

WebサーバApacheとの高い親和性

Apacheモジュールとして高速動作、低負荷

各種データベース、ライブラリと接続・使用可能

Page 7: スクリプト言語PHP攻略法

PHP:言語としての特徴

Perl、Java、Cに似た記述

→親しみやすく、習熟が容易

ユーザ入力(POST,GET,クッキー)を自動的に

変数に変換

デバッグが容易

→エラー行と原因が表示される。

ユーザ関数やクラスによる機能拡張が可能

→有用な機能の共有化

Page 8: スクリプト言語PHP攻略法

CGI版とモジュール版の違い

ブラウザ

CGIプロセスWeb

サーバー

URLリクエスト

子プロセス起動

出力結果

出力結果

CGIプログラム

ロード

CGI

ブラウザ

PHP解析・実行部

Webサーバー

URLリクエスト

出力結果 PHPスクリプト

Apacheモジュール

スクリプトロード

Webサーバーと別プロセスで実行→応答時間・サーバー負荷大

Webサーバーと同一プロセスで実行→応答時間・サーバー負荷小

mod_php

Apache

Page 9: スクリプト言語PHP攻略法

PHPとデータベース/ライブラリ

データベース

アプリケーションライブラリ

IMAP4

XML正規表現

PostgreSQL

Oracle

ODBCMySQL

DB2Sybase

SQL Server

Informix

PDF

POP3

LDAP

Image(PNG,GIF)

FTP

SMTP

Java

COM

Page 10: スクリプト言語PHP攻略法

PHPのインストール

ソースコードからインストール

(1) PHP Webサイト(http://www.php.net/)から入手

(2) ApacheをDSO版でコンパイル

(3) Apacheモジュール版PHP(mod_php)をコンパイル

バイナリからインストール

各種Linuxディストリビューションに付属

RPMファイルによる配布AlpHa FACTORY http://alpha.or.jp/

Page 11: スクリプト言語PHP攻略法

PHPによるプログラミング

http://localhost/hello.php?name=Taro

<html><head><title>test page</title></head><body>

<?phpecho “Hello, $name”;?>

</body></html>

hello.php

Hello, Taro

POST,GET,クッキー変数は自動的に変数に変換される。

エラー発生時は該当行を表示

Page 12: スクリプト言語PHP攻略法

phpDB

PHPによるWebアプリケーション

phorum

BBS

Skyboard

Groupware

w-agora

UNIUS-LiteELIAS-LX

NeoBoardDatabase API

PHPlib

PEAR/DB

Page 13: スクリプト言語PHP攻略法

PHPの普及

PHP/FI 2

PHP3

PHP4

PHP国際化プロジェクト開始

「PHP徹底攻略」出版

日本PHPユーザ会設立PHP4リリース

15,0001995

1996

1997

1998

1999

2000

Rasmus LerdorfによりPHP/FI開発

PHP/FI日本語Webページ,日本語ML

PHP/FI日本語マニュアル作成プロジェクト

PHP/FI日本語パッチ

PHP3開発(新開発体制へ移行)

PHP3日本語マニュアル作成プロジェクト

PHP3日本語パッチ

50,000

150,000

2,000,000

Page 14: スクリプト言語PHP攻略法

PHPの開発体制

Rasmus Lerdorf

1995年PHPを開発1996年PHP/FI2を開発San Francisco, USALinuxcare Inc.

Senior Open-source Researcher

Andi Gutmans

Zeev Suraski

1997年PHP3を開発1999年Zendを設立

Israel

CTO of Zend Technologies Ltd.

Stig BakkenPHP ManualNorwayFAST Search and Transfer

Egon SchmidPHP ManualGermanySIX Offene Systeme GmbH

Thies ArntzenOracle moduleGermanyCTO of Digital Collections

Michael WideniusMySQL moduleSwedenCTO of MySQL

Page 15: スクリプト言語PHP攻略法

日本PHPユーザ会

PHPユーザ相互の情報交換およびコミュニティの健全な発展

設立趣旨

• 高性能Webミドルウエアへのニーズ増大• オープンソースソフトウエアの発展

背景

国内PHPユーザの増加

活動内容(WG)2000/4 Linux Conference 2000にて設立記者会見

http://www.php.gr.jp/

Web

プロジェクト別ML

マニュアル、FAQ

無償セミナ等

ドキュメント整備

セミナー・イベント

メーリングリスト

PHP4の国際化等

国際化

Page 16: スクリプト言語PHP攻略法

1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)

Page 17: スクリプト言語PHP攻略法

PHP3の構成と課題

Modules API

PostgreSQL

MySQL

Oracle

ODBC

RDBMS

LDAP

IMAP

PDF

XML

GD 正規表現

Web Browser Apache

Server API

PHP Engine

ParserPHP Script

Resource Manager

Executer

Function Module Interface

PHPLIB

CGI

Class Library

• マルチスレッド未対応• Native APIがApacheのみ• 大規模コードでの速度低下•セッション管理の欠如

問題点

Page 18: スクリプト言語PHP攻略法

PHP4の新機能

Zend Engine

マルチスレッド化 複数Webサーバ対応

実行時コンパイラ

リソース管理強化信頼性の向上

高速化

大規模アプリ対応

Add-on

PHP

Zend Compiler

Zend Optimizer標準クラス(PEAR)

セッション機能

言語強化(PHP3上位互換)

Zend Cache

MySQLクライアントライブラリ

Page 19: スクリプト言語PHP攻略法

PHP4の構成

Modules API

PostgreSQL

MySQL

Oracle

ODBC

RDBMS

LDAP

IMAP

PDF

XML

GD

正規表現

Web Browser

ApacheAOL Server

IIS

Server API

Zend Engine

Runtime Compiler PHP Script

Thread Safe Resource Manager

Executer

Function Module Interface

Java

PEAR

CGI

Class Library

Zend Add-in

Zend Optimizer

Zend Cache

Zend Compiler

Page 20: スクリプト言語PHP攻略法

PHP4の新機能:セッション

セッション機能のサポート HTTPは状態を保存しない→セッションデータ保持が必要

PHP3ではPHPLIB等の外部ライブラリを使用

セッションIDによる管理→クライアント側に保存:(1)クッキー、(2)GET

セッションデータ保存(1)ファイル、(2)共有メモリ、(3)ユーザ定義(RDBMS等)

session_start(); // セッションを開始print($counter);$counter++;session_register(”counter”); // セッション変数を登録 // session_register($counter);は間違い!

Page 21: スクリプト言語PHP攻略法

PHP4の新機能:言語の拡張

foreach文

ヒア・ドキュメント

reset( $arr );while( list( , $value ) = each( $arr ) ) { echo "Value: $value<br>\n";}

foreach( $arr as $value ) { echo "Value: $value<br>\n";}

print <<<EOS Hello! This is a pen!EOS;

PHP3 PHP4

Page 22: スクリプト言語PHP攻略法

while( $row = sql_get_row($result_handle)) { print query_result($row, "name"); query_free($row); }

PHP4の新機能:リソース管理の強化

Reference Counting

PHP3では必要。これを行わないとスクリプト実行終了時までメモリが開放されない。→PHP4では自動的に開放される。

メモリ節約 速度向上 リソース管理自動化

$a=array(1,2,3); // (1,2,3)の参照カウンタ1$b=$a; // (1,2,3)の参照カウンタ1→2、コピーは行われない。$a=5; // (1,2,3)の参照カウンタ2→1$b=0; // (1,2,3)の参照カウンタ1→0(データは自動的に破棄)

Page 23: スクリプト言語PHP攻略法

PHP4の新機能:ライブラリ拡張の強化

PHP4では拡張機能の組込手順が統一され,共有ライブラリ化も容易に。

組込モジュール

共有モジュール

$ tar xzvf foo.tar.gz # アーカイブ解凍

$ cd foo # モジュールソースに移動 $ phpize # 構築環境設定 $ ./configure [--options] # makefile等を作成 $ make install # 構築&インストール php.ini で extension=foo.so を指定すれば起動時にロードされる。

$ cd path-to-php-4.0 # PHP4のソースディレクトリに移動 $ tar xzvf foo.tar.gz -C ext/ # アーカイブ解凍 $ ./buildconf # 構築環境設定 $ ./configure [--options] # makefile等を作成 $ make install # 構築&インストール

Page 24: スクリプト言語PHP攻略法

PHP4の新機能:Zendアドオン

Zend Optimizer スクリプトコードの最適化により大幅に高速化

現在β2版リリース中

Zend Cacheコンパイル後のコードをメモリ上にキャッシュ→コンパイル、ロードの時間を節約

Zend Compiler スクリプトコードの隠蔽が可能

→企業ユーザ、商用アプリ開発者にメリット

Page 25: スクリプト言語PHP攻略法

ベンチマーク: PHP4 対 PHP3

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

Sort Database

PHP3

PHP4

PHP4/Optimizer

Linux box, with a 100MHz Pentium CPU and 24MB of RAM

PHP/Zendα版(1999/10)にて実施

Page 26: スクリプト言語PHP攻略法

ベンチマーク: PHP4 対 ASP

0

10

20

30

40

50

Sort Mandelbrot Loop

ASP

PHP4

PHP4/Optimizer

NT4.0SP4+IIS4.0 P2-233 128MB RAM (PHP+ISAPI,ASP+VBScript)

[s]PHP/Zendα版(1999/10)にて実施

Page 27: スクリプト言語PHP攻略法

1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)

Page 28: スクリプト言語PHP攻略法

PHPとデータベースの連携

処理の流れ

持続的接続 (Persistent Connection) 同一ホスト、同一ユーザの接続がすでにオープンされている場合は、既存の接続を用いる。→ 特にOracleのように接続負荷が大きい場合に効果的

$conn = sql_connect ($hostname); // 接続をオープン$result = sql_query(”select * from tablename”,$conn); // クエリーを実行while( $row = sql_get_row ($conn,$result)){ // レコードを取得 print query_result ($row, “name”); // カラムを表示}

Page 29: スクリプト言語PHP攻略法

PHPと標準クラス

なぜクラスの標準化が必要か?

背景:

PHP組込関数ではWebアプリに必要な機能を実装できない。

→ユーザ関数として作成・配布

→同一機能・複数実装による非効率、コード仕様が不統一

クラス標準化の試み

PHPlib :PHP Base Library

PEAR

Page 30: スクリプト言語PHP攻略法

PHPと標準クラス:PHPLIBの概要

機能 DB抽象化: DB_Sqlクラス

PostgreSQL,MySQL,Oracle,ODBC,...をサポート

セッション管理: Sessionクラス

クッキーまたはGET変数を使用

認証:Authクラス チャレンジレスポンス認証、有効時間を指定可能。

パーミッション管理:Permクラス ユーザ保有権限(管理者、一般ユーザ)毎のアクセス管理

ユーザ管理:Userクラス

テンプレート:Templateクラス

資料:PHPlibドキュメントの翻訳が進行中http://www.php.gr.jp/php/phplib/

PHP

DB_sql

Session

Auth

Perm User

Page 31: スクリプト言語PHP攻略法

PHPと標準クラス:PHPLIBの使用例

PHPlibの認証:Basic認証との違い Basic認証ではカスタマイズ不可:有効期限設定、入力データ項目変更

パスワードがそのままネットワーク上を流れてしまう。→チャレンジレスポンス認証:JavaScriptによりパスワードをMD5ハッシュ化

使用例

<?php // local.inc にてサブクラスを作成しておく // セッション・認証・パーミッション機能付ページをオープン page_open( array("sess"=>"Foo_Session","auth"=>"Foo_Callenge_Auth","perm"=>"Foo_Perm")); $sess->register("counter"); // セッション変数登録 print ++$counter; if($perm->have_perm("admin")){ // 権限チェック echo "あなたは管理者権限を保有しています。"; } page_close(); // セッション・認証ページを終了?>

Page 32: スクリプト言語PHP攻略法

PHPと標準クラス:PEAR クラスの標準化 → PerlのCPAN, TeXのCTAN 機能

DB: DB抽象化クラス(MySQL,PostgreSQL,ODBC,...) FILE: ファイル操作

使用例

<?php // PEAR/DB サンプル$dsn = "odbc://nobody:nobody@test"; // ODBC// $dsn = "pgsql://nobody:nobody@localhost/test"; // PostgreSQL$obj = DB::connect($dsn); // データベースに接続$res = $obj->simpleQuery(“select * from product”); // クエリ実行while($row = $obj->fetchRow($res)){ // 結果を取得・表示 print join(":",$row) . "<BR>\n";}?>

DSNの指定方法: データベース種類://ユーザ名:パスワード@ホスト名/データベース

Page 33: スクリプト言語PHP攻略法

PHPとXML

EXPATApache標準、各タグに処理用のコールバック関数を定義

LIBXMLGNOME標準、DOM(Document Object Model)

WDDX(Web Distributed Data Exchange)

受け渡しデータ用フォーマット:シリアル化

XML/XSLT

現状では未サポートだが、将来的にサポート予定。

Page 34: スクリプト言語PHP攻略法

PHPとPDF

PDF (Portable Document Format) 電子文書フォーマットの標準

PDF-APIにより動的にPDFを作成可能

API:PDFlib,ClibPDF 日本語に対応(PDFlib:3.0以降,ClibPDF:2.0以降) PDFのマージには未対応

ライセンス: 非商用は無料、商用利用は有償

Page 35: スクリプト言語PHP攻略法

大規模プロジェクトへの対応

小規模~中規模のアプリケーション→HTML埋込型スクリプトPHPによる効率的な開発

中規模~大規模になると... Webサイトレベルの管理が必要。

デザイン、スクリプトの分離 テンプレートクラス

アプリケーションサーバー Midgard-Project: http://www.midgard-project.org/

Page 36: スクリプト言語PHP攻略法

1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)

Page 37: スクリプト言語PHP攻略法

PHPと国際化:日本語使用時の問題

ブラウザ

PHP

Webサーバー

RDBMSイメージライブラリ

①フォーム情報漢字コード不明

②クエリ送信(漢字コード固定)

③データ

④データ (漢字コード固定)

⑤画像(バイナリ)

⑥ HTMLまたは画像(バイナリ)

文字化け発生

内部データ(漢字コード固定)

Page 38: スクリプト言語PHP攻略法

PHPと国際化:機能

• ブラウザにより複数の漢字コード (SJIS、EUC等)が入出力される → 文字化け発生• 関数がマルチバイト文字に未対応

課題

• 内部コード・入出力コード自動変換 (SJIS,EUC,UTF-8,...)• マルチバイト対応文字列関数 mbstrlen($str),...• マルチバイト対応正規表現関数 mbregex(),...• 適切なメールMIMEヘッダ・ボディーのエンコード• 全文検索エンジン(Namazu )

変換 engine

1.PHP3用2. iconv(glibc 2.x)

Page 39: スクリプト言語PHP攻略法

国際化版PHPによるプログラミング

設定ファイル(php.ini/php3.ini)にて設定

Tips 画像出力時は自動変換を無効にする。

i18n_http_output("path");

GET変数で日本語を渡す際にはURLエンコードを行う。

<A href="foo.php?name=<? echo urlencode($name) ?>">リンク</A>

POSTの入力コード(shift_jis<->euc-jp)の自動認識がうまくいかない場合:

hiddenパラメータでダミー文字列を指定。

i18n.http_output = SJIS ; 出力コードi18n.internal_encoding = EUC-JP ; 内部コードi18n.script_encoding = auto ; PHPスクリプトのコードi18n.http_input = auto ; 入力のコードi18n.http_input_default = SJIS ; 入力コードのデフォルト値(不明な場合)

Page 40: スクリプト言語PHP攻略法

国際化版PHP4の現状

PHP3は既に国際化を実施。ただし、本家へのマージは未了。

コード変換関数、マルチバイト関数を拡張モジュールとして提供

ftp://night.fminn.nagano.nagano.jp/php4/ から入手。

php-4.0XXX_jstring-1.0 : 日本語コード変換、マルチバイト対応関数、メール関数

php-4.0XXX_mbregex-1.0 : マルチバイト対応正規表現

php-4.0XXX_iconv-1.0 : iconvによるコード変換:glibc-2.x

php-4.0XXX_namazu-2.0 : 全文検索エンジンNamazu

入出力コードの自動変換は未サポート

PHP4ではデフォルト文字コードを指定可能 (php.iniで指定)

default_charset = "euc-jp"

Page 41: スクリプト言語PHP攻略法

1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)

Page 42: スクリプト言語PHP攻略法

PHPの未来

国際化

どうやって本家にマージするか?

XML/XSLT

大規模プロジェクトへの対応

Webアプリケーションサーバー化:Midguardプロジェクト

テンプレートエンジン

標準クラスの整備:PEAR

Page 43: スクリプト言語PHP攻略法

PHPに関する情報源

関連URL(英語) PHP http://www.php.net/ Zend http://www.zend.com/ PHPBuilder http://www.phpbuilder.com/ DevShed http://www.devshed.com/Server_Side/PHP/ PHP Function Table http://www.zugeschaut-und-mitgebaut.de/php/

関連URL(日本語) 日本PHPユーザ会 http://www.php.gr.jp/ 広川のページ http://www.cityfujisawa.ne.jp/~louis/apps/phpfi/

メーリングリスト 日本語ML:php-jp,ユーザ会,国際化

英語ML:[email protected] php-general,php-windows,php-i18n,php-db,php-dev,php-pear,php-kb

Page 44: スクリプト言語PHP攻略法

まとめ

PHPの特徴

親しみやすいスクリプト言語

データベース(PostgreSQLとの)との高い親和性

Apacheモジュールによる高速実行

オープンソースによる開発

PHP4/Zendによるさらなる高機能化

PHP国際化作業は今後も課題

Page 45: スクリプト言語PHP攻略法

PHPに関するデモ(Linux)

(1)PHP全般

(2)全文検索エンジン(Namazu)

(3)テンプレート:PHPlib

(4)認証、許可属性:PHPlib

(5)データベースとの連携(PEAR/DBの使用例)

(6)PDFドキュメントの動的生成http://www.cityfujisawa.ne.jp/~louis/apps/phpfi/samples/ にてコード公開(予定)