スクリプト言語PHP攻略法
-
Upload
rui-hirokawa -
Category
Technology
-
view
4.390 -
download
1
description
Transcript of スクリプト言語PHP攻略法
Webとデータベースの連携プログラミング ~スクリプト言語 PHP攻略法~
日本PHPユーザー会 http://www.php.gr.jp/
廣川 類 <[email protected]> <[email protected]>
日時:2000年5月23日(火曜日)18:30~21:00会場:日本オラクル株式会社 本社 12Fセミナールーム
1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)
Webアプリケーション
「Webブラウザ+Webサーバー+データベース」により3層アプリケーションを容易に実現する。→開発が容易
Webアプリケーションに必要な機能 ユーザ入力に応じて動的にコンテンツを生成。
安定性
ユーザ入力に対する迅速な応答
開発効率・メンテナンス性に優れること。(低コスト)
動的Webコンテンツの実現方法
クライアントサイドスクリプト サーバーサイドスクリプト
長所
短所
実装
サーバーへの負荷が低い
CGIの場合、サーバーへの負荷がやや高い
必要な機能をクライアントによらず実現できる
実現可能な機能がブラウザに依存する
コードがユーザに見えてしまう
JavaScript, VBScript Perl-CGI, PHP, ASP
Webブラウザ側で実行 Webサーバー側で実行
PHPと他のソリューション
WinNT IIS ASP SQL-Server
O/SWebサーバ
Webミドルウエア RDBMS
これから Linux Apache PHP PostgreSQL
従来
PHP+Apache+PostgreSQLは現在最強の組み合わせ
シェア60%
PHP:Hypertext Preprocessor の特徴
データベース連携アプリを容易に実現可能
HTML埋込型Webスクリプト言語
HTMLとの高い親和性。→開発効率が高い。
オープンソース
コミュニティによる開発。無償で使用可能。
マルチプラットホーム
UNIX系(Linux等), MS-Windows等で動作
WebサーバApacheとの高い親和性
Apacheモジュールとして高速動作、低負荷
各種データベース、ライブラリと接続・使用可能
PHP:言語としての特徴
Perl、Java、Cに似た記述
→親しみやすく、習熟が容易
ユーザ入力(POST,GET,クッキー)を自動的に
変数に変換
デバッグが容易
→エラー行と原因が表示される。
ユーザ関数やクラスによる機能拡張が可能
→有用な機能の共有化
CGI版とモジュール版の違い
ブラウザ
CGIプロセスWeb
サーバー
URLリクエスト
子プロセス起動
出力結果
出力結果
CGIプログラム
ロード
CGI
ブラウザ
PHP解析・実行部
Webサーバー
URLリクエスト
出力結果 PHPスクリプト
Apacheモジュール
スクリプトロード
Webサーバーと別プロセスで実行→応答時間・サーバー負荷大
Webサーバーと同一プロセスで実行→応答時間・サーバー負荷小
mod_php
Apache
PHPとデータベース/ライブラリ
データベース
アプリケーションライブラリ
IMAP4
XML正規表現
PostgreSQL
Oracle
ODBCMySQL
DB2Sybase
SQL Server
Informix
POP3
LDAP
Image(PNG,GIF)
FTP
SMTP
Java
COM
PHPのインストール
ソースコードからインストール
(1) PHP Webサイト(http://www.php.net/)から入手
(2) ApacheをDSO版でコンパイル
(3) Apacheモジュール版PHP(mod_php)をコンパイル
バイナリからインストール
各種Linuxディストリビューションに付属
RPMファイルによる配布AlpHa FACTORY http://alpha.or.jp/
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,クッキー変数は自動的に変数に変換される。
エラー発生時は該当行を表示
phpDB
PHPによるWebアプリケーション
phorum
BBS
Skyboard
Groupware
w-agora
UNIUS-LiteELIAS-LX
NeoBoardDatabase API
PHPlib
PEAR/DB
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
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
日本PHPユーザ会
PHPユーザ相互の情報交換およびコミュニティの健全な発展
設立趣旨
• 高性能Webミドルウエアへのニーズ増大• オープンソースソフトウエアの発展
背景
国内PHPユーザの増加
活動内容(WG)2000/4 Linux Conference 2000にて設立記者会見
http://www.php.gr.jp/
Web
プロジェクト別ML
マニュアル、FAQ
無償セミナ等
ドキュメント整備
セミナー・イベント
メーリングリスト
PHP4の国際化等
国際化
1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)
PHP3の構成と課題
Modules API
PostgreSQL
MySQL
Oracle
ODBC
RDBMS
LDAP
IMAP
XML
GD 正規表現
Web Browser Apache
Server API
PHP Engine
ParserPHP Script
Resource Manager
Executer
Function Module Interface
PHPLIB
CGI
Class Library
• マルチスレッド未対応• Native APIがApacheのみ• 大規模コードでの速度低下•セッション管理の欠如
問題点
PHP4の新機能
Zend Engine
マルチスレッド化 複数Webサーバ対応
実行時コンパイラ
リソース管理強化信頼性の向上
高速化
大規模アプリ対応
Add-on
PHP
Zend Compiler
Zend Optimizer標準クラス(PEAR)
セッション機能
言語強化(PHP3上位互換)
Zend Cache
MySQLクライアントライブラリ
PHP4の構成
Modules API
PostgreSQL
MySQL
Oracle
ODBC
RDBMS
LDAP
IMAP
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
PHP4の新機能:セッション
セッション機能のサポート HTTPは状態を保存しない→セッションデータ保持が必要
PHP3ではPHPLIB等の外部ライブラリを使用
セッションIDによる管理→クライアント側に保存:(1)クッキー、(2)GET
セッションデータ保存(1)ファイル、(2)共有メモリ、(3)ユーザ定義(RDBMS等)
session_start(); // セッションを開始print($counter);$counter++;session_register(”counter”); // セッション変数を登録 // session_register($counter);は間違い!
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
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(データは自動的に破棄)
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 # 構築&インストール
PHP4の新機能:Zendアドオン
Zend Optimizer スクリプトコードの最適化により大幅に高速化
現在β2版リリース中
Zend Cacheコンパイル後のコードをメモリ上にキャッシュ→コンパイル、ロードの時間を節約
Zend Compiler スクリプトコードの隠蔽が可能
→企業ユーザ、商用アプリ開発者にメリット
ベンチマーク: 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)にて実施
ベンチマーク: 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)にて実施
1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)
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”); // カラムを表示}
PHPと標準クラス
なぜクラスの標準化が必要か?
背景:
PHP組込関数ではWebアプリに必要な機能を実装できない。
→ユーザ関数として作成・配布
→同一機能・複数実装による非効率、コード仕様が不統一
クラス標準化の試み
PHPlib :PHP Base Library
PEAR
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
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(); // セッション・認証ページを終了?>
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の指定方法: データベース種類://ユーザ名:パスワード@ホスト名/データベース
PHPとXML
EXPATApache標準、各タグに処理用のコールバック関数を定義
LIBXMLGNOME標準、DOM(Document Object Model)
WDDX(Web Distributed Data Exchange)
受け渡しデータ用フォーマット:シリアル化
XML/XSLT
現状では未サポートだが、将来的にサポート予定。
PHPとPDF
PDF (Portable Document Format) 電子文書フォーマットの標準
PDF-APIにより動的にPDFを作成可能
API:PDFlib,ClibPDF 日本語に対応(PDFlib:3.0以降,ClibPDF:2.0以降) PDFのマージには未対応
ライセンス: 非商用は無料、商用利用は有償
大規模プロジェクトへの対応
小規模~中規模のアプリケーション→HTML埋込型スクリプトPHPによる効率的な開発
中規模~大規模になると... Webサイトレベルの管理が必要。
デザイン、スクリプトの分離 テンプレートクラス
アプリケーションサーバー Midgard-Project: http://www.midgard-project.org/
1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)
PHPと国際化:日本語使用時の問題
ブラウザ
PHP
Webサーバー
RDBMSイメージライブラリ
①フォーム情報漢字コード不明
②クエリ送信(漢字コード固定)
③データ
④データ (漢字コード固定)
⑤画像(バイナリ)
⑥ HTMLまたは画像(バイナリ)
文字化け発生
内部データ(漢字コード固定)
PHPと国際化:機能
• ブラウザにより複数の漢字コード (SJIS、EUC等)が入出力される → 文字化け発生• 関数がマルチバイト文字に未対応
課題
• 内部コード・入出力コード自動変換 (SJIS,EUC,UTF-8,...)• マルチバイト対応文字列関数 mbstrlen($str),...• マルチバイト対応正規表現関数 mbregex(),...• 適切なメールMIMEヘッダ・ボディーのエンコード• 全文検索エンジン(Namazu )
変換 engine
1.PHP3用2. iconv(glibc 2.x)
国際化版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 ; 入力コードのデフォルト値(不明な場合)
国際化版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"
1.PHPの紹介2.PHP4の新機能3.Webアプリ構築の実際4.PHP国際化5.課題とまとめ6.デモ(Linux)
PHPの未来
国際化
どうやって本家にマージするか?
XML/XSLT
大規模プロジェクトへの対応
Webアプリケーションサーバー化:Midguardプロジェクト
テンプレートエンジン
標準クラスの整備:PEAR
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
まとめ
PHPの特徴
親しみやすいスクリプト言語
データベース(PostgreSQLとの)との高い親和性
Apacheモジュールによる高速実行
オープンソースによる開発
PHP4/Zendによるさらなる高機能化
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/ にてコード公開(予定)