PHP と Java の接続 -- PHP/Java Bridge [2]

WBOY
リリース: 2016-06-23 14:35:39
オリジナル
870 人が閲覧しました

Haohappy
PHP5 Research Center: http://blog.csdn.net/haohappy2004/


(3) PHP/Java Bridge を使用する理由

PHP のコンポーネントは一時的で非永続化されます。複雑なアプリケーション システムの場合は、中間層コンポーネント (Java Bean/EJB など) またはエンタープライズ レベルのキャッシュ、接続プーリング、または PHP コンポーネントによって生成されたページのビジネス ロジックを提供する必要があります。たとえば、XML ファイルの解析は比較的リソースを大量に消費するタスクであり、キャッシュが必要です。また、データベースへの接続も比較的リソースを大量に消費するタスクであるため、再利用可能である必要があります。標準の PHP XML および DB 抽象化レイヤーは、中間レイヤーを介してキャッシュと接続プーリングを実装できないため、比較的非効率的です。

いくつかの小さなタスクでも、Java クラスまたは Java クラス ライブラリを使用する必要がある場合があります。たとえば、プラットフォーム間で Word、Excel、または PDF ドキュメントを生成する必要があります。

PHP、PHP/Java Bridge、php コードは標準の J2EE アーカイブ形式にパッケージ化でき、ユーザーはそれを J2EE アプリケーション サーバーまたはサーブレット エンジンに簡単にデプロイできます。ユーザーは PHP をインストールする必要はなく、ユーザーの観点からは、JSP、サーブレット、および PHP で生成されたページの違いはわかりません。 Bridge を使用すると、PHP と J2EE の間でセッションを共有できるため、開発者は JSP ベースのプログラムを PHP と段階的に統合できます。

上記は、PHP に Java が必要な理由についてです。 Java プログラマにとっては、PHP および PHP/Java Bridge も役立つ場合があります。 jakarta Struts や新世代テクノロジ Java Server Faces など、JSP テンプレート システムに基づいたテクノロジが多数あります。 JSP およびカスタム タグ ライブラリには多くの欠陥があり、これらを統合してオブジェクト指向 WEB フレームワークを構築すると、これらの問題が明らかになります。 JSF の作成者ですら、このようなシステムには重大な欠陥があることを認めており、タペストリーやファセットなどの Java クラスを使用してコンポーネントを定義し、ID によって XML/HTML テンプレートにバインドすることを推奨しています。 PHP/Java Bridge バージョン 3.0 では、PHP コードを JSF フレームワークに埋め込むことができるため、ユーザー インターフェイス設計者は HTML テンプレートの設計に集中でき、プログラマは PHP でプロトタイプを作成して既存の開発フレームワークを使用できます。現在、多くの大規模 Web サイトではフロントエンドで PHP を使用し、コアで Java を使用してシステムを構築しています。

PHP/Java Bridge は、PHP が Java オブジェクトに簡単にアクセスできるように、次のプリミティブ型と関数を PHP に追加します。データ型の分布を表 1 に示します。

new Java("CLASSNAME"): クラス CLASSNAME を参照し、インスタンス化します。 スクリプトの実行後、参照されたクラスがガベージ コレクションされる可能性があります。

new JavaClass("CLASSNAME"): オブジェクトを作成せずにクラス CLASSNAME を参照します。返されるのは、クラスのオブジェクトではなく、クラス オブジェクトそのものです。スクリプトの実行後、参照されたクラスがガベージ コレクションされる可能性があります。 例:

java_require("JAR1;JAR2"): 現在のスクリプトで追加のライブラリを使用できるようにします。 「http:」、「ftp:」、「file:」、または「jar:」の場所。「Security Enhanced Linux」(README を参照) では、その場所に lib_t セキュリティ コンテキストがタグ付けされている必要があります。 ): javax.script.ScriptContext を現在のスクリプトで利用できるようにします。 ENVIRONMENT が欠落している場合、PHP プロシージャは必要なプロシージャと同じ名前を持つ必要があります。TYPE が欠落している場合、生成されるクラスは " generic」、つまり、クロージャーが適用されるときに実装されるインターフェースが決定されます。

java_closure は、PHP4 の try/catch 機能をエミュレートするためにも使用できます。

$session=java_session(): セッション コンテキストを作成または取得します。バックエンドが J2EE 環境で実行されている場合、セッションはリクエスト オブジェクトから取得されます。それ以外の場合は、PHP から取得されます。

$session=java_session(SESSIONNAME): このプリミティブは、「プライベート」セッションを使用します。 SESSIONNAME という名前でストアします。

