当前位置:编程学习 > JAVA >>

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/

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


用Quercus来跑我们的wordpress:

Quercus 4.0.25  .war  src  2012-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版本信息:
1.jpg


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跑跑试试?

3.jpg

留下一些问题给大家讨论:
1、兼容性问题和PHP版本问题(也许有人会说这么麻烦我还不如用nginx+apache+php5+resin做集群?)。
2、未知性和安全性问题?
3、我们把php放到java里面跑有必要吗?什么业务才会用到这种结构?
4、假如集成了PHP那么我们可以做那些Java做不了的事?
5、能否把Quercus改改做成一个能把PHP转换成Java(mode2)?
其他的大家考虑下?
补充:Web开发 , php ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,