当前位置: 首页 > 工具软件 > LAJP > 使用案例 >

JAVA结合PHP的开发技术 LAJP

夏侯英纵
2023-12-01

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环境,不需要任何扩充的、第三方的组件。



 类似资料: