PHP调用javaBridge解析mpp文件内容
PHP/Java Bridge 是一种基于 XML 的流式网络协议的实现,可用于将本机脚本引擎(例如 PHP、Scheme 或 Python)与 Java 虚拟机连接起来。它比通过 SOAP 的本地 RPC 快 50 倍,在 Web 服务器端需要更少的资源。它比通过 Java 本机接口的直接通信更快、更可靠,并且不需要额外的组件来从 PHP 调用 Java 过程或从 Java 调用 PHP 过程。
官网地址:http://php-java-bridge.sourceforge.net/pjb/
MPP是Microsoft Project项目管理软件的文件扩展名,此软件旨在帮助个人跟踪,组织或维护项目。
使用mpxj相关jar包可解析mpp文件内容,让PHP程序调用Java类读取。
官网地址:http://www.mpxj.org/
GitHub地址:https://github.com/joniles/mpxj/releases
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 查询Java环境变量
# 手动安装方式
如果是手动安装的JDK环境,找到配置的环境变量目录。
# yum安装方式
[root@localhost mpp]# whereis javac
javac: /usr/bin/javac /usr/share/man/man1/javac.1.gz
1
2
2
可以看到/usr/bin/javac, 一般来说安装时 /usr/bin 默认加入了 PATH 路径。 通过查询出来的 javac 信息,追踪环境变量真实目录。
[root@localhost mpp]# ll /usr/bin/javac
lrwxrwxrwx. 1 root root 23 Oct 29 02:53 /usr/bin/javac -> /etc/alternatives/javac
1
2
2
继续追踪路径。
[root@localhost mpp]# ll /etc/alternatives/javac
lrwxrwxrwx. 1 root root 70 Oct 29 02:53 /etc/alternatives/javac -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/bin/javac
1
2
2
查找到真实路径,说明JAVA_HOME环境变量目录在此。
[root@localhost mpp]# ll /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/bin/javac
-rwxr-xr-x. 1 root root 9112 Oct 27 08:52 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/bin/javac
1
2
2
使用目录:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64
,查看此目录。
[root@localhost mpp]# ll /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64
total 184
-rw-r--r--. 1 root root 1522 Oct 27 08:28 ASSEMBLY_EXCEPTION
drwxr-xr-x. 2 root root 4096 Oct 29 02:53 bin
drwxr-xr-x. 3 root root 132 Oct 29 02:53 include
drwxr-xr-x. 4 root root 95 Oct 29 02:53 jre
drwxr-xr-x. 3 root root 144 Oct 29 02:53 lib
-rw-r--r--. 1 root root 19274 Oct 27 08:28 LICENSE
drwxr-xr-x. 2 root root 204 Oct 29 02:53 tapset
-rw-r--r--. 1 root root 157063 Oct 27 08:28 THIRD_PARTY_README
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 准备依赖包
# 将MPXJ依赖包放入环境变量目录
jar包下载地址:https://github.com/joniles/mpxj/releases 准备好如下jar包:
- mpxj.jar
- 解压文件后mpxj\lib目录下的所有jar包。
将准备好的jar包放入环境变量目录(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64)下的jre/lib/ext下面。
[root@localhost ext]# ll
total 25468
-rw-r--r--. 1 root root 4004256 Oct 27 08:28 cldrdata.jar
-rw-r--r--. 1 root root 353793 Apr 5 2021 commons-codec-1.15.jar
-rw-r--r--. 1 root root 751914 Dec 17 2019 commons-collections4-4.4.jar
-rw-r--r--. 1 root root 2213560 Dec 17 2019 commons-math3-3.6.1.jar
-rw-r--r--. 1 root root 9441 Oct 27 08:28 dnsns.jar
-rw-r--r--. 1 root root 317195 Apr 27 2020 FastInfoset-1.2.16.jar
-rw-r--r--. 1 root root 45024 Dec 11 2014 hamcrest-core-1.3.jar
-rw-r--r--. 1 root root 27156 Apr 27 2020 istack-commons-runtime-3.0.8.jar
-rw-r--r--. 1 root root 48729 Oct 27 08:28 jaccess.jar
-rw-r--r--. 1 root root 44399 Apr 27 2020 jakarta.activation-api-1.2.1.jar
-rw-r--r--. 1 root root 115498 Apr 27 2020 jakarta.xml.bind-api-2.3.2.jar
-rw-r--r--. 1 root root 1013367 Apr 27 2020 jaxb-runtime-2.3.2.jar
-rw-r--r--. 1 root root 16537 Apr 5 2021 jcl-over-slf4j-1.7.30.jar
-rw-r--r--. 1 root root 197201 Jan 27 2020 jgoodies-binding-2.13.0.jar
-rw-r--r--. 1 root root 37807 Jan 27 2020 jgoodies-common-1.8.1.jar
-rw-r--r--. 1 root root 413906 Aug 20 05:30 jsoup-1.14.2.jar
-rw-r--r--. 1 root root 382708 Oct 22 2020 junit-4.13.1.jar
-rw-r--r--. 1 root root 1208395 Oct 27 08:28 localedata.jar
-rw-r--r--. 1 root root 617 Oct 27 08:28 meta-index
-rw-r--r--. 1 root root 2750498 Nov 1 02:43 mpxj.jar
-rw-r--r--. 1 root root 2033825 Oct 27 08:28 nashorn.jar
-rw-r--r--. 1 root root 2906684 Apr 5 2021 poi-5.0.0.jar
-rw-r--r--. 1 root root 100090 Mar 29 2021 rtfparserkit-1.16.0.jar
-rw-r--r--. 1 root root 41472 Apr 4 2021 slf4j-api-1.7.30.jar
-rw-r--r--. 1 root root 24510 Feb 23 2020 SparseBitSet-1.2.jar
-rw-r--r--. 1 root root 6096861 Feb 3 2020 sqlite-jdbc-3.30.1.jar
-rw-r--r--. 1 root root 38099 Apr 27 2020 stax-ex-1.8.1.jar
-rw-r--r--. 1 root root 44657 Oct 27 08:28 sunec.jar
-rw-r--r--. 1 root root 306660 Oct 27 08:28 sunjce_provider.jar
-rw-r--r--. 1 root root 312979 Oct 27 08:28 sunpkcs11.jar
-rw-r--r--. 1 root root 72080 Apr 27 2020 txw2-2.3.2.jar
-rw-r--r--. 1 root root 79841 Oct 27 08:28 zipfs.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 修改PHP配置
找到php.ini配置文件,找到参数allow_url_include
将其值修改为On
。
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include = On
1
2
3
2
3
具体重启操作以系统环境为准。
# 重启php-fpm
systemctl restart php-fpm.service
1
2
2
# 测试可用性
jar包下载地址:http://php-java-bridge.sourceforge.net/pjb/download.php
- JavaBridge.jar
启动桥接器,选择一个可用的端口。
[root@localhost mpp]# java -jar JavaBridge.jar SERVLET_LOCAL:8089
Nov 24 12:47:05 JavaBridge INFO : VM : 1.8.0_312@https://www.redhat.com/
Nov 24 12:47:05 JavaBridge INFO : JavaBridge version : 7.2.1
Nov 24 12:47:05 JavaBridge INFO : logFile :
Nov 24 12:47:05 JavaBridge INFO : default logLevel : 3
Nov 24 12:47:05 JavaBridge INFO : socket : SERVLET_LOCAL:8089
Nov 24 12:47:05 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
Nov 24 12:47:05 JavaBridge INFO : php.java.bridge.base: /root
Nov 24 12:47:05 JavaBridge INFO : thread pool size : 20
Nov 24 12:47:05 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8089
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
准备好一个test.mpp文件和read.php文件。 read.php文件内容如下:
<?php
$filePath = "/test.mpp";
$filePath = getcwd() . $filePath;
if(!file_exists($filePath))
{
var_dump("文件不存在");
return;
}
require_once("http://localhost:8089/JavaBridge/java/Java.inc");
$mppRead = new java('net.sf.mpxj.mpp.MPPReader');
try
{
$fileContent = $mppRead->read($filePath);
var_dump($fileContent);
die();
}
catch (Exception $e)
{
//var_dump($e);
var_dump('Execution exception.');
return;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
执行read.php脚本,不抛出异常则说明调用成功。
[root@localhost read]# php read.php
1
查看连接器java -jar JavaBridge.jar SERVLET_LOCAL:8089
运行时是否有报错。
正常情况如下:
[root@localhost mpp]# java -jar JavaBridge.jar SERVLET_LOCAL:8089
Nov 24 13:09:24 JavaBridge INFO : VM : 1.8.0_312@https://www.redhat.com/
Nov 24 13:09:24 JavaBridge INFO : JavaBridge version : 7.2.1
Nov 24 13:09:24 JavaBridge INFO : logFile :
Nov 24 13:09:24 JavaBridge INFO : default logLevel : 3
Nov 24 13:09:24 JavaBridge INFO : socket : SERVLET_LOCAL:8089
Nov 24 13:09:24 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
Nov 24 13:09:24 JavaBridge INFO : php.java.bridge.base: /root
Nov 24 13:09:24 JavaBridge INFO : thread pool size : 20
Nov 24 13:09:24 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8089
------------------------------------------------------------------------------------
有报错的情况如下:
[root@localhost mpp]# java -jar JavaBridge.jar SERVLET_LOCAL:8089
Nov 24 12:47:05 JavaBridge INFO : VM : 1.8.0_312@https://www.redhat.com/
Nov 24 12:47:05 JavaBridge INFO : JavaBridge version : 7.2.1
Nov 24 12:47:05 JavaBridge INFO : logFile :
Nov 24 12:47:05 JavaBridge INFO : default logLevel : 3
Nov 24 12:47:05 JavaBridge INFO : socket : SERVLET_LOCAL:8089
Nov 24 12:47:05 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
Nov 24 12:47:05 JavaBridge INFO : php.java.bridge.base: /root
Nov 24 12:47:05 JavaBridge INFO : thread pool size : 20
Nov 24 12:47:05 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8089
Nov 24 12:53:50 JavaBridge ERROR: An exception occured: php.java.bridge.util.NoSuchProcedureException: static read([o:PhpParserString]). Candidates: []
php.java.bridge.util.NoSuchProcedureException: static read([o:PhpParserString]). Candidates: []
at php.java.bridge.JavaBridge.checkM(JavaBridge.java:1109)
at php.java.bridge.JavaBridge.Invoke(JavaBridge.java:1048)
at php.java.bridge.parser.Request.handleRequest(Request.java:426)
at php.java.bridge.parser.Request.handleRequests(Request.java:509)
at php.java.bridge.JavaBridge.handleRequests(JavaBridge.java:173)
at php.java.bridge.http.JavaBridgeRunner.doPut(JavaBridgeRunner.java:203)
at php.java.bridge.http.HttpServer.service(HttpServer.java:289)
at php.java.bridge.http.HttpServer$Runner.run(HttpServer.java:205)
at php.java.bridge.util.ThreadPool$Delegate.run(ThreadPool.java:60)
at php.java.bridge.util.AppThreadPool$Delegate.run(AppThreadPool.java:58)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
上次更新: 2023/09/16, 02:28:15