【T4】PHPテクニカルセッション

DelphiでPHP- 拡張モジュールの作成からWAMP/WIMP環境の構築まで エンバカデロ・テクノロジーズ エヴァンジェリスト
高橋 智宏

アジェンダ

使い慣れた開発環境で、PHP Extension Moduleを作成して、WAMP / WIMP 環境を拡張でき、日本語対応も、デバッグもOKだとしたら、うれしくないですか？
し・か・も、超超超カンタンに。
• PHP拡張モジュールの作成• VCL for PHPでカスタムコンポーネントを作成• WAMP / WIMP 環境の構築
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

2

PHP拡張モジュールの作成

PHP拡張モジュールとは？

• PHP拡張モジュールを新規に作成したことがある人いますか？
• PHP言語から呼び出し可能な関数を実装した、OSネイティブなライブラリ• Windowsなら、php_mysql.dll など• php.ini に extension=php_mysql.dll と記述してロードする• 良いところ• PHPだけでは実現が難しい処理も実装可能• あまり良くないところ• 一般的に、開発環境の構築がメンドクサイ• UNIX系とWindowsとで、構築方法がゼンゼン違う

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

4

じつは、意外と誰でも作成できる• Windows向けですが、誰でも超超超カンタンにPHP拡張モジュールを開発できる環境があります！
＜用意するもの＞• Delphi for Win32• Delphi 5 ～ Delphi 2009

• php4delphi• Delphi for Win32 向けのフリーのプラグイン＜PHP環境＞• Delphi for PHP - PHPアプリケーションの開発・デバッグ• WAMP / WIMP - 配布環境
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

5

開発環境の準備• Delphi for Win32 をインストール• 例: Delphi 2007

• php4delphiをダウンロードし、展開• http://cc.embarcadero.com/Item/26233• 例: "C:¥CodeGear¥RAD Studio¥5.0¥php4delphi"• php4delphiをIDEに統合• プロジェクトを開く• 例: "C:¥CodeGear¥RAD Studio¥5.0¥php4delphi¥php4Delphi2007group.groupproj“• php4DelphiR2007.bpl, php4DelphiD2007.bpl をビルド
• php4DelphiD2007.bpl をインストール

これだけ!!
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

6

はじめてのPHP拡張モジュール• プロジェクトの新規作成• [ファイル]-[新規作成]-[その他]-[Delphi プロジェクト]-[PHP Extension]• [プロジェクトオプション]-[ディレクトリ/条件-検索パス]を設定• 例: "C:¥CodeGear¥RAD Studio¥5.0¥php4delphi"• 関数の定義と実装を行う…
• ビルド• xxxx.dll (例: Project1.dll)を生成• PHP環境に配布

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

7

はじめての関数• echostr関数• 動作 Æ 文字列を受け取り、その文字列を返す• TPHPFunctionを1つ追加• TPHPExtensionクラスのFunctionsプロパティ• FunctionNameプロパティ Æ echostr• TFunctionParamを1つ追加• TPHPFunctionクラスのParametersプロパティ• ParamTypeプロパティ Æ tpString• OnExecuteイベントを追加
procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject;Parameters: TFunctionParams; var ReturnValue: Variant;
ZendVar: TZendVariable; TSRMLS_DC: Pointer);var
str: AnsiString;
begin
str := AnsiString(Parameters.Items[0].Value);
ReturnValue := str;
end; Technologies, Inc. All Rights Reserved.
Copyright ©2009 Embarcadero

これだけ!!

本文書の一部または全部の転載を禁止します。

8関数を実行• Delphi for PHP• Project1.dll を “<D4PHP>¥php¥ext" にコピー
• “<D4PHP>¥php¥php.ini.template" に extension=Project1.dll を追加• 実行時に php.ini が更新される• [Windows2000, WindowsXP］– C:¥Documents and Settings¥ユーザ名¥Application Data¥CodeGear¥Delphifor PHP¥2.0¥php¥php.ini• ［Vista］– C:¥Users¥ユーザ名¥AppData¥Roaming¥CodeGear¥Delphi for
PHP¥2.0¥php¥php.ini• コマンドライン• php.exeコマンドの -cオプションで php.ini のフォルダを指定• 例• php.exe -c "C:¥Users¥codegaer¥AppData¥Roaming¥CodeGear¥Delphi for
PHP¥2.0¥php" c:¥tmp¥test.php

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

9

PHP拡張モジュールのデバッグ• php.exeを実行して、DLL内のブレークポイントで止める• 日本語文字列は？

• プロジェクトオプションを設定• [リンカ]-[リモートデバッグシンボルを含める] Æ ON
• [デバッガ]-[ホストアプリケーション] Æ <D4PHP>¥php¥php.exe• [デバッガ]-[パラメータ] Æ-c "C:¥Users¥codegaer¥AppData¥Roaming¥CodeGear¥Delphi for PHP¥2.0¥php" c:¥tmp¥test.php• [デバッガ]-[ソースパス] Æ .pas のある場所• ビルド• DLL(Project1.dll)とデバッグシンボル(Project1.rsm)を“<D4PHP>¥php¥ext”にコピー

