当前位置:WooYun(白帽子技术社区) >> java >> Quercus让你的PHP开心在Servlet容器奔跑-基于 Java 的 PHP 框架

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

园长 (喵~) | 2013-01-23 21:38

简介
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)?
其他的大家考虑下?

分享到:
  1. 1# 感谢(4)
    回复此人 感谢
    园长 (喵~) | 2013-01-23 21:43

    忘了一点:需要自行添加数据库支持的jar包!

  2. 2# 感谢(4)
    回复此人 感谢
    园长 (喵~) | 2013-01-24 00:14

    java自身也有延伸出来的语言,比如groovy。
    而ruby、python等也有java的实现。叫做jruby、jpython.
    Groovy是一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性.
    Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。
    JRuby,一个采用纯Java实现的Ruby解释器,由JRuby团队开发。
    wooyun的水牛们,起来喝水了。

  3. 3#
    回复此人 感谢
    horseluke (微碌) | 2013-01-24 00:27

    不是很明白用意...感觉在某语言内集成另一种语言的解析器,如果两者在目标上相近的话,市场反响不甚大...

  4. 4#
    回复此人 感谢
    shine (shield) | 2013-01-24 08:06

    个人觉得一个语言的发展,应该从纵向自身去解决缺陷,而不是横向集成去覆盖其他语言,才能突显自我。“满汉一家亲”的解决方法,它代表一部分人的想法。如果它能够满足业务,也没有理由说这样做不好。

        这里一个简单安全的问题:一个容器跑两种脚本,在脚本执行安全方面,我们就要多参考一套标准,成本也是增加的。


        所以,在这里讨论其他的问题,感觉没什么意义!

  5. 5# 感谢(4)
    回复此人 感谢
    园长 (喵~) | 2013-01-24 09:33

    @shine 生成项目中groovy与JAVAEE共存的项目遇见过,而某些时候这样的结合也是有必要的。

  6. 6#
    回复此人 感谢
    shine (shield) | 2013-01-24 09:56

    @园长 没有去否定这样结合不好或有无必要性。我的主要意思是,在安全社区只讨论这样做后可能产生的安全问题,比较好一点(讨论其他问题感觉很难有结果)。 ^-^

  7. 7#
    回复此人 感谢
    Rona (111) | 2013-01-24 10:22

    是不是可以让谷歌的那个gae支持php了?

  8. 8# 感谢(4)
    回复此人 感谢
    园长 (喵~) | 2013-01-24 10:28

    @shine 本意是想改写一个discuz和一个wordpress集成一个社区。后来想想是不是可以写一个转换程序把wordpress模版转换成ftl、servlet。因为以前做负载均衡的时候用到了resin,所以想到了用类Quercus是否可以做到(有点异想天开了)。其实已经不是单纯的java平台集成php了,如果那样apache 配上 resin 去掉默认resin对php的解析用正版php就行了。让php跑在servlet里面的确没有什么必要,wooyun是安全平台不错,但是我宁愿相信其中的大部分人都是开发者...

  9. 9# 感谢(4)
    回复此人 感谢
    园长 (喵~) | 2013-01-24 10:29

    @Rona 或许你试下。

  10. 10#
    回复此人 感谢
    piao2010 | 2013-01-28 22:37

    挺新鲜的,不过类似的需求应该比较少。

  11. 11#
    回复此人 感谢
    乌帽子 (业精于勤而荒于嬉,行成于思而毁于随。) | 2013-01-29 13:06

    折腾

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录