Quercus让你的PHP开心在Servlet容器奔跑-基于 Java 的   发布时间:2017-09-07 14:46:52

Quercus让你的PHP开心在Servlet容器奔跑-基于 Java 的 PHP 框架


简介

Quercus 是一个开源 PHP 5 引擎,它已经拥有了纯 Java 的完整实现。Quercus 文档指出,Quercus 在 Resin 应用服务器之上运行,利用了负载平衡、代理缓存等 Resin 特性。本文介绍了在 Apache Tomcat 之上运行 Quercus 所提供的特性。另外,本文还将展示 Quercus 针对 Web 服务和应用程序的 “PHP + Java” 混合方法的易用性和灵活性。



为何选择 Quercus?

Quercus PHP 库在 Java 中得到了完整的实现,这对 Java 和 PHP 应用程序都有好处。由于 Java 和 PHP 之间的紧密集成,Quercus 应用程序能够使用 Java 技术以及 Spring、Hibernate 和 SOA 等框架。为促进这种互操作性,Quercus 提供了一个 API,以便从 PHP 调用 Java 库。



其他好处还包括:

易于开发:PHP 库在 Java 中实现,这使它们更快速、更稳定、更易于使用。开发人员不必担心基于 C 语言的 PHP 实现中出现的分段(segmentation)错误和 C 指针溢出。

可伸缩性:作为一个基于 Java 的实现,Quercus 在 Resin 和 Apache Tomcat 等应用服务器之上运行。这样,专题系统,它就可以利用应用服务器提供的所有特性,如连接池、分布式会话等。

国际化:由于 Quercus 是一个 PHP 的 Java 实现,它本身就支持 16 位 Unicode 字符串和函数。



Quercus应用:



官方地址:http://quercus.caucho.com/



客户管理应用程序流



如上图所示,HTTP 请求被 Tomcat 接收。web.xml 中的配置定义了解析 php 文件的 QuercusServlet 对象。这个对象是一个 Java servlet,它提供与 Quercus 库的接口。在这个样例应用程序中,在 php 文件中实例化的一个 PDO 对象通过 MySQL 连接器实例化与 MySQL 数据库的连接。PDO(PHP Data Object,PHP 数据对象)以一种统一的方式提供数据库访问,包括预处理语句等高级特性。





用Quercus来跑我们的wordpress:



Quercus 4.0.25.warsrc2012-02-02

WAR下载:http://caucho.com/download/quercus-4.0.25.war

源码下载:http://caucho.com/download/quercus-4.0.25-src.jar



下载war后用rar解压然后copy下lib下的jar包:

quercus-4.0.25\WEB-INF\lib

cdi-16.jar javamail-141.jar resin.jar

resin.jar resin 依赖,包含了Quercus。

Quercus 4.0.25 当中的PHP版本信息:







Quercus

PHP Version => 5.3.2

System => Windows 7 6.1 x86

Build Date => 20100511

Configure Command => n/a

Server API => CGI

Virtual Directory Support => disabled

Configuration File (php.ini) Path => null

PHP API => 20031224

PHP Extension => 20041030

Debug Build => no

Thread Safety => enabled

Registered PHP Streams => php, file, http, https







显然PHP的版本不会是最新的,PHP5.3.2不过也能得到良好的支持。由于Quercus会把PHP代码编译成Java的Servlet而java的语法要求是非常严格的,所以并不是所有的PHP程序都能非常顺利的通过Quercus跑在Servlet容器上。所谓痛并快乐着只要代码规范跑起来还是没有问题的。



新建一个JavaWeb工程,在WEB-INF\lib下引入:cdi-16.jar javamail-141.jar resin.jar

复制如下配置到web.xml


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
<description>Caucho Technology's PHP Implementation</description>
<servlet>
<servlet-name>Quercus Servlet</servlet-name>
<servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
<!--
Specifies the encoding Quercus should use to read in PHP scripts.
-->
<init-param>
<param-name>script-encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--
Tells Quercus to use the following JDBC database and to ignore the
arguments of mysql_connect().
-->
<!--
<init-param>
<param-name>database</param-name>
<param-value>jdbc/test</param-value>
</init-param>
-->
<!--
<init-param>
<param-name>ini-file</param-name>
<param-value>WEB-INF/php.ini</param-value>
</init-param>
-->
<!--
Location of the license to enable php to java compilation.
-->
<init-param>
<param-name>license-directory</param-name>
<param-value>WEB-INF/licenses</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Quercus Servlet</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.php</welcome-file>
</welcome-file-list>
</web-app>




需要注意的地方是编码问题:<param-value>UTF-8</param-value>

此处留你数据的编码,默认不配置是中文乱码。

<url-pattern>*.php</url-pattern>此处还需要解释吗?我们可以配置为任意的后缀比如htm?配置后一切以*.htm结束的URL都会以PHP方式解析。



安装的时候提示了几处异常错误没办法既然是体验就只好绕路了。WAMP安装完成后再用TOMCAT跑跑试试?







留下一些问题给大家讨论:

1、兼容性问题和PHP版本问题(也许有人会说这么麻烦我还不如用nginx+apache+php5+resin做集群?)。

2、未知性和安全性问题?

3、我们把php放到java里面跑有必要吗?什么业务才会用到这种结构?

4、假如集成了PHP那么我们可以做那些Java做不了的事?

5、能否把Quercus改改做成一个能把PHP转换成Java(mode2)?

其他的大家考虑下?

,专题

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉建网站 https://www.feimao666.com