这几天,一直在研究一个新的开发模式,因此把他帖出来,供你们分享一下。使用开源的LAJP技术。php
目的:java
验证两种各自领域称王的语言(JAVA /PHP),不一样语言、不一样机制的组合在一块儿,PHP负责WEB层,Java负责业务和数据逻辑层,真是一对黄金组合(Java+PHP整合=混血新宠儿),发挥各自优点,适合开发B/S企业程序。程序员
1 技术问题web
两种不一样环境,不一样机制的语言结合,首先要解决的是如何通信?其次是通信内容如何处理?最后是二者开发,部署环境整合?
Php:直观,快速,简单,易学,开发动态网页效率高,草根文化气息浓重,是语言世界的平民英雄,注重于结果。
Java:强大而复杂,有众多高端功能,又有IMB、Oracle等企业大颚的追捧,是语言世界的贵族王子。
从操做系统层面观察: PHP和Java是系统中运行的不一样进程,他们之间沟通属于进程间通讯技术(IPC):

在传统的Unix环境中,IPC技术有:管道、消息队列、共享内存、信号量等,但在同一个系统中,IPC通讯比基于TCP的socket通讯在性能、资源占用方面有至关大的优点。
在Unix/Linux中,PHP基本提供了全部IPC的访问接口,由于PHP能够看做是以C语言为核心的一个壳,而IPC是系统内核的组成部分,对外提供了一组C函数接口,所以PHP能够很是顺畅的运用IPC技术。而Java为了追求夸平台性(Windows的IPC技术和Unix的不一样),没有提供系统级的IPC访问,这也体现了Java的文化特点:为追求统一可牺牲效能。
消息队列技术只能适用于Unix/Linux系统,而SOCKET基于TCP/IP的通信机制,从而适应各类平台。

从上图中看出,PHP承担HTTP层的职责,而Java承担业务层的职责,他们经过System V Message Queue(消息队列,进程间通信IPC中的一种)相互沟通,Java须要JNI的支持。
使用消息队列有如下好处:
1. 使php和java保持独立性
2. 有极高的传输速度,大于socket
3. 相对于socket方式,Java服务端只向本机提供服务(没有对外侦听端口),相对安全,易于管理。
|
通讯问题解决了,通讯内容如何解决呢?
PHP和Java各自语言内部定义的数据类型,当两种语言互相传输数据时,数据类型怎样进行转换呢?
Xml: xml确是一种夸平台、可以很好描述对象模型的数据封装技术,但xml体积大传输速率慢,通信两端解析也比较麻烦。
序列化: 在传输过程当中使用序列化和反序列化对象来传输数据是一种公认且比较合理的方式,且两种语言都支持。
目前已知的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
|
ü 免费、开源
ü 简单易用
ü 高效稳定
Ø
优点互补: 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在内部自动地、准确地对他们进行转换,程序员无需进行任何的解码工做。

消息队列模式
环境须要知足System V消息队列的运行:
- 系统 目前常见的Unix/Linux系统均可知足php(Apache)、java的运行,其中大部分默认支持System V消息队列。
- php php须要经过消息队列和java进程通讯,按php的说明,php在4.3.0版本之后支持System V消息队列。
- 在Unix/Linux环境中,推荐使用消息队列模式。
socket
模式
- 系统 没有限制,很难找到不支持TCP/IP的系统。
- php 按php的说明,php版本>=4.1.0支持socket
在开发过程当中能够同时使用这两种模式,好比通常开发者使用
Windows
环境,而程序部署在
Linux
系统中,
LAJP
在模式的配置上和编码无关。
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的“专业”。