7

フロントエンドに PHP を使用し、バックエンドに Java サービスを使用して Web サイトを実装しています。2 つの部分は次のとおりです。

  1. PHP フロント エンドは、http 要求をリッスンし、データベースと対話します。

  2. Java バックエンドは継続的に実行され、フロントエンドからの呼び出しに応答します。

より具体的には、バックエンドは、いくつかの IM サービス (AOL、MSN、Yahoo、Jabber...) へのリンクを接続して維持するデーモンです。

両方のレイヤーが同じシステム (CentOS ボックスだと思います) にデプロイされ、中間レイヤー (たとえば、XML-RPC を使用) を導入するとパフォーマンスが低下します (リソースもかなり制限されます)。

質問: 2 つのレイヤーを直接リンクする方法はありますか? (間にWebサービスはありません)

4

9 に答える 9

9

これは実行中の 2 つの別個のプロセス間の通信であるため、「直接」呼び出し ( JNIの場合など) はできません。このようなプロセス間通信を行う最も簡単な方法は、おそらく名前付きパイプとネットワーク ソケットです。どちらの場合も、通信プロトコルを定義して両側で実装する必要があります。XML-RPC などの標準プロトコルを使用すると、これが容易になりますが、厳密には必要ではありません。

于 2009-05-21T08:37:47.227 に答える
4

一般に、アプリケーション統合には次の 4 つのパターンがあります。

  1. ファイルシステム経由、つまり。1 つのプロデューサーが、コンシューマーによって監視されているディレクトリにデータを書き込みます。
  2. データベース経由、つまり。2 つのアプリケーションがスキーマまたはテーブルを共有し、それを使用してデータを交換する
  3. RMI/RPC/Web サービス/任意のブロックを介して、あるアプリから別のアプリへの呼び出しを同期します。PHP から Java の場合、上記のさまざまな統合ライブラリから選択するか、SOAP などの Web サービス標準を使用できます。
  4. あるアプリが別のアプリにメッセージを送信するメッセージング/非ブロッキングの非同期操作を介して。

これらのパターンにはそれぞれ長所と短所がありますが、経験則として、回避できる最も結合が緩いパターンを選択することをお勧めします。たとえば、#4 を選択した場合、Java アプリは PHP アプリをダウンさせることなくクラッシュする可能性があります。

ここの回答にリストされている特定のライブラリまたはテクノロジーを見る前に、適切なパターンを選択してから、特定のオプションを調査することをお勧めします。

于 2009-05-21T12:29:18.630 に答える
3

PHP-Java ブリッジ (php-java-bridge.sourceforge.net/pjb/) を試してみましたが、非常にうまく機能します。基本的に、ポートをリッスンするjarファイル(JavaBridge.jar)を実行する必要があります(ローカルソケット、8080ポートなど、いくつかのオプションが利用可能です)。Java クラス ファイルは、クラスパスの JavaBridge で使用できる必要があります。ファイル Java.inc を php に含める必要があり、Java クラスにアクセスできます。

于 2009-05-21T09:06:26.637 に答える
2

確かに、方法はたくさんありますが、限られたリソースについておっしゃいました...

私見は、独自の軽量の RPC のようなプロトコルを定義し、TCP/IP 上のソケットを使用して通信します。実際、この場合、RPC などのすべての利点を使用する必要はありません。この特定のケース用に API を定義し、それを両側で実装するだけで済みます。この場合、パケットを非常に小さくシリアル化できます。リモート メソッドに一種の GUID を割り当て、それらを使用してトラフィックを節約し、相互通信を高速化することもできます。

ソケットを使用する利点は、ソリューションがかなりスケーラブルになることです。

于 2009-05-21T11:58:18.227 に答える
1

PHP/Java 統合を試すことができます。

また、通信が一方向 ("sendmail for IM" など) の場合は、PHP 要求をファイルに書き出して、Java アプリで監視できます。

于 2009-05-21T08:33:14.207 に答える
1

私も最近この問題に直面しました。上記の Resin ソリューションは、実際には JRuby、Jython、および Rhino に沿って Java で PHP を完全に書き直したものです。それはQuercusと呼ばれています。しかし、私と同じように、Apache/PHP のセットアップを捨てることは実際には選択肢ではありません。

また、Quercus には他にも問題があります。無料版は GPL であり、商用ソフトウェアを開発している場合は注意が必要です (ただし、Resin が信じさせようとしているほど注意が必要ではありません (ただし IANAL))。その上、無料版ははバイトコードへのコンパイルをサポートしていないため、基本的には Java で記述されたインタープリターです。

最終的に私が決めたのは、HTTP 経由で単純なメッセージを交換することだけでした。PHP のjson_encode()/json_decode()と Java のjson-libを使用して、JSON でメッセージをエンコードしました (シンプルで、テキストベースで、データ モデルに適しています)。

もう 1 つの興味深い軽量オプションは、Java で PHP コードを生成し、PHP の include() ディレクティブを使用して HTTP 経由で取得し、実行することです。私はこれを試していません。

(パフォーマンスのために)懸念している実際のHTTP呼び出しである場合、これらのソリューションはどちらも役に立ちません。私が言えることは、同じ LAN 上の PHP と Java で問題が発生したことはないということだけです。私の感じでは、RPC 呼び出しをかなり粗くしておく限り (とにかくこれを行う必要があります)、ほとんどのアプリケーションにとって問題にはなりません。

于 2009-10-29T22:52:17.463 に答える
0

なぜWebサービスを使わないのですか?

Java レイヤーを作成し、ws アクセス (Axis、SpringWS など) を配置し、Php は 1 つの ws クライアントを使用して Java レイヤーにアクセスします。

シンプルで使いやすいと思います。

于 2009-05-21T15:56:53.220 に答える
0

申し訳ありませんが、これは簡単な回答ですが、Resin アプリ サーバーは Java と PHP の統合をサポートしていると聞きました。

彼らは、php と Java を一緒に粉砕できると主張しています: http://www.caucho.com/resin-3.0/quercus/

私はレジンを J2ee アプリケーションの提供に使用しましたが、PHP のサポートには使用しませんでした。

そのような冒険について聞いてみたいと思います。

于 2009-05-21T12:34:47.217 に答える
-1

2 つのレイヤーをリンクする手段を紹介するこのページに出会いました。ただし、それでも中間層 (TCP/IP) が必要です。さらに、Java サービスはすべての着信接続を受け入れるため、他のサービスも Java サービスを悪用する可能性があります。

http://www.devx.com/Java/Article/20509

[調査中...]

于 2009-05-21T08:38:41.200 に答える