これだけ!!
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

10もう少し複雑な関数 divint• divint関数• 整数値を２つ受け取り、割り算した商を返す• TFunctionParamを2つ追加• TPHPFunctionクラスのParametersプロパティ• ParamType Æ tpInteger
procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject;Parameters: TFunctionParams; var ReturnValue: Variant;
ZendVar: TZendVariable; TSRMLS_DC: Pointer);varc: Integer;
beginc := Integer(Parameters.Items[0].Value) div Integer(Parameters.Items[1].Value);
ReturnValue := c;end;• ゼロ除算はどうなる？
• echo divint(10, 2); Æ 5• echo divint(10, 0); Æ ?
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

11

もっと複雑かつWindows向けの実装 - proclist
proclist関数• 配列(array)を返す• サーバー内のプロセス名一覧を返してみます• Booleanパラメータを受け取る• True / False Æ TrueならプロセスIDも追加する• TFunctionParamを1つ追加• TPHPFunctionクラスのParametersプロパティ• ParamType Æ tpBoolean＜注意点＞• 配列を返すには、Zend API を利用する• _array_init, add_next_index_string など…
• OnExecuteイベントの「var ReturnValue: Variant;」は使用しない!!
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

12

proclist関数の実装
procedure TPHPExtension1.PHPExtension1Functions0Execute(Sender: TObject;Parameters: TFunctionParams; var ReturnValue: Variant; ZendVar: TZendVariable; TSRMLS_DC: Pointer);var
retval: pzval;
hSnap: THandle;
proc: TProcessEntry32;
pid: Boolean;
data: AnsiString;
begin
retval := ZendVar.AsZendVariable;_array_init(retval, nil, 0);
pid := Boolean(Parameters.Items[0].Value);proc.dwSize := Sizeof(TProcessEntry32);
hSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);try
if Process32First(hSnap, proc) thenbegin
data := proc.szExeFile;if pid thendata := data + '(' + IntToStr(proc.th32ProcessID) + ')';
add_next_index_string(retval, PAnsiChar(data), 1);
while Process32Next(hSnap, proc) dobegindata := proc.szExeFile;if pid thendata := data + '(' + IntToStr(proc.th32ProcessID) + ')';
add_next_index_string(retval, PAnsiChar(data), 1);
end;
end;
finallyCloseHandle(hSnap);end;
Copyright
end; ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

13

VCL for PHPでカスタムコンポーネントを作成

proclist関数を実際に利用する• proclist関数にTrue/Falseを渡して、リストボックスに一覧表示
フツーに使うと、リストボックスに関する処理だけで…

• Delphi for PHP と VCL for PHP を使えば…
••••

もっと使い易くて、もっと再利用可能性のある、もっとオブジェクト指向的な、コンポーネント/パッケージが作成できますCopyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

15

proclist関数を実際に利用する(続き)• proclistをコンポーネント化すると…
• 非ビジュアルコンポーネントとして、標準のビジュアルコンポーネントと連携＋

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

16

非ビジュアルコンポーネントの作成• メインメニューから[コンポーネント]-[新規コンポーネント]を選択••••

継承元のクラス Æ Component
クラス名
Æ ProcList
パレットページ名 Æ Ken
パッケージの作成 Æ ON

• コンポーネント/パッケージは、VCL for PHPの配下に置く• コンポーネントの.phpを vcl/ken/proclist.inc.php として保存• パッケージの.phpを vcl/ken/ken.package.php として保存• まずは、ProcListコンポーネントにpublicな読み取り専用プロパティ“PArray”を追加してみよう• function readPArray() { return proclist(true); }• コンポーネントをIDEに統合する• [コンポーネント]-[パッケージ]-[追加] で ken.package.php を選択
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

17

publishedなプロパティ• publishedなプロパティは、IDE上でのフォームデザイン時にも設定可能• プロセスIDの表示/非表示を設定するBoolean型プロパティ「Pid」の追加• [編集]-[Publishedプロパティの追加]• プロパティ名 Æ Pid• デフォルト値 Æ true

protected $_pid=true;
function getPid() { return $this->_pid; }function setPid($value) { $this->_pid=$value; }function defaultPid() { return true; }• プロパティ"PArray"の実装を変更し、Pidプロパティに連動させる• function readPArray() { return proclist($this->_pid==true); }• PidがBoolean型のプロパティであることをIDEに通知する• ken.package.php に registerBooleanProperty('ProcList','Pid'); を追加• コンポーネントの変更をIDEに通知する• [コンポーネント]-[パッケージ]-[インストール済みパッケージ] でken.package.php の選択をONÆOFFÆON
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

18

WAMP環境の構築

