在上一篇,我們介紹了PEAR的概念,編碼規則,簡單使用方法,你可能對它有了一個初步的了解。這次,我們將介紹現有的PEAR庫中的一些模塊的功能和它的使用。
一、命名約定
在了解現有的pear模塊之前,我們先了解一下PEAR的組織分類方式和命名的約定。PEAR中的模塊的組織方式和CPAN類似,每個模塊的相關文件是放在自己的分類目錄下面,有的則是直接放在pear的根目錄下面(單個文件)。由於PEAR沒有象java那樣的名字空間,所以你的類名應該能夠體現你的模塊名或者父類名之間的關系,守一定的約定,比如,你的模塊名:"Mp3/common",那麼,你的php文件應該位於:Mp3/common.php,你這個模塊的類名應該是:Mp3_common。一般來說,如果你的模塊是根據現有的某個模塊改進而來的,那麼建議把你的和現有的那個模塊放在同一個目錄下面。如果你設計的是一個新的類和模塊,你可以自己建立一個新的目錄,或者是按照相似的用途放在同樣的目錄下面。比如,你新編寫了一個模塊,用於處理日志的,建議你把它放在Log/下面,表示是用於Log處理的應用模塊;如果新的模塊是用於處理mp3的,那麼你可以建立一個新的目錄mp3,放在mp3目錄下面。
二、現有的PEAR模塊
由於Pear的大多數模塊仍處於開發當中,因此,這裡列舉的是隨著php4.05一起發布的pear中的模塊,需要注意的是,一些抽象類或者是基類(如Mail.php,Log.php,Cache.php)沒有列舉出來,我們只是關注具有具體功能的模塊。下面是這些模塊的一個列表:
Benchmark/Timer 測試你的一段php代碼的運行效率
Benchmark/Benchmark_Iterate 測試你某個函數循環執行時的性能
Cache/Output 可以將你的php腳本的輸出進行緩存,可以使用多種方式緩存(存在文件,數據庫或者是共享內存中),如果使用這個模塊有可能增大服務器的負載,所以,如果你想通過動態腳本的緩存來提供效率,不妨使用Zend optimize,這個模塊未必適合
Cache/Graphics 可以將你需要動態輸出的圖片進行緩存
Console/Getopt 命令行參數的處理模塊
CMD 一個虛擬的shell,可以用它來運行一些系統的命令
Crypt/CBC 實現Perl Crypt::CBC 模塊的仿真
Crypt/HCEMD5 實現Perl Crypt::HCE_MD5 模塊的功能
Date/Calc 實現日期的相關操作
Date/Human Human歷法的轉換
DB 提供統一的、抽象的數據庫操作層,後端支持多種數據庫
File/Find 文件查找
File/Passwd 操縱password類的文件,如password,httppass,cvspassword
File/SearchReplace 在文件中查找替換字符串
HTML/Form 可以在html中快速地創建form
HTML/IT 實現模板定制,動態生成頁面的功能,類似phplib中的模板功能,但是要簡單易用
HTML/ITX 實現對IT的擴展功能,可以更加靈活地定制你的模板,實現更復雜的操作
HTML/Processor XML_Parser的擴展,使之可以應用於html文件的操作
HTTP/Compress 用於Php 輸出緩沖機制的一個包裝類,同時可以對緩沖的內容進行壓縮存儲
Image/Remote 無需把整個圖片都下載到本地就可以獲取遠端系統的圖片的信息,
Log/composite Horde對log抽象類做的一個擴展,可以使多個日志處理對象能夠獲得同一個日志事件。注意,Log目錄下面的模塊都是Horde項目的一部分,大部分都是抽象的超類
Log/file 將日志信息寫入文件
Log/mcal 將信息發送到本地或遠端的日程管理軟件-mcal的數據庫中
Log/observer Horder中Observer的一個超類
Log/sql 將日志信息發送到sql數據庫中
Log/syslog 將信息發送到syslog中
Mail/RFC822 檢查一個email地址是否是合法的rf822 email地址
Mail/sendmail 使用sendmail來發送信件
Mail/smtp 使用smtp服務器來發送信件
Math/Fraction 處理分形的數學計算
Math/Util 計算最大公約數
NET/Curl 對php的Curl擴展所作的面向對象的包裝
NET/Dig 操縱dig,進行dns相關的查詢操作
NET/SMTP 使用NET/Socket實現SMTP協議
NET/Socket 通用的Socket類,實現了常用的socket操作的包裝
Numbers/Roman 阿拉伯數字和羅馬數字的相互轉換
Payment/Verisign 實現和Verisign支付網關的交互
Pear 提供Pear模塊的2個基本類,PEAR 和PEARError類
PEAR/Installer pear的安裝類,提供Perl中的CPAN模塊類似的功能
PHPDoc 從php代碼中自動生成API文檔
Schedule/at 和Unix 上的AT守護進程進行交互
XML/Parser 基於php的xml擴展所作的xml的解析器
XML/Render 將xml文檔生成其它的格式(html,pdf),這只是一個抽象類,在最新的pear cvs代碼中已經有了html的實現
XML/RPC 用php實現xml-rpc的一個抽象類,在最新的pear cvs代碼中已經有了xml/RPC/Server的實現
三、主要模塊使用簡介
現在我們將簡單地介紹一些比較常用的,而且功能已經比較完善和穩定,可以用於“實戰“模塊,其中對於幾個功能很強大的模塊Db,phpdoc,XML_Parser,IT,ITX將在以後的文章中單獨介紹。
1.PEAR/Installer
這個模塊屬於pear本身的核心模塊,它完成pear其它模塊的安裝和維護工作,類似perl中的cpan模塊的功能,不過目前只有install功能,其它諸如查詢,檢查依賴性等等都沒有完成,pear本身也沒有類似 cpan 那樣的開放的站點,不過隨著參與pear的開發人員的不斷增加,一切都會有的。
使用語法:PEAR_Installer::installer($file)
$file是需要安裝的模塊文件,可以是本地文件,也可以是遠程的文件,如http://或者是ftp,installer會自動下載到本地。文件一般使用gzip打包,其中要包括一個package.xml文件,用於描述你的這個模塊的相關信息,如包含的文件,相互依賴性等,此外當然要包括你的模塊的php文件。pacakage.xml的DTD文件在pear目錄下面,名字是package.dtd.
<?php
require_once "PEAR/Installer.php";
$installer = new PEAR_Installer;
//安裝指定的模塊
$result = $installer->install($package_file);
if ( PEAR::isError($result)){
echo "Install $package_file failed!";
}else {
echo "Install $package_file sucess!";
}
?>
2.CMD
雖然大多數的php應用很少調用系統命令,因為這些應用都是基於web的,從運行效率和系統的負載考慮,都要避免直接調用系統命令,不過,在有些特殊的應用或者是你願意把php作為一個shell工具的時候,調用現有的系統工具就是不可避免的了。CMD可以讓你很方便地執行一系列的系統命令。
使用語法:setOption ($option, $setting)
設置參數$options為$setting
$options是一個常量,它可以是以下值:
CMD_SHUTDOWN : 通過shutdown函數來執行命令
CMD_SHELL : 指定shell的路徑
CMD_OUTPUT : 是否屏蔽命令的標准輸出
CMD_NOHUP : 使用nohup後台執行命令
CMD_VERBOSE : 將錯誤打印到標准輸出
command($command)
添加需要執行的命令,$command可以是數組或普通的字符串
exec()
執行已經添加的命令
<?php
require_once "CMD.php";
$cmd = new CMD;
$cmd->command(tar zcvf test.tar.gz ~/test);
if ( $cmd->exec() ) {
echo "success!
";
} esle {
echo "Error:" . $cmd->lastError;
}
?>
3.Benchmark/Timer和Benchmark/Iterate
這2個模塊可以讓你測試你的代碼的運行效率如何,我認為這對於系統調試很有用:你可以嘗試不同的算法,仔細考察每種算法需要運行的時間,然後選擇最佳的方式。Benchmark/Timer測試運行中在2個不同的時間點的時間差,Benchmark/Iterate則是對Timer擴展,測試運行某段代碼(函數)n次所需要的時間。
使用語法:Benchmark/Timer
Timer::setMarker($name) 設置當前時間點為$name
Timer::start() 開始測試
Timer::stop() 停止測試
Timer::timeElapsed($start = Start, $end = Stop) 計算$start和$end 這2個時間點的時間差
Timer::getProfiling() 返回start 和 stop 之間所耗用的時間
<?php
require_once "Benchmark/Timer.php";
$timer = new Benchmark_Timer;
$timer->start();
$timer->setMarker(Marker 1);
$timer->stop();
$profiling = $timer->getProfiling();
?>
Benchmark/Iterate
Iterate::run()
循環運行指定的函數。這是一個具有可變參數的方法,第一個參數是要循環的次數,第2個參數是要執行的函數,第3個參數起則是要傳遞給測試函數的參數。
Iterate::get()
返回測試所用的時間
<?php
require_once "Benchmark/Iterate.php";
$benchmark = new Benchmark_Iterate;
function foo($string)
{
print $string."
";
}
$benchmark->run(100, foo, test);
$result = $benchmark->get();
?>
3.File/Find
&glob ($pattern, $dirpath, $pattern_type=php)
在$dirpath中搜索符合$pattern的目錄和文件,返回匹配的文件和目錄名數組
&search ($pattern, $directory, $type=php)
在$directory中搜索符合$pattern規則的文件,返回匹配的文件名數組(注意,只是文件,不包括子目錄)。$pattern是要指定的搜索條件,一般是規則表達式,$patten_type指定使用什麼模式的規則表達式,缺省是php模式,你也可以指定"perl"來使用perl模式的規則表達式
提示:search和glob不同的是,glob並不遞歸搜索子目錄,而search則遞歸搜索子目錄。
<?php
require_once "File/Find.php";
$find = new File_Find;
//搜索當前目錄
$php_files = $find->glob("*php",".");
if ( PEAR::isError( $php_files ) ){
die "錯誤:" . $php_files->getMessage() ."
" ;
}
/