Java+PHP 整合

验证两种各自领域称王的语言(JAVA /PHP),不同语言、不同机制的组合在一起 **,PHP 负责 WEB 层,Java 负责业务和数据逻辑层 **,真是一对黄金组合(Java+PHP 整合 = 混血新宠儿),发挥各自优势,适合开发 B/S 企业程序。

1 技术问题

两种不同环境,不同机制的语言结合,首先要解决的是如何通讯?其次是通讯内容如何处理?最后是两者开发,部署环境整合?

1.1   两种语言对比

Php:直观,快速,简单,易学,开发动态网页效率高,草根文化气息浓重,是语言世界的平民英雄,注重于结果。

Java:强大而复杂,有众多高端功能,又有 IMB、Oracle 等企业大颚的追捧,是语言世界的贵族王子。

1.2   通讯问题

1.2.1   消息队列

从操作系统层面观察: PHP 和 Java 是系统中运行的不同进程,他们之间沟通属于进程间通信技术 (IPC):

    

在传统的 Unix 环境中,IPC 技术有:管道、消息队列、共享内存、信号量等,但在同一个系统中,IPC 通信比基于 TCP 的 socket 通信在性能、资源占用方面有相当大的优势。

在 Unix/Linux 中,PHP 基本提供了所有 IPC 的访问接口,因为 PHP 可以看作是以 C 语言为核心的一个壳,而 IPC 是系统内核的组成部分,对外提供了一组 C 函数接口,因此 PHP 可以非常顺畅的运用 IPC 技术。而 Java 为了追求夸平台性 (Windows 的 IPC 技术和 Unix 的不同),没有提供系统级的 IPC 访问,这也体现了 Java 的文化特色:为追求统一可牺牲效能。

1.2.2     Socket

消息队列技术只能适用于 Unix/Linux 系统,而 SOCKET 基于 TCP/IP 的通讯机制,从而适应各种平台。

 

从上图中看出,PHP 承担 HTTP 层的职责,而 Java 承担业务层的职责,他们通过 System V Message Queue(消息队列,进程间通讯 IPC 中的一种)相互沟通,Java 需要 JNI 的支持。

使用消息队列有以下好处:

|

1.       使 php 和 java 保持独立性

2.       有极高的传输速度,大于 socket

3.       相对于 socket 方式,Java 服务端只向本机提供服务 (没有对外侦听端口),相对安全,易于管理。

|

1.3     通讯内容问题

通信问题解决了,通信内容如何解决呢?

**PHP 和 Java 各自语言内部定义的数据类型,当两种语言互相传输数据时,数据类型怎样进行转换呢? **

     **(1)**Xml: xml 确是一种夸平台、能够很好描述对象模型的数据封装技术,但 xml 体积大传输速率慢,通讯两端解析也比较麻烦。

      (2) 序列化: 在传输过程中使用序列化和反序列化对象来传输数据是一种公认且比较合理的方式,且两种语言都支持。

2   Java 与 php 结合选型

目前已知的 PHP 与 Java 在 Web 间整合技术可分成 SOAP(Simple Object Access Protocol)、Quercus、PHP/Java Bridge 三种,这些技术可以让 PHP 与 Java 在开发 Web 应用程序时互相使用彼此的程序库。

|

SOAP

|

SOAP 是 IBM、Microsoft 等公司开发、W3C 推荐,用来实现分布式对象技术的协议。SOAP 提供了一套以 XML 来包装程序调用、参数传递与信息回传的机制,借助 XML 纯文字的特性,可通过 HTTP、HTTPS、SMTP 等通信管道穿越企业的防火墙。比起 CORBA、Java RMI 及 DCOM 这些以专属 binary 格式传送数据的分布式对象技术协议,SOAP 具有与程序语言、平台和硬件无关的特性。

|
|

Quercus

|

Quercus 是一个开源 PHP 5 引擎,它已经拥有了纯 Java 的完整实现。Quercus 在 Resin 应用服务器之上运行,利用了负载平衡、代理缓存等 Resin 特性。

|
|

PHP/Java Bridge

|

开源产品有:Php-java-bridge 与 LAJP

|

2.1  选择条件

ü 免费、开源

ü 简单易用

ü 高效稳定

2.2    LAJP

2.2.1    特点

Ø 优势互补: PHP 是非常流行的 WEB 编程脚本语言,有易学、易用、开发部署效率高的特点,         非常适合网页编程;JAVA 适合编写具有复杂的业务功能和数据的程序,二者结合可发挥各自优势。

Ø 高效稳定:Apache+PHP 组合可带来优异的 WEB 服务稳定性,而 JAVA 可补充如连接池、事物管理、分布式、对象模型等高端特性。

Ø 创新的通信机制: PHP 和 Java 间的通讯方式采用系统消息队列和 Socket 两种机制,兼顾通讯效率和平台兼容性。

Ø 数据类型自动转换机制: PHP 数据和 Java 数据可准确地自动匹配和转换,无须程序员编写解析代码。

Ø 易用:LAJP 安装配置简单,PHP 端和 JAVA 端编程符合各自的编程习惯。

Ø 轻量级:LAJP 架构非常轻量级,除了最基本的 PHP 和 Java 环境,不需要任何扩充的、第三方的组件、容器。

2.2.2      数据类型转换

PHP 和 Java 各有其语言内部定义的数据类型,当 PHP 数据传送到 Java,或 Java 数据传送到 PHP 时,LAJP 在内部自动地、准确地对他们进行转换,程序员无需进行任何的解码工作。

2.2.3    LALP 运行环境

消息队列模式

环境需要满足 System V 消息队列的运行:

  • 系统 目前常见的 Unix/Linux 系统都可满足 php(Apache)、java 的运行,其中大部分默认支持 System V 消息队列。

  • php php 需要通过消息队列和 java 进程通信,按 php 的说明,php 在 4.3.0 版本以后支持 System V 消息队列。

  • apache 无特殊要求,满足 php 要求即可。

  • java java 版本在 1.5 以后。

  • 在 Unix/Linux 环境中,推荐使用消息队列模式。

socket 模式

  • 系统 没有限制,很难找到不支持 TCP/IP 的系统。

  • php 按 php 的说明,php 版本 >=4.1.0 支持 socket

  • apache 无特殊要求,满足 php 要求即可。

  • java java 版本在 1.5 以后。

  • Windows 系统只能使用 socket 模式

在开发过程中可以同时使用这两种模式,比如一般开发者使用 Windows 环境,而程序部署在 Linux 系统中,LAJP 在模式的配置上和编码无关。

2.2.4          部署

2.2.4.1         分布式架构

在重要的、关键性的业务场景中,用户交互层和业务层是分开部署的,LAJP 在此类架构中可以这样使用:

 

WEB 服务器中的 Java 是非常“薄”的一层,仅用来连接后面的 EJB 服务。

2.2.4.2         集群

随着用户访问量的增加,WEB 服务往往成为系统中的瓶颈,下面是 LAJP 在集群中的架构参考:

2.2.4.3         web 集群

通过使用 socket 通讯模式的 LAJP,可以搭建出简单的分布式的 WEB 集群架构:

2.2.4.4         复杂架构应用

LAJP 使用的灵活性,架构的设计和选择更多在于我们自己的思想,下面的架构参考在 WEB 层、EJB 层都使用了集群:

memcache 是分布式的内存对象缓存技术,在 PHP 中可以非常方便的将 Session 数据存储在其中,来同步 WEB 集群中各节点中的数据,从这里也可以体现到 PHP 在 WEB 领域相对于 Java 的“专业”。