admin 管理员组

文章数量: 1184232


2024年4月30日发(作者:thinkphp最新框架)

维普资讯

~朱一一殊一 

的结合 

文/肖文鹏 

摘娶:本文讲蓬了妇何在I ̄lux率舍下安装和配置PHP的lava扩展穰块,以及妇何在PHP 

脚本甲剖建和调用lava对象,此外还对妇何在PHP脚本甲处理lava异常作了简娶介绍。 

PHP, Java、 Apache,Linux、PHP扩展 

一、

蔺介 

本文主要介绍如何在Linux环境下安装和配置PHP的Java 

扩展模块,以及如何利用PttP的Java扩展模块在PHP脚本中创 

作为一种Web服务器端的脚本语言,PHP凭借其强大的功能 

和优秀的跨平台特性, 始逐渐吸引人们的注意,特别是随着 

建并调用Java对象。 

Linu)(操作系统的不断普及和开放源码运动的逐渐深入,越来越多 

的开发者都开始选用Apache+PHP+MySQL作为网站的支撑平台。 

PHP最初设计目标是类似于c语言的结构化脚本语言,因 

而并没有考虑到对面向对象的支持,只是因为后来随着面向对 

象程序设计原则和方法的广泛使用,才迫使PHP的设计者们不 

得不加入了一些面向对象的基本特性。由于设计上的先天不足, 

导致PHP与一些专门的面向对象语言(如c++、Java和Python) 

相比,对面向对象特性的支持显得相当软弱和幼稚。PHP只能提 

供最基本的面向对象特性,而像虚函数、析构函数、函数 载、 

私有函数和私有变量这类特性则不被PHP所支持。 

尽管PHP在编写Web服务器端脚本方面具有诸多优点,但 

由于其面向对象的功能过于简单,因而在开发大型网站和强调 

软件复用的场合下还是显得捉襟见肘。目前解决该问题的一种 

有效方法是将PHP和Java结合起来,借助PHP在开发Web服务 

器端脚本方面的简单高效和Java在面向对象方面完整而强大的 

支持,来共同完成网站的开发工作。 

PHP之所以具有如此旺盛的生命力,一个很重要的原因在 

于其开放的体系结构和良好的可扩展性,从而使得PHP能够被 

非常方便地进行功能性扩展。为了借助Java在面向对象方面 

的优势,PHP专门针对Java语言开发了相应的功能扩展模块, 

PHP脚本可以借助Java扩展来生成Java对象,并能够通过简 

单而有效的方法来调用该对象中定义的方法。 

以下的安装和配置过程建立在Apache 1.3.24、PHP 4.1.O和 

Sun JDK 1_4 O基础之上,操作系统选用的是Re.at Lir1L1)(7.2。 

步骤一安装JDK 

JDK的安装相对来讲比较简单,只需从Sun网站http://jav ̄ 

suiz conl下载相应的软件包并解压缩到/usr/local/j2sdk1.4.0/目 

录下,然后再设置好环境变量PATH和CLASSPATH就可以了。 

步骤二安装Apache 

从Apache网站http://v ̄w.apache.org下载相应的软件包 

并解压缩到/tmp/apache

1.3.24/目录下,然后以root身份执 

行下面的命令编译并安装Apache: 

[root]#cd/tuf)/apache 1.3.24 

[root];t./configure一一enable—shared= ̄x 

[root]#make 

[root]#make instal1 

步骤三安装PHP 

从PHP网站http://www.php.net下载相应的软件包并解压 

缩到/tmp/php-4.1.O/目录下,然后以root身份执行下面的命 

令编译并安装PHP: 

[root]#cd/t ̄p/php一4.1.0 

[root]#./configure--with—apxs-/usr/local/apache/hin/apxs\ 

with—config-file—path=/usr/local/etc/t 

。。。 一 譬j ■爹_ 熏 警 雾 

。 

臻 

j—r …j j=¨ 。。 

。鬻 

曩 

: ; 

翳 0 

; 

0— 豫 鬈 

维普资讯

黔一 _ _l_ 

。i 

ith java=/usr/local/j2sdk1.4.O/ 

EEEE, dd.YYYY at h:m:ss a ZZZZ ). 

Eroot]#make 

-root]#make instal1 

print¥formatter一>format(new Java( j|dvdJ util.Date )) 

?> 

步曩四鼍置PHP的Java扩展 

将/tmp/php一4.1.0/目录下的php、ini—dist文件复制到/ 

usr/local/etc/目录下,并更名为php、ini。编辑该文件, 

在[Java]一节中加入以下几项配置信息: 

 ̄Java] 

java.1ibrary=/usr/local/j2scN1.4|O/ire/1ib/i386/client/1ibjv ̄so 

java class path=/usr/local/1ib/php/php