java_session プリミティブは、作成にコストがかかるデータをキャッシュする必要がある値を対象としています。

JavaException: Java 例外クラス。例:

foreach(COLLECTION): java.util.Collection または java.util.Map を実装する Java クラスの値を反復することができます。上記のみ

[index]: java.util.Map インターフェイスを実装する Java クラスの要素にアクセスできます。

java_instanceof(JAVA_OBJ, JAVA_CLASS): JAVA_OBJ が JAVA_CLASS

のインスタンスであるかどうかをテストします。java_last_Exception_get(): 最後の例外インスタンスまたは null を返します。 PHP 5 以降では、代わりに try/catch を使用できます。 java_last_Exception_clear(): エラー状態をクリアします。 PHP 5 以降では、代わりに try/catch を使用できます。 

表 1. データ型マッピング表

不正確な数値 stringstring array (配列として) $v=new java("java.util.Vector", $ar);array (as hash) echo $m->size(); JavaException echo $ex->getCause();

PHP

Java

説明

オブジェクト

java.lang.Object

不透明なオブジェクト ハンドル。ただし、最初のハンドルは常に 1 で始まり、すべての n

$buf=new java("java.io.ByteArrayOutputStream");
$outbuf=new java("java.io.PrintStream", $buf);

null

null

NULL 値

$outbuf->println(null);

正確な数値

long

64 ビット整数

$outbuf->println(100);

ブール値

ブール値

$outbuf->println(true);

double

IEEE 浮動小数点

$outbuf->println(3.14);

バイナリデータ、未確認

java.lang.String

UTF-8 でエンコードされた文字列。 PHP は Unicode をサポートしていないため、すべての java.lang.String 値は、UTF-8 エンコーディングを使用して byte[] (上記を参照) に自動変換されます。エンコーディングは java_set_file_encoding() プリミティブを使用して変更できます。

$string=$buf->toString();

java.util.Collection または T[]

PHP4 は配列を値として送受信します。 PHP5 は配列を値として送信し、新しいイテレータと配列インターフェイスを実装するオブジェクト ハンドルを受け取ります。

// Collection を Vector に渡します

$ar=array(1, 2, 3);
echo $v-> Capacity();


// T[] を asList() に渡す
$A=new JavaClass("java.util.Arrays");
$lst=$A->asList($ar);
echo $ lst->size();



java.util.Map

PHP4 はハッシュテーブルを値として送受信します。 PHP5 はハッシュテーブルを値として送信し、新しいイテレータ インターフェイスを実装するオブジェクト ハンドルを受け取ります。

$h=array("k"=>"v", "k2"=>"v2");

$m=new java("java.util.HashMap",$h);



java.lang.Exception

ラップされた例外クラス。元の例外は $Exception->getCause(); で取得できます。

...

catch(JavaException $ex) {
}






このモジュールは、Windows 上の Mandrake Linux 9.2、RedHat Enterprise 3、RedHat Fedora Core 1..4、FreeBSD 5.3、Solaris 9 (Sparc、64 ビット JVM)、および RedHat (Cygwin 仮想) などのさまざまなプラットフォームでテストされています。理論的には、すべての *nix オペレーティング システムで実行できます。

PHP/Java Bridge は 4 つの異なるモードで実行できます:

dl() 関数を通じて呼び出されます。このモードでは、HTTP サーバーがクライアント要求を受信して​​反映すると、PHP/Java Bridge の呼び出しを開始します。 Java 仮想マシンはリクエストごとに再起動する必要があるため遅くなりますが、システム管理者権限は必要ありません。 グローバル設定ファイル php.ini は、HTTP サーバー内で実行される Java プロセスを通じて永続的にアクティブ化されます。このモードでは、PHP/Java Bridge は HTTP サーバーの起動後に起動し、HTTP サーバーの停止後に停止します。このモードは、開発およびテスト中に推奨されます。 外部 Java プロセスを通じてグローバル設定ファイル php.ini を永続的にアクティブ化します。運用システム (つまり、システムが正式に実行されているとき) で使用することをお勧めします。このモードは、RedHat Linux での RPM パッケージの実装に似ています。このモードでは、PHP/Java Bridge はシステム サービスとして機能します。 外部アプリケーション サーバーまたはサーブレット エンジンを通じて php.ini ファイルをアクティブにします。 PHP は、純粋な Java アプリケーション サーバーの CGI サブコンポーネントとして実行することも、Apache/IIS モジュールとしてインストールすることもできます。

トラックバック: http://tb.blog.csdn.net/TrackBack.aspx?PostId=627890


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート