简介

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

安装 Quercus 很简单,即将 jar 文件安装到一个 Java 应用程序,但由于 Quercus 是 Resin 应用服务器的一个特性,因此它也构建在 Resin 中。没有必要下载 PHP 引擎,因为 Quercus 就可以充当 PHP 引擎。按照以下步骤安装 Quercus:

  • 从公司 Web 站点下载 Resin 应用服务器(参见 参考资料)。
  • 打开这个压缩文件并解压缩 jar 文件:quercus.jar、resin-util.jar 和 javamail-141.jar。
  • 将这些文件和 MySQL 连接器 jar 文件(如果需要)复制到您的 Web 应用程序的 WebContent\WEB-INF\lib 文件夹。
  • 另一种简单的安装方法是以本文末尾提供的压缩样例应用程序为基础,从那里复制库(参见 下载)。

进入 Quercus

为介绍 Quercus 的特性,我将向您展示一个简单的 HelloWorld 示例。这个应用程序可以通过以下步骤创建。(本文使用的所有应用程序都是使用 Eclipse IDE 创建的,有些步骤还提供了屏幕快照,以便它们更加直观。您也可以选择其他 IDE)。

以下步骤的基本目的是创建一个动态 Web 应用程序项目,将它指向应用服务器运行时(本例中是 Apache Tomcat),并配置 php.ini 和 web.xml 等参数。

  • 在 IDE(本例中为 Eclipse)中创建一个新的 Web 项目,如图 1 所示(Alt + Shift + N)。

图 1. 创建新项目

  • 输入项目名称并指向运行时。图 2 显示了一个样例设置屏幕。

    • 单击 File --> New (Alt + N),在默认工作空间中创建一个名为 TestHelloWorld 的新的动态 Web 应用程序。
    • 我将 Apache Tomcat Version 5.5 配置为应用程序的运行时环境。

图 2. 设置新项目

  • 复制一个包含 Quercus 和联合 jar 文件的目录结构(如图 3 所示)。另外,创建 WebContent、META-INF(包含清单文件或上下文文件)和 JavaScript resources 等文件夹。

图 3. 建立目录结构

TestHelloWorld 项目的根目录包含以下文件夹:

  • WebContent:这个目录中的 WEB-INF 目录的 lib 文件夹包含 quercus.jar 等库,META-INF 目录包含 Manifest.mf 文件。WEB-INF 文件夹还包含这个 Web 应用程序的静态和动态内容,如 php、jsp 或 html 文件。
  • Java Resources:这个目录包含一些库,如 Apache Tomcat 库、JRE 和 Web 应用程序库。
  • JavaScript resources:这个目录包含您想要在项目中包含的任何资源。

服务器可以通过 IDE 创建和配置,并在普通或调试模式下执行(见图 4)。

Eclipse 中的 J2EE 透视图有一个 server 选项卡,右键单击该选项卡将显示一个创建新服务器的选项(见图 4)。这个服务器可以用于从 Eclipse IDE 管理应用服务器。

图 4. 配置一个新服务器

除非有特殊需要,定义这个新服务器只需选择默认值即可(见图 5)。服务器运行时与创建项目时选择的运行时一致,即 Apache Tomcat Version 5.5。

图 5. New Server 配置选择的选项

  • 配置好服务器后,该资源可以从左侧的 “available” 列添加到右侧的 “configured” 列。

新服务器完成配置后,新创建的资源需要在服务器上配置(见图 6)。这个服务器配置将部署在开发过程中创建的资源。

图 6. 在服务器上配置资源

回页首

配置 Quercus

php.ini 文件用于配置 PHP 的行为,比如设置目录、设置文件路径、更改会话等。这个文件可以在 web.xml 文件中指定,清单 1 显示了一个示例。

清单 1. 在 web.xml 文件中指定 php.ini

       <init-param>         <param-name>ini-file</param-name>         <param-value>WEB-INF/php.ini</param-value>       </init-param>           

PHP 源文件的编码通过脚本编码表示,按照清单 2 所示的方法定义。

清单 2. web.xml 文件中的 PHP 编码规范

       <init-param>         <param-name>script-encoding</param-name>         <param-value>UTF-8</param-value>       </init-param>           

