LAJP名称来源于著名的LAMP(Linux,Apache,Mysql,Php),LAMP是轻量级的开发 Web程序的环境,在Internet上有广泛的应用,但对于企业开发,如金融、电信领域,LAMP显得能力不足,这些领域通常是Java(J2EE)的 势力范围。LAJP是将LAMP的简便性和Java能力结合起来的一项技术,LAJP中的J指的是Java,由于数据库厂商对Java的广泛支持和 LAJP针对的领域,数据库不再特别限制为Mysql。
一、 消息队列
以操作系统的消息队列为沟通媒介,在通讯 过程中php作为客户端调用java端服务。消息队列属于IPC技术(进程间通讯),php语言中内置了一组函数(msg_send、 msg_receive等)可以和System V消息队列通讯,而java中没有相似的方法,因此通过调用底层JNI接口使用C函数来实现。 使用消息队列有以下好处:
使php和java保持独立性
有极高的传输速度,大于socket
相 对于socket方式,Java服务端只向本机提供服务(没有对外侦听端口),相对安全,易于管理。
二、Socket
消息队列技术只能适用于Unix/Linux/BSD系统,因此LAJP提供基于TCP/IP的通讯机制,从而适 应各种平台。
数据类型转换
PHP和Java各有其语言内部定义的数据类 型,当PHP数据传送到Java,或Java数据传送到PHP时,LAJP在内部自动地、准确地对他们进行转换,程序员无需进行任何的解码工作。
示例
示例程序表现了一个简单的PHP调用Java的程序片段,PHP在调用过程中向Java传递了3个参数,参数类型分别是字符串、数组、对象,Java服务方法返回字符串应答。
php端程序
```java
require_once("php_java.php"); //LAJP提供的程序脚本
//php类,映射到JavaBean类:cn.com.ail.test.Bean
class cn_com_ail_test_Bean
{
var $a = "v1";
var $b = "v2";
}
$p1 = "a"; //字符串,传给Java方法的第一个参数
$p2 = array(); //数组,传给Java方法的第二个参数
$p2[] = 10;
$p2[] = 20;
```$p3 = new cn_com_ail_test_Bean; //php对象,传给Java方法的第三个参数
//"lajp_call"是LAJP提供的函数,用来调用java端服务
//"cn.com.ail.test.Objtest::method1"表示调用java的cn.com.ail.test.Objtest类中的method1方法
//"$p1,$p2,$p3"是向method1方法传递的3个参数。
$ret = lajp_call("cn.com.ail.test.Objtest::method1", $p1, $p2, $p3);
echo "返回信息:".$ret; //打印"OK,收到并返回字符串应答"
java端程序
//对应php中$p3的JavaBean(普通的JavaBean)
package cn.com.ail.test;
public class Bean
{
private String a;
private String b;
public String getA()
{
return a;
}
public void setA(String a)
{
this.a = a;
}
public String getB()
{
return b;
}
public void setB(String b)
{
this.b = b;
}
}
java端服务
package cn.com.ail.test;
public class Objtest
{
//PHP调用的Java方法(普通的Java方法,LAJP仅要求声明为public static final)
//php传来的三个参数自动转换为相应的Java数据类型
public static final String method1(String param1, java.util.List param2, Bean param3)
{
System.out.println("$p1=" + param1);
for (int i = 0; i < param2.size(); i++)
{
System.out.printf("$p2[%i]=%i\n", i, (Integer)param2.get(i));
}
System.out.println("$p3->a=" + param3.getA());
System.out.println("$p3->b=" + param3.getB());
//返回给PHP的应答字符串
return "OK,收到并返回字符串应答";
}
}
三、LAJP运行环境要求
"消息队列模式"和"socket模式"对运行环境的要求是不同的,下面分别加以阐述:
消息队列模式
环境需要满足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在模式的配置上和编码无关。
四、LAJP安装与运行
Windows下的LAJP安装配置
请阅读 《图解LAJP在Windows系统上的安装配置》
Unix/Linux下的LAJP安装配置
下载 下载Lajp的安装文件,解压后目录结构如下:
lajp安装包
|
|--jin //消息队列模式必要的JNI源程序
| |
| |--lajp_MsgQ.h
| |--lajp_MsgQ.c
| |--make.sh
|
|--php //PHP端脚本
| |
| |--php_java.php.msgq
| |--php_java.php.socket
|
|--test_service/ //Hello World 示例服务程序
|
|--lajp-10.05.jar //LAJP主程序
|--run_msgq.sh //Unix/Linux使用消息队列模式启动脚本
|--run-socket.bat //windows使用启动脚本
|--run-socket.sh //Unix/Linux使用socket模式启动脚本
Unix/Linux中运行LAJP依赖以下前提设置
Apache+php环境 部分发行版本的php默认安装不支持消息队列(System V messages)、信号量(System V semaphore)、共享内存(System V shared memory), 如使用消息队列模式需在编译php时附带编译选项 --enable-sysvsem,–enable-sysvshm和–enable-sysvmsg;如使用socket模式则要检查sockets是否激活,这些可以通过phpinfo()函数来观察。
java环境 要求Java5.0以上。
Unix/Linux中socket模式的配置运行
Socket模式使用run-socket.sh脚本,运行前确保run-socket.sh有执行权限,在脚本内部可以配置Java服务端口(默认21230),PHP和Java传输字符集(默认UTF-8),classpath等。
Unix/Linux中消息队列模式的配置运行
首先配置好c语言编译环境
编译JNI 将下载的lajp安装包中的3个源代码文件:lajp_MsgQ.c,lajp_MsgQ.h,make.sh复制到某个目录,确保make.sh有执行权限,按注释要求编辑make.sh
#!/bin/sh
# -----------------------------------------------------------
# LAJP-JNI 编译脚本 (2009-09 http://code.google.com/p/lajp/)
#
# 编译环境: Unix/Linux
#
# 源文件: lajp_MsgQ.c lajp_MsgQ.h
# 目标文件: liblajpmsgq.so
# 编译参数:
# --share : 编译为动态库
# -I : 搜索编译JNI需要的.h文件, 注意"/usr/lib/jvm/java-6-sun/"要换成编译环境中
# 的JAVA_HOME路径
#
# liblajpmsgq.so发布 :
# 复制到<java.library.path>中,可通过java程序
# System.out.println(System.getProperties().getProperty("java.library.path"));
# 获得本机的<java.library.path>
# -----------------------------------------------------------
gcc lajp_MsgQ.c --share -I. -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -o liblajpmsgq.so
部署编译好的liblajpmsgq.so库文件: 如果编译成功,会生成liblajpmsgq.so文件,将它复制到任一个"java.library.path"路径中,"java.library.path"路径可以通过java程序侦测: System.out.println(System.getProperties().getProperty(“java.library.path”))
消息队列模式使用run_msgq.sh脚本,运行前确保run_msgq.sh有执行权限,在脚本内部可以配置PHP和Java传输字符集(默认UTF-8),classpath等。
五、LAJP基本配置
LAJP只是单纯的PHP和Java传输的中间机制,像Web系统中常见的数据库连接池、JNDI、缓存等需要开发者自己管理。
消息队列配置
对于消息队列,有三个系统配置影响其性能:
MSGMNI 指定系统中消息队列最大数目
MSGMAX 指定一个消息的最大长度
MSGMNB 指定在一个消息队列中最大的字节数
一般性的,Linux系统的默认消息队列配置非常可怜,通过查看下面三个文件获得系统配置信息
/proc/sys/kernel/msgmni 缺省设置:16
/proc/sys/kernel/msgmax 缺省设置:8192
/proc/sys/kernel/msgmnb 缺省设置:16384
为了更好的性能,可编辑/etc/sysctl.conf文件,修改缺省配置:
# /etc/sysctl.conf
# set message queue 20M
kernel.msgmnb = 20971520
kernel.msgmni = 20480
**
## 特点
**
优势互补: PHP是非常流行的WEB编程脚本语言,有易学、易用、开发部署效率高的特点,非常适合WEB开发;JAVA适合编写具有复杂的业务功能和数据的程序,二 者结合可发挥各自优势,适合开发B/S企业程序。
高效稳定:Apache+PHP 组合可带来优异的WEB服务稳定性,而JAVA可补充如连接池、事物管理、分布式、对象模型等高端特性。
创新的通信机制PHP和Java间的通讯方式采用系统消息队列和Socket两种机制,同时兼顾通讯效率和平台兼容性。
数据类型自动转换机制PHP数据和Java数据可准确、自动匹配和转换。
易用:LAJP安装配置简单,除了核心的几个Java类文件和Java JNI接口程序外,不需额外插件,PHP端和JAVA端编程符合各自的编程习惯。
轻 量级:LAJP架构非常轻量级,除了最基本的PHP和Java环境,不需要任何扩充的、第三方的组件。