java jar:/usr/local/ 

将上述脚本命名为bui ldin.php,并保存到Apache的文档 

根目录/usr/local/apache/htdocs/下,如果一切正常,在浏 

览器中查看该脚奉时将显示如图1所示的贞画。 

EI —Edit—View§0 Beokma ̄s Iools window H_eIp 

0 

Javaversion=1 4 0 

tems Inc 

图匦团 。 

j2sdk1.4.O/jre/1 ib/rt.jar:/usr/local/apache/htdocs 

java hcme=/usr/local/j2sdk1.4.0 

Javavendor=SanMier ̄

0s=Linux 2,4 2—2Oili386 

星期一六月10.2902 at 2:26:38下午GMT+08:O0 

extensin dior=/usr/local/1 ib伽/e](t日1Si∞s _deb TIIrzts 0l∞0l 

extension=1 ibphp java SO 

在上面的配置信息中,java.1 ibrary为PttP指定将被调用 

的Java虚拟机所在的位置,PHP的Java扩展模块通过Java本 

地接口(JNI)来创建Java虚拟机;java.class.path为Java 

虚拟机设置查找类文件时的搜索路径,该路径中至少应该包括 

PHP Java扩展模块中提供的php java.jar和Sun JDK中提供的 

借助PttP提供的Java扩展来创建Java对象是相当简单的, 

bui ldin.php脚本的第一行创建了java lang.System类的一个实 

例,并将其保存到PHP变量¥syStem中: 

¥system=new Java( java lang.System ): 

%Document Done【q aas sect)—0 

<图1> 

rt.jar,此外若PHP脚本中要用到自定义的Java类,也要在 

此处给出这些类所在的路径:java.home为Sun JDK所在的路 

径;extension—dir为PHP的Java扩展模块所在的路径;ex- 

tension则为PttP的Java扩展模块所对应的动态连接库文件。 

步曩五重新启动ADache 

关闭当前正在运行的Apache,然后以root身份执行下面 

的命令来重新启动Apache: 