QuercusServlet 是一个指向 Quercus 引擎的接口,它解析 php 文件,通常按照清单 3 所示内容配置。

清单 3. web.xml 文件中的 QuercusServlet 的配置

       <web-app xmlns=”http://java.sun.com/xml/ns/j2ee”   xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”    xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”    version=”2.4”>    <description>Quercus Hello World on Tomcat</description>   <servlet>        <servlet-name>Quercus Servlet</servlet-name>    <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>           

Quercus hello world php 文件(index.php)描述

index.php 文件定义一个名为 getTheDate 的方法,该方法实例化一个 Java 对象。Quercus 能够通过使用导入语句利用任何 Java 类,这使它具有很高的互操作性和灵活性。清单 4 显示了一个示例。

清单 4. PHP 导入函数示例

       <?php    function getTheDate() {    import java.util.Date;    $currentDate = new Date();    return $currentDate;    }   ?>              

清单 5 中的代码展示了在 HTML 片段中调用 getTheDate() 和 phpinfo() 方法。

清单 5. 对 getTheDate() 和 phpinfo() 的调用

       <body>   <h1>This is the Hello World page</h1>   <h3>but, it does something more then Hello World!</h3>   <h4> The current date and time is :<?php echo getTheDate() ?></h4>   <h4> and finally here is the phpInfo: <?php echo phpinfo()?>   </body>  

代码更改后需要启动服务器,这样才能测试 HelloWorld 应用程序。为此,右键单击此前创建的服务器配置并单击运行或调试选项。

图 7. 以调试或运行模式启动服务器

图 8 显示了启动服务器并转到相应 URL 后应用程序的最终输出。

请注意,本文末尾的样例文件 HelloWorld.zip 包含这个应用程序的压缩版本(参见 下载)。该文件还包含 Eclipse 需要的元数据文件,以便直接地无缝导入该 IDE。

图 8. Hello World 页面的输出

回页首

Quercus 的实际应用

现在让我们检查一个真实示例。图 9 显示了一个 Manage Customer 页面,通过该页面,用户可以执行一些操作,如添加一个新客户、查找一个客户、查看数据库中的所有客户。

图 9. 客户管理应用程序流

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

Manage Customer 应用程序的目录结构(如图 10 所示)与前面介绍的 HelloWorld 示例的目录结构相同。

图 10. Manage Customer 应用程序的目录结构

注意,这个应用程序的核心文件包含在以下子目录下的 WebContent 文件夹中:

  • META-INF:包含连接到 MySQL 数据库的凭证信息。
  • WEB-INF:包含库文件夹,库文件夹又包含运行应用程序的 Quercus jar 等文件。这个文件夹还包含描述数据源的 web.xml 文件。
  • 所有关联的 php 和 html 文件都包含在 WebContent 文件夹中。这些文件充当应用程序的视图部分,向 Web 应用程序提供动态和静态内容。

请注意,本文末尾的样例文件 ManageCustomer.zip 包含这个应用程序的压缩版本(参见 下载)。该文件还包含 Eclipse 需要的元数据文件,以便直接地无缝导入该 IDE。

配置 Tomcat 和 MySQL

Tomcat 的配置与 HelloWorld 应用程序的配置非常相似。此外,我们需要定义一个资源引用(如清单 6 所示)。这个元素指定一个资源管理器连接工厂引用的名称。在本例中,它是在 jdbc/mysql 中指定的数据库连接,其类型为 javax.sql.DataSource。

清单 6. web.xml 中的资源引用定义

       web.xml   . . .   <resource-ref>         <description>DB Connection</description>         <res-ref-name>jdbc/mysql</res-ref-name>         <res-type>javax.sql.DataSource</res-type>         <res-auth>Container</res-auth>   </resource-ref>   . . .  

我们需要在 WebContent/META-INF 文件夹下的 context.xml 中定义连接资源,如清单 7 所示。该资源包含驱动程序名、jndi 名称、用户名、密码、数据类型和 url 等属性。

