内容


基于 Java 的 PHP 框架 —— Quercus 简介

Comments

简介

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. 创建新项目
Eclipse 界面屏幕快照,启动一个新的 Dynamic Web Project
Eclipse 界面屏幕快照,启动一个新的 Dynamic Web Project
  • 输入项目名称并指向运行时。图 2 显示了一个样例设置屏幕。
    • 单击 File --> New (Alt + N),在默认工作空间中创建一个名为 TestHelloWorld 的新的动态 Web 应用程序。
    • 我将 Apache Tomcat Version 5.5 配置为应用程序的运行时环境。
图 2. 设置新项目
TestHelloWorld 的 New Dynamic Web Project 对话框的屏幕快照
TestHelloWorld 的 New Dynamic Web Project 对话框的屏幕快照
  • 复制一个包含 Quercus 和联合 jar 文件的目录结构(如图 3 所示)。另外,创建 WebContent、META-INF(包含清单文件或上下文文件)和 JavaScript resources 等文件夹。
图 3. 建立目录结构
项目文件夹屏幕快照,显示 WEB-INF/lib 文件夹下的 javamail-141.jar、quercus.jar 和 resin-util.jar 文件
项目文件夹屏幕快照,显示 WEB-INF/lib 文件夹下的 javamail-141.jar、quercus.jar 和 resin-util.jar 文件

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. 配置一个新服务器
Eclipse 服务器配置屏幕快照。用户右键单击 Tompacat 服务器并选择 New > Server
Eclipse 服务器配置屏幕快照。用户右键单击 Tompacat 服务器并选择 New > Server

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

图 5. New Server 配置选择的选项
New Server 配置对话框屏幕快照,显示 Tomcat v5.5 Server 的默认值
New Server 配置对话框屏幕快照,显示 Tomcat v5.5 Server 的默认值
  • 配置好服务器后,该资源可以从左侧的 “available” 列添加到右侧的 “configured” 列。

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

图 6. 在服务器上配置资源
New Server 的资源配置的屏幕快照
New Server 的资源配置的屏幕快照

配置 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 页面的输出
应用程序输出的屏幕快照,显示文本、当前日期和时间以及关于运行 PHP 的信息。
应用程序输出的屏幕快照,显示文本、当前日期和时间以及关于运行 PHP 的信息。

Quercus 的实际应用

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

图 9. 客户管理应用程序流
Manage Customer 应用程序的架构图。。
Manage Customer 应用程序的架构图。。

如上图所示,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 应用程序的目录结构
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 的索引页面的屏幕快照
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 很健壮并具有可伸缩性。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development, Open source
ArticleID=453676
ArticleTitle=基于 Java 的 PHP 框架 —— Quercus 简介
publish-date=12072009