[root>ell ̄o1%LD LIBINffyAT&/usr/local/j2s&1.4|O/ire/1ib/i386/:\ 

/usr/l ̄al/j2sdk1.4|O/jre/lib/i386/client/ 

由于只给出了要创建的Java对象的类名,因而Java虚拟 

机将调用java.1ang.System类的默认构造函数。如果在PHP脚 

本中创建Java对象时除了给出类名之外还给出了其他一些参 

数,则J av a虚拟机将会根据这些参数来调用恰当的构造函 

数,例如,对于下面这条PH P语句: 

¥fP=new Java( java io File , /heme/gary/test txt ): 

[root]#/usr/local/apache/bin/apachect1 start 

Java虚拟机将会调用jaw io.File类提供的仅带一个参数 

的构造函数,并将 /home/gary/test.txt 作为参数值传递给 

三、使用J 【ll呐Java类 

先从一个简单例子开始来讲述如何在PHP中调用Java对 

象,下面的PHP脚本利用JDK中内置的Java类java lang.System、 

被调用的构造函数,从而最终创建一个用于处理/home/gary/ 

text.txt文件的File对象。 

旦Java对象被创建,PHP脚本就可以用面向对象的语法 

来访问Java类提供的公有方法和属性。例如,要通过System 

类的getProperty0方法来获Java虚拟机的版本信息,就可以 

用如下的脚本语句来实现: 

¥system->getProperty( java.version ): 

java text.SimpleDateFormat和jrdva ut i 1.Date来获得当前系 

统的一些信息。 

<?php 

//Create instance of Java class java lang.Systme in PHP 

PHP的Java扩展就是通过如此简单而有效的方法实现了对 

Java的封装,从而使PHP脚本能够直接复用己经存在的Java 

代码,极大地提高了网站开发的效率和质量,同时还为PHP 

引入了强大的面向对象的支持。 

¥system new Java( jav&lang.System ): 

//Access property. 

print ̄Java versin- .¥systoem->getPro ̄erty( jaw version*). < > 

print ̄Java vt ̄3r=- .¥system->getProperty( java vendor*). Cot> : 

print Os= .¥system->getProperty( os.name ). . 

¥system->getProperty( OS.version ). on 

Ssystem->getProperty( OS.arch ). <br> : 

//Use java uti1.Date. 

除了使用JDK中内置的Java类外,在PHP脚本中还可以 

使用自定义的Java类。下面自定义的这个Java类Calculator 

¥formatter=new Java( java text SimpleIMteFormat , 

维普资讯

用于完成对两个数的加、减、乘、除四则运算: 

publ ic Class Calculator i 

double NumberA,NumberB: 

tot实现了一个简单的Web计算器: 

<html> 

<head> 

publ ic Calculator 0 

NumberA=1. 

NumberB=1. 

<titIe>PHP Java Calculator</title> 

(/head> 

<body> 

<?php 

publ ic void setA(double a) 

NumberA=a. 

¥result=0. 

if(isset(¥numbera)&&isset(¥numberb)){ 

setType(¥numbera double ): 

public void setB(double b) 

NumberB=b, 

setType(¥numberb, double ): 

¥calc=new Java( Calculator ): 

¥calc一>setA(¥numbera): 

public double multiply0 

return NumberA NumberB 

¥calc一>setB(¥numberb): 

¥operator=~: 

switch(¥ctype){ 

public double divide0{ 

return NumberA/NumberB 

case( add ): 

Sresult=¥calc>add(). 

¥operator= 

public double add0{ 

return NumberA+NumberB 

break: 

case( sub ): 

¥result=¥calc一>subtract 0: 

publ ic double subtract 0 

return NumberA—NumberB 

¥operator= 一 : 

break: 

case( mul ): 

¥result=¥calc一>multiply0: 

将上述Java源程序命名为Calculator.java,并保存到 

Apache的文档根目录/usr/local/apache/htdocs/下。由于在/ 

¥operator= ★ 

break, 

usr/1oca1/etc/php.ini文件中,/usr/local/apache/htdocx/ 

目录己经被加到java.class.path配置项中,因而PHP脚本在 

case( div ): 

¥resuh=¥calc一>divide 0: 

¥operator= / : 

break: 

创建Calculator类的对象时,能够从该目录中查找并加载所 

需的类文件。 

) 

Sstack.= Snumbera¥operator¥numberb=¥result<br> 

在生成Calculator.java文件后,执行下面的命令对其进 

行编译,得到Java虚拟机所需要的类文件Calculator.class: 

[root]n cd/usr/1ocal/apache/htdocs/ 

print( <h2>¥stack</h2> ): 

) 

?> 

[root]n javac Calculator.java 

旦自定义Java类的源程序能够正确通过编译,就可以 

<hi>Input two numbers:</hi> 

<form act ion- calc.php method= post > 

<table bgcolor-  ̄dfdfdf cellspacing= 0 cellpadding= 3 

在PHP脚本中创建该Java类的对象,并调用该对象提供的公 

有方法和属性。下面的PHP脚本利用自定义的Java类Calcula- 

order- 0 > b

<tr> 

<td>Number A:</td> 

<td><input type- text name- numbera ></td> 

</tr> 

<tr> 

<td>Method:</td> 

<td> 

<select nalne- ctype > 

维普资讯

<option value= add >Add</option> 

<option value= sub >Subtract</option> 

<option value= mul >Multiply</option> 

<option value= div >Divide</option> 

</select> 

异常处理是Java语言中一个非常重要的机制,PHP的Java扩 

展通过使用函数java last exceptionlet 0和java lsta exception 

</td> 

</tr> 

<tr> 

clear 0,在PHP脚本中实现了对这一机制的支持。 

若P卜Ⅱ)的Java扩襞模块通过Java本地接口(JNI)创建的 

Java虚拟机有异常抛出时,将最终导致一个PHP警告信息的产 

生,同时还将返回一个空值(NuLL)。此时若在PHP脚本中 

调用函数java last~except ion get 0,则可以获得异常的相关 

信息,利用这些信息可以对异常情况做进一步的处理。当异常处 

0函数来 

理完后,P}Ⅱ)脚本应该调用javaflast

exception

clear 

<td>Number B:</td> 

<td><input type= text naiile= numberb 、 

</tr> 

</table> 

<br> 

<input type= submit value= Calculate 、 

清除所有的异常信息,从而保证程序在逻辑上的正确性。 

下面的Java类ReverseString用于完成对字符串的转置运 

算,该类中的reverse 0方法中包含一个数组越界错误,因此 

Java虚拟机在执行该方法时将有一个异常被抛出。 

import java io.Writer: 

import java.io.IOException: 

import java lang.Exception: 

<input type=*hidden value= <?php print(¥stack)?> name-- stack > 

<『t0rm> 

</body> 

</html> 

将上述脚本命名为calc.php,并保存到Apache的文档根 

目录/usr/local/apache/htdocs/下,如果一切正常,在浏览 

器中查看该脚本时将显示如图2所示的页面。 

public class ReverseString{ 

public Writer out 

public void setWriter(Writer out)i 

this.out=out: 

; 

public void reverse(String string)throws Exception i 

try f 

//Reverse the input string. 

char tempi]=new char[string.1ength0]: 

for(int i=0:i<string.1ength0:i++) 

temp[i]=string.charAt(string,length0一i). 

String reserved=new String(temp): 

<图2> 

out.*rite(reserved): 

}catch(Exception e)f 

//Catch everything else, 

由于PHP属于弱类型定义语言,而Java则属于强类型定义 

语言,为弥补两者之间的差异,当PHP中的变量作为参数传递 

给Java对象之前,可以先调用P}Ⅱ)提供的函数setType0来设置 