清单 7. 在 context.xml 中定义的属性

       context.xml   . . .   <Context>   <Resource driverClassName="com.mysql.jdbc.Driver"    maxActive="4" maxIdle="2" maxWait="5000" auth="Container"    name="jdbc/mysql" password="" type="javax.sql.DataSource"    url="jdbc:mysql://localhost:3306/customer" username="root"/>   </Context>   . . .  

客户数据库只有一个表,该表可以通过运行以下脚本创建:

 use customer;   CREATE TABLE users (    id INT NOT NULL PRIMARY_KEY AUTO_INCREMENT,     name VARCHAR(200)   );  

请注意,HelloWorld 应用程序使用的配置步骤(比如创建一个新的服务器配置、添加资源、在调试或运行模式下启动服务器等)也可以以类似的方式应用于这个应用程序。

回页首

应用程序概要

应用程序 Manage Customer 的索引页面显示了一列用户可以执行的操作(见图 11)。

图 11. Manage Customer 的索引页面的屏幕快照

索引页面支持以下操作:

  • Add Customer
  • Search Customer
  • View all Customers
  • Delete all Customers

显示所有操作的 index.html 页面由拥有独立动作的多个表单组成。仔细查看一下 “Add Customer”。对应的 html 包含一个对 addCustomer.php 的引用(作为表单动作)和 POST 方法。

 <H2>Add Customer</H2>   <form action="addCustomer.php" method="post">   <label>Customer name</label>   <input type="text" id="customerName" name="customerName"/>   <input type="submit" value="Add"/>   </form>  

动作中的 php 代码从 POST 提取 customerName 参数并为插入创建一个 sql 语句。然后通过传入数据源的 jndi 名称实例化一个 PHP 数据对象。

 <?php   $custName = $_POST['customerName'];   $pdo = new PDO("java:comp/env/jdbc/mysql");   $sql = "insert into users values ('" . $custName . "');";     $rows = $pdo->exec($sql);     if ($rows>0) {     echo("<h4> Adding ". $custName . " was successful</h4>");   }   else echo('<h4> An error occurred</h4>');   ?>  

Look Up、View All 和 Delete 的操作也以类似的方式实现(参见 下载 部分附带的源代码)。

图 12. View all Customers 页面的屏幕快照

回页首

结束语

本文介绍了运行在 Apache Tomcat 之上并连接到一个 MySQL 数据库的 Quercus 的特性。作为一个在 Java 中全面实现的 PHP 框架,Quercus 能够利用 Spring 和 Hibernate 等基于 Java 的框架。由于具有 PHP 特征,对于开发人员来说,Quercus 有很高的可用性。同时,由于其核心框架已经在 Java 中实现,Quercus 很健壮并具有可伸缩性。

回页首

下载

描述 名字 大小 下载方法
样例代码 TestHelloWorld.zip 1.7MB HTTP
样例代码 ManageCustomer.zip 1.9MB HTTP

关于下载方法的信息

参考资料

学习

  • 阅读 Running Quercus PHP Java interpreter on WAS for z/OS。
  • 发现 Quercus 文档。
  • 参阅这个 PHP 推荐阅读列表。
  • 查看 My developerWorks,您可以在那里发现和创建关于 Web 开发和其他感兴趣的主题的小组、博客和活动。
  • 查看 Eclipse.org 上的 Eclipse 文档 页面,获取导航这个 IDE 的键盘控制信息(搜索 “keyboard”)。
  • developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播。
  • developerWorks Web development 专区:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。

获得产品和技术

  • 从该公司的 Web 站点 下载 Resin。

关于作者

Sachin 毕业于美国盐湖城犹他大学,获得硕士学位。他曾为美国和印度的多个规模不等的公司工作,担任各种技术和管理职务。Sachin 目前在 IBM Software Group 的 Lotus 分公司工作。