WAMP(Windows + Apache + MySQL +PHP)• 8/13の時点で、PHP5.2.x系が利用可能なWAMP環境• WampServer 2.0h• http://sourceforge.net/projects/wampserver/files/• PHP 5.2.9-2• Apache 2.2.11• MySQL 5.1.33• XAMPP for Windows 1.7.1• http://sourceforge.net/projects/xampp/files/• PHP 5.2.9• Apache HTTPD 2.2.11• MySQL 5.1.33• WAMPStack 1.1-5• http://bitnami.org/stack/wampstack• PHP 5.2.10• Apache to 2.2.11• MySQL 5.1.30
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

20

特徴

• WampServer 2.0h オススメ！
• PHPが常に最新!!
• とても使い易いサービス管理用のGUIツール有り• サービス名として「wampapache」「wampmysqld」を使用• XAMPP for Windows 1.7.1••••

PHPがちょっと古い
サービス管理用のGUIツール有り
サービス名として「Apache2.2」「mysql」を使用
1.7.1のインストーラには、my.cnf,my.iniの読み込み設定に不具合あり• WAMPStack 1.1-5• PHPが最新!!
• サービス管理用のGUIツール無し• サービス名として「wampstackApache」「wampstackMySQL」を使用
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

21

WAMP環境の構築• Windows Server 2008 SP2 上の WampServer 2.0h で試す• WampServer 2.0h のインストール• DLL(例: Project1.dll)を C:¥wamp¥bin¥php¥php5.2.9-2¥ext にコピー
• php.ini の設定(パスに注意!!)• C:¥wamp¥bin¥apache¥Apache2.2.11¥bin¥php.ini• extension=Project1.dll• サービス(Apache)の再起動• PHPアプリの転送• サブフォルダにVCL for PHP– コンポーネントは vcl/ にCopyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

22

WIMP(Windows + IIS + MySQL + PHP)

• IIS で PHP を実行するには？
• FastCGI + 非スレッドセーフなPHPエンジン（32bit） によるハイパフォー
マンスなPHP環境の構築が機能• php-cgi.exe• php5.dll- FastCGIで再利用されるプロセスモジュール- 非スレッドセーフなPHPコアモジュール• Windows Server 2003 の IIS6.0• FastCGI拡張のセットアップを手動で…

• Windows Server 2008 の IIS7.0• ハンドラマッピングでカンタンセットアップ オススメ！

• た・だ・し、php4delphiで作成した拡張モジュールは、スレッドセーフなPHPコアモジュール「php5ts.dll」を参照するため、IISでの利用には注意が必要！
• スレッドセーフ版のPHPエンジンを使用します• php4delphiを書き換えれば対応は可能でしょう

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

23

WIMP 環境の構築

IIS + FastCGI + PHP• WI?P環境の構築手順• Windows Server 2008 SP2 を用意する• PHP5のインストール• スレッドセーフ版の“php-5.2.x-Win32.zip”をダウンロードし、C:¥PHPに展開– http://www.php.net/downloads.php– php.iniの編集• DLL(例: Project1.dll)を C:¥PHP¥ext にコピー• IIS7.0 のインストール• [コントロールパネル]-[管理ツール]-[サーバー マネージャ]-[役割]-[役割サービスの追加]-[Webサーバー]-[アプリケーション開発]-[CGI]• IISマネージャでFastCGIのハンドラマッピングの追加• [ハンドラマッピング]-[モジュールマップの追加]– 要求パス– モジュール– 実行可能ファイル- *.php- FastCGIModule- C:¥PHP¥php-cgi.exe• IISマネージャでアプリケーションプールの追加

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

25

ここまでの流れ
1.

2.

3.

参考資料(英語): http://www.microsoft.com/japan/opensource/php/learning/default.mspx
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

26

Webサイトの追加• IIS向けWebサイトの構築手順• Webアプリケーション実行専用のユーザー&グループの追加• 例: グループ• 例: ユーザー- WebUsersGroup- WebUser• Webサイト用のフォルダを作成• アクセス許可を特定のユーザーグループに制限する• IISマネージャで[Webサイトの追加]• アプリケーションプールの選択• 物理パスの選択• [接続]-[パス資格情報]-[特定のユーザー] Æ WebUser– [テスト接続]ボタンでアクセスの可否を確認• IISおよびWebサイトの(再)起動• PHPアプリの転送• サブフォルダにVCL for PHP– コンポーネントは vcl/ にCopyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

27

ここまでの流れ … 完了！
1.

3.

2.

参考資料(英語): http://www.microsoft.com/japan/opensource/php/learning/default.mspx
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

28

まとめ

• Windows版 PHP5向けの拡張モジュールの作成• .DLLを作成すれば、PHP環境を強化できる• Delphi for Win32 を使えば、とてもカンタンに作成できる• PHP関数のカプセル化• コンポーネント化することで、開発を効率化できる• Delphi for PHP / VCL for PHP の強力なフレームワークとの連携• WAMP / WIMP 環境の構築• Apacheベースのスタックを使えば、素早くWebサイトを構築可能• IISベースのWebサイト構築は基本的に手動だが、FastCGIが利用可能

Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

29

ご静聴ありがとうございました

Q&A
Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.
本文書の一部または全部の転載を禁止します。

30