引言
本文說明如何使用 Java Bridge 從 PHP 訪問 Java 類。其中將討論如何調用 Java 方法和訪問字段(實例和靜態字段)。另外還將討論異常處理及 PHP 和 Java 之間的類型轉換。
ZSL、WebSphere sMash 和 Apache Lucene
有關真實示例,本文逐步說明了使用 PHP 編寫的簡單搜索引擎的創建工作,此引擎可使用 Apache Lucene 建立文件索引和進行搜索。Apache Lucene 是一個高性能的全功能文本搜索引擎庫,完全使用 Java 編寫。這是一項適合很多需要全文本搜索的應用程序使用的技術。
ZSL 在其編寫的 WebSphere sMash 應用程序中使用 Apache Lucene.ZSL? 希望改進其開發人員之間的信息共享情況。為了解決此問題,他們建立了 Mashup 來對源代碼和文檔庫(PDF、PowerPoint、Word、Excel 和很多其他格式)進行索引。此應用程序提供了從整個企業方便快捷訪問代碼片段的能力。
在 WebSphere sMash 中創建應用程序
第一步是在 Eclipse 中創建新項目:
1、選擇 File -> New -> Project……,並在對話框中展開 Zero 目錄。
2、選擇 WebSphere sMash PHP Application,並單擊 Next,如圖 1 中所示。
3、給項目命名(例如 MyJavaProject)並單擊 Finish.您的項目現在已創建。
圖 1. “創建新的 WebSphere sMash 項目”對話框
創建並調用 Java 對象
接下來,編寫創建和調用 Java 對象的 PHP 腳本:
1、右鍵單擊 public 文件夾並選擇 New -> File.
2、給文件命名(例如 Java.php)並單擊 Finish.
3、在文件中添加以下代碼:
<?php
$file = new Java("java.io.File", __FILE__, FALSE);
var_dump($file);
var_dump($file->isDirectory());
?>
4、在 Eclipse 中右鍵單擊項目名,並選擇 Run As -> WebSphere sMash Application,以運行示例代碼。
5、會在 localhost 的端口 8080 啟動 Web 服務器。
6、現在可以打開浏覽器,指向 http://localhost:8080/Java.php,您將看到以下輸出,如圖 2 中所示。
圖 2. 調用 Java 對象的 Web 浏覽器輸出
此示例代碼顯示了使用內置 Java 類的 PHP 腳本。此 Java 類創建 Java 類的實例,並調用最佳匹配構造函數(從腳本傳遞任何參數)。在此示例中,根目錄為 "/" 和 FALSE.腳本將其存儲在名為 $file 的 PHP 變量中。腳本然後像處理普通 PHP 對象一樣對該對象調用方法,在此示例中我們將其命名為 isDirectory 方法。
此功能非常強大,允許 PHP 腳本訪問任何 Java 類。請注意,該 Java 類必須位於應用程序類路徑上,java.io.File 是核心 Java 類庫的一部分,因此始終可用。
使用 Java 集合類
Java 提供了豐富的集合類,包括映射、集、列表和隊列。此示例代碼顯示了 PHP 腳本可以如何利用這些類。正如前面所述,創建一個新 PHP 腳本(例如,MoreJava.php)並添加以下代碼:
<?php
$map = new Java("java.util.HashMap");
$map->put("title", "Java Bridge!");
$array = array(1, 2, 3, 4, 5);
$map->put("stuff", $array);
var_dump($map->get("stuff"));
echo $map->get("title");
?>
現在可以打開浏覽器,指向 http://localhost:8080/MoreJava.php,您將看到以下輸出,如圖 3 中所示。
圖 3. 使用 Java 集合類的 Web 浏覽器輸出
PHP 腳本:
● 創建 Java HashMap 類的實例。
● 將包含 Java Bridge! 的字符串存儲在映射中。
● 突出 Java 和 PHP 類型之間的互操作性。
● 創建 PHP 數組,並將其存儲在 Java 映射中,如下面的代碼所示。
$array = array(1, 2, 3, 4, 5);
$map->put("stuff", $array);
對映射進行 put 調用時,PHP 數組會轉換為最接近的 Java 類型,即 Java Map.與此類似,當 get 調用從 $map 讀回值時,會將其轉換回常規 PHP 數組。這可以在不進行任何復制的情況下進行,因為 PHP 數組具有兩個個性類型,即 PHP 數組和 Java 映射。
遍歷 Java 集合
嘗試使用以下代碼替換 MoreJava.php 腳本:
<?php
$list = new Java("java.util.ArrayList");
var_dump($list);
$date = new Java("java.util.Date", 70, 9, 4);
echo "<br/>";
$list->add("Java Bridge!");
$list->add($date);
$list->add(array(1, 2, 3, 4, 5));
$iterator = $list->iterator();
while ($iterator->hasNext() == TRUE) {
var_dump($iterator->next()); echo "<br/>";
}
?>
現在可以打開浏覽器,指向 http://localhost:8080/MoreJava.php,您將看到以下輸出,如圖 4 中所示。
圖 4. 遍歷 Java 集合的 Web 浏覽器輸出
此示例顯示了使用 Java ArrayList 類的 PHP.而且,還從 ArrayList 獲得了迭代器,並從頭到尾對集合進行了掃描。迭代器的內容按順序寫入,首先是字符串 Java Bridge!,然後是 Java Date 對象,最後是包含五個數字的 PHP 數組。
訪問靜態方法和字段
靜態方法和字段使用 JavaClass 進行訪問。對 Java 有一點差異,其中靜態方法和字段直接使用類名稱進行直接訪問。以下代碼說明了如何對 java.lang.System 調用 currentTimeMillis:
<?php
$system = new JavaClass("java.lang.System");
var_dump($system);
echo("</br>Current time: ".
$system->currentTimeMillis()."</br>");
?>
圖 5 顯示了在浏覽器中運行此腳本的輸出。
圖 5. 訪問靜態方法的 Web 浏覽器輸出
訪問靜態字段與此類似。下面的代碼顯示 java.lang.Integer 類中的 MIN_VALUE 靜態字段:
<?php
$integerClass = new JavaClass("java.lang.Integer");
var_dump($integerClass->MIN_VALUE);
?>
圖 6 顯示了在浏覽器中運行此腳本的輸出。
圖 6. 訪問靜態字段的 Web 浏覽器輸出
在 PHP 中捕獲 Java 異常
Java Bridge 將 Java 異常轉換為 JavaException 的實例。這是在 PHP 腳本中捕獲的通用 PHP 異常。以下代碼片段顯示了對 java.lang.System 上的 getProperty 的無效調用:
<?php
try {
$system = new JavaClass("java.lang.System");
$system->getProperty(FALSE);
} catch (JavaException $exception) {
echo "Cause: ".$exception->getCause();
}
?>
圖 7 顯示了在浏覽器中運行此腳本的輸出。
圖 7. 捕獲 Java 異常的 Web 浏覽器輸出
請注意,在 WebSphere sMash 1.0 中,getCause 方法將返回基礎 Java 異常的類名稱,而不是 所導致的異常本身。在最新的 Project Zero 構建版本中,這個奇怪的行為已經得到修復,將返回實際的 Java 異常。
從 Java 到 PHP 的類型轉換
表 1 顯示了 Java 類型如何轉換為 PHP 類型。常規的做法是轉換為盡可能減少潛在損失的類型(例如,將 int 轉換為 byte)。另請注意,轉換同樣適用於受限和不受限 Java 類型,例如 Integer 和 int.
表 1. 從 Java 到 PHP 的類型轉換
Java 類型 PHP 類型 注釋 null null Integer/int int Double/double double Boolean/boolean bool Byte/byte int Character/char int Short/short int Long/long int Float/float double byte[] string String string 此 PHP 字符串使用運行時編碼進行編碼。 Map array 各個元素的類型按照此表進行轉換,包括嵌套映射。 Object[] array 請參見數組轉換。 Anything Else! n/a 這使用 Java Bridge 包裝,成為通用 PHP 對象。
Java Bridge 局限性
Java Bridge 旨在作為讓 PHP 腳本使用 Java 類的簡單方法使用。考慮這一點,有幾個其中未包含的更為高級的功能。其中最重要的是可靠地調用重載方法。
Java Bridge 完全 根據提供的參數數量選擇方法或構造函數。如果存在多個可能性,則 Java Bridge 將選擇第一個方法或構造函數並試用。這極為簡單,使用錯誤的參數類型調用構造函數或方法時,會引發異常。
使用簽名選擇重載
選擇合適的重載的問題已經在最新的 Project Zero 構建版本(在 WebSphere sMash 1.0 中不 可用)中通過添加新的 JavaSignature 類得到了解決。JavaSignature 允許腳本通過定義參數類型查找以下內容來明確指定調用哪個構造函數或方法:
<?php
$signature = new JavaSignature(JAVA_STRING);
$string = new Java("java.lang.String",
$signature, "Hello World!");
var_dump($string->toLowerCase());
var_dump($string->split(" "));
var_dump($string->toUpperCase());
?>
JavaSignature 的參數來自以下 PHP 常量:
● JAVA_BOOLEAN
● JAVA_BYTE
● JAVA_CHAR
● JAVA_SHORT
● JAVA_INT
● JAVA_LONG
● JAVA_FLOAT
● JAVA_DOUBLE
● JAVA_STRING
● JAVA_OBJECT
在前面的示例中,示例選擇了 java.lang.String 上的構造函數,此構造函數接受單個 Java String 作為其參數 (JAVA_STRING)。多個參數使用逗號分隔,例如,newJavaSignature(JAVA_STRING, JAVA_INT)。可以使用 JAVA_ARRAY 修飾符指定 Java 類型的數組。例如,以下代碼將選擇字符串數組: newJavaSignature(JAVA_STRING | JAVA_ARRAY)。
以下代碼片段顯示了一個 JavaSignature,它選擇 java.lang.String 上的 valueOf 方法的重載。請注意簽名作為第一個參數如何傳遞到方法調用。Java Bridge 知道對其進行檢查來獲取簽名。
<?php
$class = new JavaClass("java.lang.String");
$signature = new JavaSignature(JAVA_INT);
var_dump($class->valueOf($signature, 1234567890));
?>
方法名稱區分大小寫
PHP 中的方法不區分大小寫,而 Java 區分大小寫。Java Bridge 區分大小寫,因此 PHP 方法名稱必須與 Java 方法名稱完全匹配。
靜態方法和字段
Java 開發人員習慣使用類名稱調用靜態方法和字段(例如,Integer.MAX_VALUE)。這在 PHP 中尚不可能,因此必須使用 JavaClass.腳本創建 JavaClass 的實例,並使用此實例調用靜態方法和訪問靜態字段。這種做法並不常見,因為需要開發人員創建僅用於訪問非實例(靜態)方法和字段的對象的實例。
遍歷集合
前面的示例代碼說明了如何遍歷 Java 集合。這相當冗長,比 PHP foreach 語句的開銷少。目前,Java Bridge 並未將 Java 迭代器和 PHP foreach 語句集成。以下代碼說明了如何在 PHP 中使用 Java 迭代器:
$iterator = $list->iterator();
while ($iterator->hasNext() == TRUE) {
var_dump($iterator->next()); echo "<br/>";
}
將所有這些應用到實際示例中
下一部分將前面部分所討論的內容集中到 Java Bridge 的真實使用示例中。此示例創建了使用 PHP 編寫的簡單搜索引擎,可以使用 Apache Lucene 建立文件索引和進行搜索。Apache Lucene 是一個高性能的全功能文本搜索引擎庫,完全使用 Java 編寫。它適合於需要全文本搜索(特別是跨平台)的幾乎任何應用程序。有關更多信息,請參見 Apache Lucene 站點。
創建索引
第一步是獲得 Lucene.我們要使用最新版本的 Lucene(盡管其工作並不完美),因為我們希望與 Lucene 的 PHP 實現(基於 Lucene 2.2.0)進行比較。
1、下載 lucene-2.2.0.tar.gz .例如,從以下鏡像位置下載: http://mirror.cc.columbia.edu/pub/software/apache/lucene/java/archive/.
2、解壓縮文件(或運行 tar -xvzf lucene-2.2.0.tar.gz)。
3、找到兩個 JAR 文件,lucene-core-2.2.0.jar 和 lucene-demos-2.2.0.jar.
下一步編寫創建 Lucene 搜索引擎的 PHP 腳本:
1、在 Java 透視圖中,通過選擇 File -> New -> Other 來創建新應用程序。選擇 WebSphere Smash PHP Application 並將其命名為 Lucene.
2、右鍵單擊 public 文件夾並選擇 New -> File.
3、將文件命名為 index.php 並單擊 Finish.
4、將前面的兩個 Lucene JAR 文件復制到 Lucene/lib 目錄中。
5、要確保 WebSphere sMash 使用 Lucene Java 庫,請右鍵單擊項目名稱 Lucene 並選擇 WebSphere sMash Tools -> Resolve.
在文件中添加以下代碼:
<html>
<head>
<title>Search Index</title>
</head>
<body>
<form name="input" action="/index.php" method="POST">
<label for="directory">Directory:</label>
<input type="text" name="directory">
<label for="extension">File Extension:</label>
<input type="text" name="extension">
<input type="submit" name="action" value="Index!">
</form>
</body>
</html>
7、右鍵單擊項目名稱 Lucene 並選擇 WebSphere sMash Application -> Run,以運行應用程序。將 Web 浏覽器指向本地服務器,如 http://localhost:8080/index.php.其外觀與圖 8 中所示類似。
圖 8. “選擇目錄和文件擴展名”頁
8、不要嘗試建立任何內容的索引,因為還需要添加其他代碼。最後,提交表單時,PHP 腳本將創建 Lucene 搜索索引,並使用目錄中具有匹配擴展名的所有文件對其進行填充。也會向下遞歸到開始目錄,並在此過程中添加相應的文件。
9、接下來,將以下 PHP 代碼添加到 index.php 中:
<?php
$directory = dirname(__FILE__)."/../index";
if (file_exists($directory) === FALSE) {
mkdir($directory);
}
define("INDEX_DIRECTORY", $directory);
try {
$extension = zget('/request/params/extension');
if (strlen($extension) > 0) {
$directory = zget('/request/params/directory');
if (strlen($directory) > 0) {
index_directory($directory, $extension);
}
}
} catch (JavaException $exception) {
echo "Index creation failed [".
$exception->getMessage()."]</br>";
}
?>
10、尚不要運行,因為還沒有完成!代碼從全局上下文獲取表單變量,並檢查是否已經填充。如果已經跳出,則會調用 index_directory 函數。此函數將在後面進行說明,負責將任何匹配的文件添加到 Lucene 搜索引擎。
11、接下來,將以下 PHP 代碼添加到 index.php 中:
/**
* This creates an index from scratch and adds all the documents
* by recursing from the directory passed in. It also checks
* each candidate file to see if it matches the file extension.
*/
function index_directory($path, $extension) {
echo "Indexing! [".$path.",".$extension."]</br>";
// Uses the SimpleAnalyzer because we will do a performance comparison
with the PHP
// implementation of Lucene in the Zend Framework and it is the closest match
$analyser = new Java("org.apache.lucene.analysis.SimpleAnalyzer");
$policy = new Java("org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy");
$file = new Java("java.io.File", INDEX_DIRECTORY, FALSE);
$file_directory = new JavaClass("org.apache.lucene.store.FSDirectory");
$directory = $file_directory->getDirectory($file);
$writer = new Java("org.apache.lucene.index.IndexWriter",
$directory, TRUE, $analyser, TRUE, $policy);
$writer->setUseCompoundFile(FALSE);
// Insert some calls to microtime() for comparison
$start_time = get_microtime();
recursive_index_directory($writer, $path, $extension);
$count = $writer->docCount();
// Lucene only matches the first 10,000 tokens by default
$writer->setMaxFieldLength(1000000);
$end_index_time = get_microtime();
$writer->optimize();
$end_time = get_microtime();
$writer->close();
echo "Finished indexing [".$count." documents]</br>";
$t1 = $end_index_time - $start_time;
$t2 = $end_time - $end_index_time;
echo "Time to index = $t1 </br>";
echo "Time to optimize = $t2 </br>";
}
本文將不會介紹 Java Lucene API 的詳細信息。簡單來說,此代碼用於創建 IndexWriter 對象。這是鍵索引對象,當腳本在目錄中進行遞歸時,文件添加到其中。請注意,可以根據很多不同的源(例如,RAM 磁盤)進行反向索引。在此示例中,從常規文件系統讀取文件,因此將使用 FSDirectory 類。
一旦設置 IndexWriter,腳本將調用 recursive_index_directory 來實際進行索引工作。此函數傳遞 IndexWriter,即起始目錄以及候選文件要匹配的文件擴展名。
以下部分的代碼是索引腳本的最後一部分。其中的大部分代碼都是通用 PHP 腳本,枚舉了目錄中的所有文件,並按順序逐一處理。確定了要索引的文件後,將會創建 FileDocument.需要使用文件的完全限定路徑建立此對象,然後將其添加到 IndexWriter.
/**
* Processes a file by adding it to the indexer.
*/
function index_file($writer, $path) {
echo "Indexing file [".$path."]</br>";
try {
// A few of the files we indexed in the examples have non
// UTF-8 characters so we just skip indexing those files!
$file = new Java("java.io.File", $path, FALSE);
$file_document = new JavaClass("org.apache.lucene.demo.FileDocument");
$document = $file_document->Document($file);
$writer->addDocument($document);
} catch (JavaException $exception) {
echo "Invalid characters in file!\n";
}
}
function get_microtime(){
list($part_one,$part_two) = explode(' ',microtime());
return ((float) $part_one + (float) $part_two);
}
/**
* Indexes all matching files (by extension) in the directory tree.
*/
function recursive_index_directory($writer, $path, $extension) {
echo "Indexing directory [".$path."]</br>";
// Remove any trailing slash first
if (substr($path, -1) == '/') {
$path = substr($path, 0, -1);
}
// Make sure the directory is valid
if (is_dir($path) == TRUE) {
if (is_readable($path) == TRUE) {
$handle = opendir($path);
// Scan through the directory contents
$extension_length = strlen($extension);
while (FALSE !== ($item = readdir($handle))) {
if ($item != '.') {
if ($item != '..') {
$index_path = ($path.'/'.$item);
if (is_dir($index_path) == TRUE) {
recursive_index_directory(
$writer, $index_path, $extension);
} else {
$position = strpos(strtolower($index_path), $extension);
// Very rough and ready way to check for trailing extension!
if ($position == (strlen($index_path)-$extension_length)) {
index_file($writer, $index_path, $extension);
}
}
}
}
}
closedir($handle);
}
}
return TRUE;
}
12、將 Web 浏覽器指向腳本,並填寫表單變量,如圖 9 中所示。
圖 9. 建立目錄索引時的 Web 浏覽器輸出
13、單擊 Index!,腳本將對所選文件進行索引。在上面的示例中,腳本指向一段 C 源代碼,對五個源文件進行了索引。如果刷新 Eclipse 項目,會發現一個名為 Index 的新目錄。此目錄包含 Lucene 搜索引擎產生的搜索索引文件,如圖 10 中所示。
圖 10. WebSphere sMash 應用程序的目錄結構
將搜索查詢添加到應用程序
最後一步是寫入一個允許用戶針對索引運行搜索的表單。
1、右鍵單擊 public 文件夾並選擇 New -> File.
2、將文件命名為 search.php 並單擊 Finish.
3、在文件中添加以下代碼:
<html>
<head>
<title>Query</title>
</head>
<body>
<form name="input" action="/search.php" method="POST">
<label for="query">Search Query:</label>
<input type="text" name="query">
<input type="submit" name="action" value="Search!">
</form>
</body>
</html>
4、運行此腳本,Web 浏覽器中的情況將與圖 11 所示類似。
圖 11. 搜索查詢頁
5、接下來,將以下 PHP 代碼添加到 search.php 中:
<?php
/**
* This runs a search through an index already created.
*/
function search_index($path, $query) {
echo "Searching for [".$query."]</br>";
$file = new Java("java.io.File", $path, FALSE);
$file_directory = new JavaClass("org.apache.lucene.store.FSDirectory");
$directory = $file_directory->getDirectory($file);
$searcher = new Java("org.apache.lucene.search.IndexSearcher", $directory);
$analyser = new Java("org.apache.lucene.analysis.SimpleAnalyzer");
$parser = new Java("org.apache.lucene.queryParser.QueryParser",
"contents", $analyser);
$parsed_query = $parser->parse($query);
$hits = $searcher->search($parsed_query);
$count = $hits->length();
for ($index = 0; $index < $count; $index++) {
$document = $hits->doc($index);
echo $index.") ".$document->get("path")."</br>";
}
echo "</br>Finished searching [".$count." hits]</br>";
}
try {
$directory = dirname(__FILE__)."/../index";
define("INDEX_DIRECTORY", $directory);
$query = zget('/request/params/query');
if (strlen($query) > 0) {
search_index($directory, $query);
}
} catch (JavaException $exception) {
echo "Index search failed [".$exception->getMessage()."]</br>";
}
?>
和前面一樣,此腳本使用了多個 Lucene 類。此腳本的要點在於,沒有使用 index.php 之類的 IndexWriter 類,而使用了 IndexSearcher.其配置的目錄與前面創建索引文件的目錄相同。用戶在該表單中輸入的字符串將隨後用於創建查詢對象。Lucene QueryParser 提供了解析查詢字符串的簡單方法。
有了經過解析的查詢後,腳本就准備好在 IndexSearcher 上運行搜索了。這將返回腳本所枚舉的命中列表,顯示每個項目的路徑。
6、將 Web 浏覽器指向 search.php 並輸入一些搜索術語,如圖 12 中所示。
圖 12. 運行搜索查詢的 Web 浏覽器輸出
在此示例中,找到匹配關鍵字“TSRM”和“int”的五個匹配項。Lucene 提供了強大的查詢語法,能夠支持各種搜索術語。關於可能的搜索查詢的更多信息,請訪問 Apache Lucene 站點。
性能比較
如果仔細分析一下我們添加到 index.php 的源代碼,則您會看到對 microtime 的一些調用和一些注釋,其中表明我們希望檢查性能。
我們執行的檢查是簡單計時檢查。我們非常有興趣比較一下使用三個不同的軟件創建索引的時間:
● 通過 WebSphere sMash Java Bridge 調用的 Lucene 的 Java 實現。
● 從 Java 應用程序調用的 Java Lucene.
● Zend Framework 中的 Lucene 的 PHP 實現。
為了進行公平的比較,我們使用了 Lucene Version 2.2.0,即 Zend 實現所基於的版本。我們還使用了 Lucene SimpleAnalyser.有關 Zend 實現的詳細討論超出了本文的范圍。不過,它是 Lucene 代碼的可靠端口,會生成與 Java 版本生成的格式完全相同的格式。
性能比較所執行的是對 PHP 5.3 源樹下的所有 PHP 測試腳本(*.phpt 文件)進行索引。創建和優化索引所花費的時間如表 2 中所示。
表 2. Lucene 搜索的性能比較
技術 時間(秒) WebSpere sMash Java Bridge 9 Java Lucene 8 Zend Search Lucene 200
這可以讓我們簡要了解使用這些現成技術的時間比較情況。所有這些計時都打開了 Java JIT,這在 Lucene 之類的應用程序中的執行時間方面會產生巨大的差異。
這些原因都不能作為不使用 Zend 實現的原因。事實上,如果不使用 Java,而您主要的開發語言是 PHP,則使用同樣是 PHP 編寫的搜索引擎會帶來很多優勢。方便地理解和修改代碼之類的考慮事項可能會比唯一的性能優勢更為重要。
更有意思的是使用 PHP 及 Java Bridge 與使用 Java 應用程序間的比較。二者時間接近的事實表明,我們不會在 Java Bridge 中或在 Java VM 上運行 PHP 浪費太多時間。
當然,還有其他通過 PHP 使用 Java Bridge 的實現。例如,Zend Platform 中有一個商業實現,而 sourceforge.net 提供了一個開源實現。雖然我們沒有使用這些實現,但它們的存在為將 Java 用於最適用的場合(算法性能)並同時充分利用 PHP 的易用性提供了支持。
如果您重復進行這些實驗,可能會發現創建索引的過程中存在著細微的差別。Zend 實現的較為有用的功能之一是,能夠創建與 Java 實現格式完全相同的索引,而這就意味著可以使用標准 Java 工具對其進行檢查(例如,可以從 Luke 站點下載的 Luke)。這些差異都相對比較容易解釋,不會影響耗時比較的結果。例如,PHP 和 Java 分析工具之間就存在細微差別。
結束語
在本文中,您進行了以下工作:
● 使用 PHP 和 WebSphere sMash 創建應用程序。
● 使用 Java Bridge 創建和調用 Java 對象。
● 探索從 PHP 腳本使用 Java 集合的方法。
● 了解 Java Bridge 如何進行類型強制轉換和異常處理。
● 開發基於 Java Lucene 庫的搜索引擎。
● 了解 Java Lucene 庫的性能。
完成本文的學習後,您可以將 Java 庫和 PHP 腳本用於更廣泛的用途。為什麼不在 WebSphere sMash 中將更多的 Java 庫與 PHP 結合使用?通過Project Zero 論壇讓我們了解您的情況。如果您希望了解關於 Zero Global Context 和其他相關主題的更多信息,請參見下面參考資料部分列出的 WebSphere sMash Developer's Guide.