基于 Java 的 PHP 框架 —— Quercus 简介(转)相关推荐

  1. 基于JAVA(Springboot框架)助农商城平台系统设计与实现 毕业设计开题报告

      本科生毕业论文 基于JAVA(Springboot框架)助农商城平台 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学本科生毕业 ...

  2. mongodb orm java_基于Java的ORM框架 Mongodb-ORM

    软件介绍 mongodb-orm简介Mongodb ORM是基于java的ORM框架,简化了SDK的使用,使代码变得更清晰.简单. 与Ibatis类似,将查询.执行语句封装在xml中,与代码隔离.简称 ...

  3. 9个基于Java的搜索引擎框架

    9个基于Java的搜索引擎框架 转自:http://blog.csdn.net/xiaomin1991222/article/details/50980573 1.Java 全文搜索引擎框架 Luce ...

  4. javaml_一些基于Java的AI框架:Encog,JavaML,Weka

    javaml 在进行编程收集情报工作时,我发现自己花了很多时间将Python代码转换为Java,通常对我的进度缓慢感到不耐烦,所以我一直在寻找替代方法. 我发现3: Encog – Heaton研究 ...

  5. 一些基于Java的AI框架:Encog,JavaML,Weka

    在进行编程收集情报工作时,我发现自己花了很多时间将Python代码转换为Java,由于通常对我的进度缓慢感到不耐烦,所以我一直在寻找替代方法. 我发现3: Encog – Heaton研究 Java语 ...

  6. 基于Java(SSH 框架)+MySQL 实现的物流配送管理系统【100010488】

    基于 Java 中 SSH 框架的物流配送管理系统 项目各文件介绍 Logistics_Manage_System 项目主文件,也就是该项目你需要导入运行的文件 hibernate_mapping 这 ...

  7. Java字节码框架ASM简介

    Java字节码框架ASM简介 1. ASM概述 1.1 ASM简介 1.2 ASM提供API 1.3 ASM核心模块 2. ASM应用 2.1 ASM依赖 2.2 代码实现 2.3 测试验证 1. A ...

  8. 基于java下Springboot框架实现小区物业管理系统

    基于java下Springboot框架实现小区物业管理系统 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:N ...

  9. 基于Java后台(Springboot框架)+小程序(MINA框架)+Mysql数据库的小程序商城系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序商城系统,前台用户使用小程序,小程序使用微信开发者工具开发:后台管理使用基JAVA+MySql的C/S架构,开发工具使用IDEA: ...

最新文章

  1. 赠书 | 成为一个多模型思考者,从掌握数据跃迁到拥有智慧
  2. POJ-2234 Matches Game---尼姆博奕裸题
  3. python安装步骤图解-Python安装-小白图文教程(精)
  4. Android 实现简单的插件化模块化
  5. javascript Array方法总结
  6. linux nagios 检查udp端口,nagios插件之监控udp端口状态
  7. [BUUCTF-pwn]——pwn1_sctf_2016
  8. 文件内容查看---Linux
  9. Python私有变量的用法
  10. 养老金中除以139是什么意思?
  11. 卧槽!迅雷的代码竟然被扒了精光!
  12. android绑定两个ip,安卓手机模拟器如何多开切换IP防封号的最新方法介绍
  13. svn图标不显示的问题
  14. 软文成功案例,给企业带来的价值不可限量
  15. 设置水平线高度html代码是size,html水平线样式 Width:设置水平线的宽度
  16. html5清除所有,html5 canvas永久清除
  17. CVE-2020-1971: OpenSSL 拒绝服务漏洞通告
  18. 狂降1000!苹果最悲情产品大降价!
  19. bpsk传输系统实验matlab,通信原理实验4 BPSK系统仿真matlab程序
  20. 推荐一个开源的租房管理软件

热门文章

  1. WIX:html5拖拽式建站,个人建站首选,操作方便快捷
  2. 织梦模板使用方法-安装教程
  3. 白帽子到底是黑还是白?
  4. oracle_PLSQL_语法详细手册
  5. pythonword字体_Python复制Word内容并使用格式设字体与大小实例代码
  6. 海思3520Dv300和NVP6124B摄像头自适应
  7. iOS 使用AVFoundation 扫描二维码并限定扫描区域(带代码生成蒙版)
  8. 高逼格UI-ASD(Android Support Design)
  9. 在网络工程师行业里,这6个误解,你知道吗
  10. 鸡蛋重量实验及蛋白质性价比分析 2020-12-10