参数的类型。例如,下面这两条PHP语句: 

setType(¥numbera, double ): 

setType(¥number ̄ double ): 

throw new Exception( Some error happened ), 

} 

} 

将上述Java源程序命名为ReverseString.java,并保存到Apache的文 

档根目录/usr/local/apache/htd0cs/下。然后执行下面的命令对其进行编 

将PHP变量Snumbera和¥numberb的类型设置为double型, 

此后当这两个变量作为参数交给Java虚拟机处理时,将被作 

为double类型来对待。 

虽然上面给出的例子都只使用简单数据类型在PHP和Java 

之间进行通信,但事实上还可以使用数组在PHP和Java间进行 

数据交换。遗憾的是,目前PHP所提供的Java扩展还不具备 

译,得到Java虚拟机所需要的类文件Reversestring.class: 

[root] ̄cd/usr/lacal/apache/htdacs/ 

[root ̄#javac ReverseString.java 

下面的P}Ⅱ)脚本创建了ReverseString类的一个对象,并随 

后调用了该对象的reverse0方法。由于Java虚拟机在执行 

ReverseString类的reverse 0方法时将抛出一个异常,因而此 

时调用P}Ⅱ)函数java_last—exception

get 0将得到与之对应的异 

在PHP和Java间直接以对象为单位进行数据交换的能力。 

常信息,该异常信息被保存在PHP变量¥e中,PHP脚本通过检 

维普资讯

查Se是否为空来判断Java虚拟机中是否有异常 

产生。 异常处理完毕后,P H P脚本调用 

java last except ion clear 0函数来清除所有的 

异常信息。 

<?php 

Create an instance of Java class ReverseString 

¥obj=new Java( ReverseString ): 

, 

Create an instace of Java class StirngWriter. 

¥sTiter=new Java( jay&io.StringWriter ): 

¥obj一>setWriter(¥writer), 

@¥obj)reverse( PHP and Java Programming ): 

//Get the last exception 

Se=java last exception get 0: 

if(¥e) 

。。/Give error infomation. 

上一讲我们主要介绍了图像的格式,其中重点说明了BMP文件的存储 

print Se一>toString0. 

el se 

格式,同时对JEPG和GIF等常用格式作了简单的介绍。本节主要讲述如 

何操作BMP文件,如对其读、写和显示等。 

print S iter>toString0: 

Sw’1ter>flush0 

SWriteI->close0: 

在实现数字图象处理的过程中,主要是通过对图像中的每一个像素点 

运用各种图像处理算法来达到预期的效果,所以进行图像处理的第一步, 

也是我们最关心的问题,是如何得到图像中每一个像素点的亮度值;为 

了观察和验证处理的图像效果,另一个需要解决的问题是如何将处理前后 

Llear exception. 

的图像正确的显示出来。我们这章内容就是解决这些问题。随着科技的 

java last exception clear0. 

?> 

发展,图像处理技术已经渗透到人类生活的各个领域并得到越来越多的应 

用,但是突出的一个矛盾是图像的格式也是越来越多,目前图像处理所 

涉及的主要的图像格式就有很多种,如T IF、JEMP、BMP等等,一般情 

将上述脚本命名为except ion.php,并保存 

到Apache的文档根目录/usr/1ocal/apache/ 

ht doc s/下,如果一切正常,在浏览器中查看 

该脚本时将显示如图3所示的页面。 

况下,为了处理简单方便,进行数字图像处理所采用的都是BMP格式的 

图像文件(有时也称为DIB格式的图像文件),并且这种格式的文件是 

没有压缩的。我们通过操作这种格式的文件,可以获取正确显示图像所 

需的调色板信息,图像的尺寸信息,图像中各个像素点的亮度信息等 

£He—Edit V—iew—Go—Bookmarks Iools W__indo,,v Help 

0 口匿 。 

等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相 

应的处理。如果特殊情况下需要处理其它某种格式的图像,如GIF、JEMP 

la a iang Exception:Some error happened 

等格式的图象文件,可以首先将该格式转换为BMP格式,然后再进行相 

应的处理。这一点需要读者清楚。 

BMP格式的图像文件又町以分为许多种类,如真彩色位图、256色位 

图,采用RLE(游程编码)压缩格式的BMP位图等等。由于在实际的工程应 

 }Document Done(o s sees);蕾 - 

用和图像算法效果验证中经常要处理的是256级并且是没有压缩的B 灰度 


本文标签: 脚本 图像 面向对象 格式 信息