LAJP系列教程-第二部分-HelloWorld
第二部分: 以编写一个HelloWorld的方式介绍LAJP的使用。
江湖人言”光说不练假把式,光练不说傻把式“,上文讲了LAJP的种种优点好处,但对于一门新语言或技术,程序员最关心如何快速的在实践中了解这项技术的特点,因此还是从千锤百炼也不变的HelloWorld入手。
LAJP有两种通信模式:消息队列和socket,针对windows和linux平台本节教程共分为三节: windows下的socket模式hello world,linux下的socket模式hello world,和linux下的消息队列hello world。
随着LAJP版本的更新,这篇文章的具体操作细节已失去意义,但基本思想没有大的变化,仍值得一读。新的的hello入门请阅读LAJP开发网站的帮助文档:http://code.google.com/p/lajp/w/list
diaoyf
2010.5
一、windows下的socket模式hello world
■ 安装之前
系统要求: windows,安装好Apache、PHP环境
Java JDK:1.5以上。
■ 安装配置
下载 lajp-socket_[version].zip ,解压:
1. lajp-socket_[version] //socket版
2. |
3. |–java
4. | |
5. | |–hello //Hello World示例程序
6. | | |
7. | | |–HelloClass.class
8. | | +–HelloClass.java
9. | |
10. | |–lajp_[version].jar //Java服务端主程序
11. | |–run.sh //运行脚本(Unix/Linux)
12. | +–run.bat //运行脚本(Windows)
13. |
14. +–php
15. |
16. +–php_java.php //PHP脚本
解开后有两个子目录,将php目录中的php_java.php文件复制到Apache+php环境中的发布目录,备用。
■ 编写PHP文件
1.
2. <?php header("Content-Type:text/html;charset=utf-8"); ?>
3.
4. <?PHP
5. require_once("php_java.php"); //引用下载的php_java.php文件
6.
7. $name = "Ali";
8.
9. try
10. {
11. //调用Java的hello.HelloClass类中的hello方法
12. $ret = lajp_call("hello.HelloClass::hello", $name);
13. echo "{$ret}<br>";
14. }
15. catch (Exception $e)
16. {
17. echo "Err:{$ret}<br>";
18. }
19. ?>
20.
■ 运行
1. 打开CMD黑窗口,CD进入解压目录的java子目录,运行其中的脚本程序run.bat,黑窗口中显示:
——————————————-
- Start LAJP-JAVA(socket)…
- time:Tue Sep 22 22:56:09 CST 2009
——————————————-
Listen port: 21230
set charser: UTF-8
以上信息表示Java服务已经运行。
2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。
OK,Hello World程序演示结束。
■ 解释
在下载的zip文件的Java程序中,带有一个LAJP服务,服务类是HelloClass.class,我们看它的源代码HelloClass.java:
1. package hello;
2. public class HelloClass
3. {
4. public static final String hello(String userName)
5. {
6. return "Hello World! " + userName;
7. }
8. }
当php程序执行到 $ret = lajp_call(”hello.HelloClass::hello”, $name)语句时,发生如下事情:
1. lajp_call函数参数”hello.HelloClass::hello”告诉LAJP,我要访问hello.HelloClass类中的hello方法,并且传给它一个参数$name。
2. 在lajp_call函数内部将请求包装为消息包,通过socket发送给Java服务
3. Java端的LAJP程序接收消息报,解析调用含义,找到HelloClass类和hello方法,执行方法调用,再将方法返回值包装为消息包,socket回PHP程序
4. PHP端lajp_call函数解析返回消息包,得到其中的字符串”Hello World! Ali”
二、Linux下的socket模式hello world
■ 安装之前
系统要求: Linux,安装好Apache、PHP环境
Java JDK:1.5以上。
■ 安装配置
下载 lajp-socket_[version].zip 或lajp-socket_[version].tar.gz ,解压:
1. lajp-socket_[version] //socket版
2. |
3. |–java
4. | |
5. | |–hello //Hello World示例程序
6. | | |
7. | | |–HelloClass.class
8. | | +–HelloClass.java
9. | |
10. | |–lajp_[version].jar //Java服务端主程序
11. | |–run.sh //运行脚本(Unix/Linux)
12. | +–run.bat //运行脚本(Windows)
13. |
14. +–php
15. |
16. +–php_java.php //PHP脚本
解开后有两个子目录,将php目录中的php_java.php文件复制到Apache+php环境中的发布目录,备用。
■ 编写PHP文件
1.
2. <?php header("Content-Type:text/html;charset=utf-8"); ?>
3.
4. <?PHP
5. require_once("php_java.php"); //引用下载的php_java.php文件
6.
7. $name = "Ali";
8.
9. try
10. {
11. //调用Java的hello.HelloClass类中的hello方法
12. $ret = lajp_call("hello.HelloClass::hello", $name);
13. echo "{$ret}<br>";
14. }
15. catch (Exception $e)
16. {
17. echo "Err:{$ret}<br>";
18. }
19. ?>
20.
■ 运行
1. 运行脚本程序run.sh,显示:
——————————————-
- Start LAJP-JAVA(socket)…
- time:Tue Sep 22 22:56:09 CST 2009
——————————————-
Listen port: 21230
set charser: UTF-8
以上信息表示Java服务已经运行。
2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。
OK,Hello World程序演示结束。
■ 解释
和前面的Windows环境中的相同,不再详述。
三、Linux下的消息队列模式hello world
■ 安装之前
系统要求: Linux,安装好Apache、PHP环境
Java JDK:1.5以上。
gcc编译环境。
■ 安装配置
下载lajp_[version].tar.gz ,解压:
1. lajp_[version] //消息队列版
2. |
3. |–java
4. | |
5. | |–hello //Hello World示例程序
6. | | |
7. | | |–HelloClass.class
8. | | +–HelloClass.java
9. | |
10. | |–lajp_[version].jar //Java服务端主程序
11. | +–run.sh //运行脚本
12. |
13. |–jni //JNI源代码
14. | |
15. | |–lajp_MsgQ.c
16. | |–lajp_MsgQ.h
17. | +–make.sh
18. |
19. +–php
20. |
21. +–php_java.php //PHP脚本
■ 需要编译JNI
1. 进入java/jni目录
2. chmod +x make.sh //设置make.sh有执行权限
3. vi make.sh //编辑make.sh,按注释修改脚本:
1. #!/bin/sh
2. # ———————————————————–
3. # LAJP-JNI 编译脚本 (2009-09 http://code.google.com/p/lajp/)
4. #
5. # 编译环境: Unix/Linux
6. #
7. # 源文件: lajp_MsgQ.c lajp_MsgQ.h
8. # 目标文件: liblajpmsgq.so
9. # 编译参数:
10. # –share : 编译为动态库
11. # -I : 搜索编译JNI需要的.h文件, 注意"/usr/lib/jvm/java-6-sun/"
12. # : 要换成编译环境中的JAVA_HOME路径
13. #
14. # liblajpmsgq.so发布 : 复制到<java.library.path>中,可通过java程序:
15. # : System.out.println(System.getProperties().getProperty("java.library.path"));
16. # : 获得本机的<java.library.path>
17. # ———————————————————–
18.
19. 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
修改19行的两处”/usr/lib/jvm/java-6-sun/”,替换为本机的JAVA_HOME路径。
4. ./make.sh //编译
5. 将编译出的动态库文件liblajpmsgq.so复制到/usr/lib目录。
JNI动态库.so需要复制到java.library.path路径中,此路径可通过Java程序System.out.println(System.getProperties().getProperty(”java.library.path”))得到。
编译JNI的详细步骤请看LAJP帮助文档
■ 编写PHP文件
1.
2. <?php header("Content-Type:text/html;charset=utf-8"); ?>
3.
4. <?PHP
5. require_once("php_java.php"); //引用下载的php_java.php文件
6.
7. $name = "Ali";
8.
9. try
10. {
11. //调用Java的hello.HelloClass类中的hello方法
12. $ret = lajp_call("hello.HelloClass::hello", $name);
13. echo "{$ret}<br>";
14. }
15. catch (Exception $e)
16. {
17. echo "Err:{$ret}<br>";
18. }
19. ?>
20.
■ 运行
1. 运行脚本程序run.sh,显示:
——————————————-
- Start LAJP-JAVA…
- time:Tue Sep 29 20:27:32 CST 2009
——————————————-
init [IPC] Message Queue OK…
init [IPC] Shared Memory OK…
init [IPC] Semaphore OK…
set charser: UTF-8
Start LAJP-JAVA OK…
以上信息表示Java服务已经运行。
2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。
OK,Hello World程序演示结束。
■ 解释
当php程序执行到 $ret = lajp_call(”hello.HelloClass::hello”, $name)语句时,发生如下事情:
1. lajp_call函数参数”hello.HelloClass::hello”告诉LAJP,我要访问hello.HelloClass类中的hello方法,并且传给它一个参数$name。
2. 在lajp_call函数内部将请求包装为消息包,写入系统消息队列
3. Java端的LAJP程序从消息队列中读取消息报,解析调用含义,找到HelloClass类和hello方法,执行方法调用,再将方法返回值包装为消息包,写入系统消息队列
4. PHP端lajp_call函数从消息队列中读取并解析返回消息包,得到其中的字符串”Hello World! Ali”
LAJP开源项目的网址:http://code.google.com/p/lajp/