Zend Framework(ZF or ZFW)是PHP的母公司Zend公司開發的一套PHP開發框架技術,它提供了一個優秀的、簡單的綜合開發環境,提供了不少可用的解決方案,能夠用來創建一個穩定的、可升級的的Web應用。javascript
所謂框架,是整個或者部分系統的可重用設計,它首先要提供一個可複用的應用參考架構,闡明整個設計、組件之間的依賴關係、責任分配和控制流程,也包含一些設計規範等等。它提供了對一些通用問題的解決方案。php
另外Zend Framework採用常見的MVC模型(在後續具體介紹),這樣能夠比較方便的達到關注點分離的目的,能夠比較方便的創建基於MVC架構的Web應用(典型的MVC Web架構還有Struct等等,它們原理都很相似)(PHP的相似框架還有不少如:yaf)css
Zend的官網: http://www.zend.com/en/html
LAMP是Linux+Apache+Mysql+Perl/PHP/Python的縮寫,它們是一組常常用來搭建動態網站或者服務器的開源軟件,自己都是各自獨立的程序,可是由於常被放在一塊兒使用,擁有了愈來愈高的兼容度,共同組成了一個強大的Web應用程序平臺,因爲都是開源軟件,除了無償使用的誘惑,還有能夠修改源碼、本身進行控制等優勢,LAMP是大多數網站開發者和不少大公司(如:Facebook和Baidu)的不二選擇。從網站的流量上來講,70%以上的訪問流量是LAMP來提供的,可見LAMP是最強大的網站解決方案.(其它相似的方案如MS的.NET框架和Oracle的J2EE框架,三者一樣強大)前端
爲何要說LAMP呢,由於這些軟件的組合強大到只要提到一個就必需要提到另外三個的地步,而在實驗室網站的建設中,咱們使用PHP,咱們採起的固然也是LAMP的框架java
說到安裝,LAMP的安裝是十分麻煩的,由於這些軟件都是相互獨立的軟件,而開源軟件的特色是安裝須要進行配置文件的修改,這些軟件又相互依賴,因此配置起來很麻煩,常常出現問題,固然要是想了解LAMP並進行後期的優化和個性化配置的話,瞭解每一個軟件的配置方法是必須的,可是若是在起步的時候碰到很是多的困難總會影響你們的積極性,而XAMPP的出現解決了這個問題。XAMPP是一個易於安裝的LAMP框架的集成發行版本,它包含了MySQL、PHP、Perl、Apache,網站在http://www.apachefriends.org/zh_cn/xampp.html,它支持Linux、Windows和Mac多種平臺,其安裝也是很是簡單的,和正常軟件同樣,只要進行下載,運行軟件便可。node
安裝完成以後,能夠啓動XAMPP Control Panel查看上述軟件的運行狀況,還能夠在瀏覽器裏面輸入http://localhost 對XAMPP的集成軟件進行管理。(通常Apache綁定到80端口,能夠修改,修改的話要使用:XX的方法進行訪問.)mysql
ZendFramework的安裝只須要到Zend Framework的官方網站http://framework.zend.com/download下載Zend Framework的程序安裝包解壓到某個指定目錄下,而後再php.ini(PHP的配置文件)中的include_path加入Zend的解壓目錄便可。jquery
另外須要注意的是,默認的Zend Framework使用MVC機制,它採用rewrite的方式進行跳轉,這就須要在apache的配置文件中(通常是httpd.conf)修改加入容許rewrite的選項,須要的步驟是:sql
1. 找到LoadModule rewrite_modulemodules/mod_rewrite.so將其前面的#去掉
2. 在項目所在的目錄下<Directory 「projectPath」>中修改AllowOverride的值爲All,Order allow,deny / Allow from all
3. 在項目所在根目錄下創建.htaccess文件,內容爲
RewriteEngine on #重寫引擎打開
RewriteRule!\.(js|ico|gif|jpg|png|css)$ index.php
#制定除js,ico,gif,jpg,png,css之外的文件全都被重置到index.php,index.php爲項目的首頁(實際上是前端轉發控制頁)
簡單的Zend Framework安裝測試方法:
建立文件test.php內容:
<?php
require_once(‘Zend/Date.php’);
$date=new Zend_Date();
echo $date
?>
若是能正常輸出則說明Zend安裝大致正常。
另外,若是想要在View文件中使用<?=someVariable?>代替<?php echo $value ?>的功能,須要在php.ini中開啓short opentag, short_open_tag = On纔可,不然<?=?>的表達式不能被正常解析。
MVC(Model-View-Controller)是一種集成了不少設計模式(Design Pattern)的一種設計模式,它強制的將程序的輸入、處理、輸出分開,它把程序分爲三個核心部件:Model,View和Controller,其中
Model:負責數據的處理,包含業務邏輯。
View:負責數據的展示,並獲取輸入。
Controller:負責從View處接收輸入,並操做Model來完成用戶需求,而後調用View返回數據給用戶。
在這裏舉兩個MVC的例子,一個是在傳統Desktop程序,另外一個以Zend Framework爲例,詳細介紹ZendFramework的MVC。
文本編輯器你們應該都用過,在這裏使用一個在《深刻淺出MFC》中侯捷先生使用的例子,其所要實現的功能沒必要贅述,有一個文本框負責展現文字,用戶能夠對文字進行修改。
其中的:
Model,負責調用操做系統底層文件操做API,完成的功能有
a) 讀取文件內容
b) 修改文件內容:包括編輯和刪除內容
c) 建立文件、刪除文件、
View,負責展現當前文件的內容給用戶,而且負責提供UI界面,用以操做文本,完成的功能有:
a) 展現文本當前內容
b) 獲取用戶可能的輸入:文本選擇,文本複製,文本粘貼,文本編輯,文件的打開,刪除和新建等等。
Controller,負責響應從View層傳遞來的用戶請求,調用相應的Model操做,來執行用戶的需求,完成的功能有:
a) 響應View請求,將其轉換成對應的Model方法調用
b) 完成操做後,將返回結果返回給指定View,向用戶展現結果
(注:在文本編輯器的功能中,有這樣一種狀況,有多個文本窗口,展現文件內容,當有多個窗口同時對一個文件進行操做,這樣,就有了共同資源的修改問題,而在一個文本窗口修改了文本以後,其它的文本編輯器也應該顯示修改過的值,這就須要每一個文本窗口對文件狀態有實時的瞭解,該如何實現?使用觀察者模式.)
在這裏,咱們將簡單介紹Zend Framework的MVC組件,並大體給出一個Zend Framework程序的簡單實現。ZendFrameworkd的MVC框架與傳統的MVC程序框架思想相似,可是因爲應用於互聯網環境中,又有了少量不一樣。
因爲使用MVC框架,咱們須要對項目的目錄結構給出規範,典型的目錄結構以下
app/
----controllers/
----models/
----views/
----------scripts/
其中app是根目錄下的子目錄,保存MVC代碼,controllers中保存全部的controllers,models目錄保存全部models代碼,views/scripts中保存全部的view代碼。
Zend_Controller是Zend Framework中的Controller部分,其中的Zend_Controller_Front類實現了前端控制器設計模式,
前端控制器設計模式:因爲互聯網環境的全部請求都有httpurl請求從瀏覽器發送給服務器,Web應用的輸入對於服務器來講就是請求,爲了實現從請求->對應Controller的映射,咱們將全部請求都首先發送到前端控制器front controller,由前端控制器進行配置,選擇合適的Controller進行分發(dispatch)請求,再由具體Controller進行請求的響應處理。(前端控制器設計模式在Web程序中很常見,Structs也採用這種模式)
通常的前端控制器都在入口文件index.php中定義(根目錄下),聲明代碼爲:
// 初始化frontcontroller實例
$front=Zend_Controller_Front::getInstance();
// 開啓分發過程當中拋出異常的能力,默認異常引發以後會被放置在想要對象中
$front->throwExceptions(true);
$front->setDefaultControllerName('home');
// 設置controllers目錄
$front->setControllerDirectory($dir.'\app\controllers');
在全部的配置都已完畢之時,前端控制器須要負責整個程序(像是Win32程序中的主程序)的請求轉發,(相似處理消息循環),並處理分發請求:如
try {
// 開始運行
$front->dispatch();
} catch (Exception $e) {
// 處理異常
echo $e;//include_once'exception.php';
}
FrontController的dispatch方法能夠實現Controller的路由、分發、響應等工做,分發過程由三個不一樣的事件組成:
² 路由(Routing),使用路由器router,只執行一次,在調用dispatch()方法時利用請求對象中的值進行。
² 分發(Dispatching),使用分發器dispatcher,發生在循環中
² 響應(Response),完成處理後前端控制器返回響應對象
Zend_Controller:每個具體的Controller都應該是繼承於類Zend_Controller_Action,是一個動做控制器類,此類有最基本的類Controller方法,用來處理相關的View和Model之間的操做,每一個具體的Controller都應該繼承這個類。
動做控制器:每一個Controller中的publicfunction xxxAction()方法都是一個控制器動做,其中定義了Controller面對不一樣的請求時應該進行的動做。好比在請求http://localhost/home/index這個url的時候,請求就會轉發到home Controller的indexAction動做中,indexAction會定義對這個請求的處理方法。
l 操做request\response對象、獲取參數:
在動做控制器函數(xxxAction)中,能夠經過API訪問一些經常使用的數據,如:
² request對象:由getRequest()方式取得,返回一個Zend_Controller_Request_Abstract實例
² response對象:由getResponse()取得,返回一個Zend_Controller_Response_Abstract實例,可用此對象上的方法來修改response對象
² request參數:由post或者get傳遞過來的參數,能夠用_getParam($key)方法或者_getAllParams()獲取,也能夠由_setParam方法來設置request參數(通常用於轉發請求到其餘動做)
l 操做視圖:
² 視圖由Zend_View對象來表示,在Zend_Controll_Action中能夠經過initView()或render()方法來初始化對應的Zend_View對象,默認狀況下假定視圖存在views/scripts/子目錄中,指定view腳本時基準目錄爲views/scripts/
(通常是在Zend_Controller_Action的init方法中使用initView,在其餘xxxAction中使用render)
² render()用於解析視圖,聲明爲render(string$action=null,string $name=null,bool $noController=false),若是不傳遞參數,默認的解析腳本是在views/scripts/[controller名]/[action名].$viewSuffix的值
² 注:控制器和動做名稱中包含」_」,」.」,」-」的話,這些分隔符會被格式化成」-」
l 轉向方法:
² _forward($action…)方法,用於執行另一個動做
² _redirect($url…)方法,用於重定向到另一個地方
動做助手(Zend_Controller_Action_Helper)能夠向Zend_Controller_Action類的動做控制器加入功能(runtimeand/or on-demand functionality).
助手經紀人存在Zend_Controller_Action類中$_helper成員中,用來獲取和調用助手。是一個Zend_Controller_Action_HelperBroker類的對象,其支持addHelper方法向經紀人中加入助手(也能夠用addPrefix和addPath方法加入)。至關於Action的助手管家。
內建的動做助手
l FlashMessenger:容許用戶傳遞可能須要在下個請求看到的消息,使用Zend_Session_Namespace來存儲消息(用於內部的消息傳遞)
l Redirector: 轉向器,能夠幫助程序重定向到新的URL
l ViewRenderer:視圖渲染助手,能夠幫助咱們不在controller中建立view實例,view對象自動在controller註冊,能夠根據當前模塊自動設置視圖腳本、助手、過濾器路徑,指派當前的模塊名爲助手和過濾器的類名前綴,能夠自動渲染view腳本,咱們就能夠不寫initView和render了。
使用方法,
$view=new Zend_View(array('encoding'=>'UTF-8'));
// 建立view render
$view_render=new Zend_Controller_Action_Helper_ViewRenderer($view);
// 設置view腳本的後綴,這裏使用.php
$view_render->setViewSuffix('php');
// 將view renderhelper加入動做助手中,這樣咱們就可藉助渲染助手自動渲染後綴爲.php的view腳本啦,渲染的尋找規則和上述默認initView的規則一致.
Zend_Controller_Action_HelperBroker::addHelper($view_render);
Zend_View的使用方法:在Controller中建立一個Zend_View實例(也能夠由View Render Helper幫忙建立,咱們就不用本身寫了)。而後將view中須要的變量賦給它就能夠了,而後使用render渲染view便可。
通常代碼爲:
<?php
$view=newZend_View()
$view->a=’’
$view->c=’’//或者用view的assign(),支持關聯數組賦值
echo$view->render(‘someView.php’)
?>
咱們採用的方式爲在view腳本中使用html與php相混合的形式,要用到的變量由controller傳遞給它,$this->view->xxx;在腳本中使用$this->xxx的方法訪問。
在Model部分通常是完成對數據的訪問,管理以及實現業務邏輯,通常model的存儲目錄在和Controllers同根目錄的models文件夾中,Model通常就是之間的PHP類就能夠了。而通常咱們在構建Web應用中數據都存在數據庫裏,在這裏就簡單討論下Zend中對數據庫的支持吧。
Zend_Db組件是Zend Framework中的數據庫支持部分,由Zend_Db_Adapter、Zend_Db_Statement、Zend_Db_Profiler、Zend_Db_Select、Zend_Db_Table、Zend_Db_Table_Row以及Zend_Db_Table_Rowset等組成
Zend_Db_Adapter是Zend Framework的數據庫抽象層API,是基於PDO的,能夠支持多種數據庫。Adapter的配置方式爲
// 鏈接mysql數據庫
$db=Zend_Db::factory('PDO_MYSQL', $config);
$config中存儲一些鏈接數據庫的配置信息,如地址,端口,用戶名,密碼,使用的數據庫名等。在鏈接以後就能夠直接使用$db->query()的方法查詢數據庫了。
Zend_Db_Adapter的支持的操做:
l query($sql,$bind=array()),查詢數據庫,$bind爲須要綁定的數字
l queryInto($text,$value,$type=null)實現對SQL的無害化處理
l insert($table,array $bind),插入數據,$table爲代表,$bind爲表的字段與插入數據直接的綁定數組。
l lastInserId($tableName=null,$primaryKey=null),返回剛剛插入數據的ID
l fetchRow($sql,$bind=array()),用於查詢SQL的返回結果,返回的結果能夠用foreach($resultas $key=>$value)的形式遍歷。
l delete($table,$where=’’)在數據庫刪除表$table記錄
l update($table,array $bind,$where=’’)用於在表$table上根據$where的限制條件改變$bind數組相關的鍵值內容。
由上述的Zend_Db_Adapter就能夠大致上的完成數據庫的操做,咱們的實驗室網站也基本就用了Zend_Db_Adapter的相關內容,而其餘的Zend_Db控件則提供了各類更強大的功能,你們能夠本身發掘,這裏再也不贅述
上面說了這麼多MVC什麼的,下面經過給出在登陸過程當中的用到的ZendFramework的具體實例,說明Zend Framework的一些簡單的組件用法。
一個簡單的登陸過程咱們都再瞭解不過了,首先咱們須要給出一個輸入用戶名密碼的Form,而後用戶輸入完用戶名密碼以後,點擊submit提交,咱們的程序將用戶輸入與後臺數據庫中的數據進行比較,查看是否身份驗證經過,驗證經過則保存一份Session便於用戶訪問,不然則提示用戶用戶名密碼輸入錯誤,從新輸入。複雜的登陸控制還包括驗證碼等內容,咱們在此處不討論。
注:關於登陸有不少內容可談,好比單點登陸又是什麼?你們能夠本身查查看看
下面給出登陸控制Controller的Init方法和Login動做:相關的內容在後面補齊:
請求的URL應該相似爲:http://localhost/member/login;代表form被說起到memberController的loginAction中進行處理。
首先給出Controller的初始化函數init,通常在這初始化各類屬性
function init()
{
// 取得數據庫接口,事先存儲在對象註冊表Zend_Registry中
$this->db=Zend_Registry::get('database');
// 設置view的action和controller屬性
$this->view->action=$this->_getParam('action');
$this->view->controller=$this->_getParam('controller');
// 默認載入的js,方便在view中使用
$this->view->javascript=array('jquery.inline.js', 'paper.js');
// 取得登陸狀態,狀態存儲在Zend_Session中
$session=new Zend_Session_Namespace();
$login=$session->login;
if (isset($login)) {
// 給view中相關變量賦值
$this->view->aid=$login['AId'];
$this->view->priv=$login['Priv'];
$this->view->name=$login['Name'];
}
else {
$this->view->aid=$this->view->priv=$this->view->name=0;
}
// 默認標題
$this->view->title='Web首頁 ';
}
而後給出login動做處理器
function loginAction()
{
$url='/home/index';
//從request參數中獲取用戶輸入的用戶名和密碼
$user=$this->_getParam('User');
$pass=md5($this->_getParam('Pass'));
//啓動Session
$session=new Zend_Session_Namespace();
try{
$acc=member::login($this->db, $user, $pass); // 調用model查詢指定表中有無$user和$pass知足的條目
if (is_array($acc)) {
// $acc是數組,說明有知足條件的條目,驗證成功,接下來將獲得的信息放到$session中裏,方便其餘模塊使用
$session->login= array
('AId'=>$acc['AId'],
'Name'=>$acc['Name'],
'Priv'=>$acc['Priv'],
'User'=>$acc['User']);
}
catch(Zend_Exception $e){
}
// 使用home/index.php頁面進行渲染
$this->renderScript('home/index.php');
}
在登陸過程成功以後,咱們不可避免的須要保存用戶的Session信息,而這個Session信息在Zend Framework中由控件Zend_Session實現。(即由Zend_Session管理PHP中$_SESSION的內容)
咱們知道在PHP中要使用Session首先要開啓Session,而咱們使用Zend_Session::newZend Session_Namespace()方法則會默認開啓Zend_Session::start()方法,而設置Zend_Session::setOptions(array(‘strict’=>true)); 能夠阻止在new Zend_Session_Namespace()時調用Zend_Session::Start()方法。
(通常咱們在使用Session前都會開啓Zend_Session::start();)
因此咱們使用Zend_Session的通常使用以下兩種:
l Zend_Session::setOptions(array(‘strict’=>true));
Zend_Session::Start();
$mySpace=newZend_Session_Namespace(‘MySpace’);
l 或者須要時直接使用
$mySpace=newZend_Session_Namespace(‘MySpace’);
上例中採用第二種方式(其實上面的$mySpace其實就被保存在$_SESSION['MySpace']中)。
Register是一個對象註冊表,能夠將任何對象存儲在對象註冊表中,這樣就能夠在任何地方隨時隨地調用,能夠說就是一個全局變量管理器。
能夠用
$reg=Zend_Registry::getInstance();
$reg->set('database', $db);
來得到一個默認的Zend_Registry註冊表變量(本例中的數據庫對象),並在其上調用set($key,$value)方法設置全局變量的值,此後在任何地方能夠經過Zend_Registry::isRegistered($key)檢查是否有對象存在,能夠用Zend_Registry::get($key)得到默認的註冊表中的對象內容,還能夠經過Zend_Registry::_unsetInstance($key)來刪除對象註冊表內的內容。
Zend_Registry和Zend_Session的區別(翻譯自網上):
Zend_Registry和Zend_Session的主要區別是在它們的做用域上,Zend_Registry的做用域是對當前的請求(current request)有效,也就是Zend_Register的數據不能被不一樣頁面所共享,可是若是咱們在index.php(前端轉發控制的頁面)定義Zend_Register數據,那麼在全部的controllers/actions中均可以使用Zend_Register的,由於它們剛剛被重定向到index.php後才傳到這些具體的action中,因此這些數據是能夠用的。而通常Zend_Registry用於存儲配置,共享變量等信息。在每次請求不一樣的頁面的時候Zend_Register的數據都會被清除。
而Zend_Session使用的是PHP的Session,能夠被任何頁面共享,它是真的有Session的做用域的(即關閉瀏覽器以前、或Session過時以前都有效)
熟悉PHP的人都知道,在PHP中,如何加載Load(include)一個類是一個很麻煩的話題,由此,PHP5中提供了__autoload的機制,方便類文件的自動加載。而Zend框架中也提供了一個能夠實現對文件和類進行動態加載的功能Zend_Loader。
提供Zend_Loader的加載功能可用的方法:
l 加載文件
Zend_Loader::loadFile($filename,$dirs=null,$once=false);
$filename是要加載的文件名,$dirs爲文件所在的目錄,若是爲空的話程序會自動到PHP的include_path中找,$once指定是否爲只加載一次,爲true加載一次,不然重複加載。若是loadFile加載文件失敗,此方法會拋出Zend_Exception異常。
l 加載PHP類
Zend_Loader::loadClass($class,$dirs)還能夠支持對PHP類的加載,其中$class爲類名,$dirs爲包含類的所在路徑及文件名,另外,此方法會根據下劃線對應到目錄的文件,Zend_Controller_Action會指向Zend/Controller/Action.php文件。若是$dirs爲一個字符串或數組,則方法會順序查找相應目錄,加載第一個匹配的文件,若是沒找到的話還會在include_path中查找。
Zend_Acl組件給出了實現一個完整的訪問控制的解決方案,Zend_Acl中定義了兩個重要的概念資源和角色,而分別和其對應的兩個Zend控件是Zend_Acl_Role和Zend_Acl_Resource。
Zend_Acl_Resource:在Zend_Acl中,任何文件均可以被當作資源對待,Zend_Acl還提供了一個資源的樹結構,能夠自由添加多個Resources。Zend_Acl也支持基於Resources的create,read,update和delete權限等待。資源能夠經過實現Zend_Acl_Resource_Interface來實現,而Zend_Acl_Resource是基本的一個Resource實現,也能夠進行擴展實現資源
Zend_Acl_Role: 在Zend_Acl中,角色就是全部進行訪問的對象的統稱,Role之間能夠有繼承關係,能夠經過Zend_Acl_Role_Interface接口開發Roles,一樣Zend_Acl_Role是一個基本的Role實現,能夠用來繼承擴展
建立ACL的方法
$acl=newZend_Acl();
$acl->addRole($roles,$parentnode);//加入角色
$acl->allow($roles,$resources,$privilege,$assert);//指定用戶組$roles在$resources上的權限,$resources使用null的時候表明全部資源,$privilege能夠爲create,edit,delete等等,而$assert用於指定有特定約束的控制,如在必定時間段內不容許等等。
$acl->deny($roles,$resources,$privilege,$assert);//爲指定用戶組$roles在$resources上添加拒絕權限
定義了Acl以後,咱們就能夠用Acl的isAllowed方法來檢查某個用戶在某個資源上是否有權限瞭如
$acl->isAllowed($roles,$resources,$privilege);
訪問認證適配器,用於給出一個對用戶訪問進行認證的方法,Zend_Auth依靠特定的認證服務來進行認證(如RDBMS)
Zend_Auth提供了不少種的系統默認認證訪問支持,如今在這裏只簡單說明數據庫認證方式。
Zend_Auth_Adapter_DbTable是Zend_Auth提供的數據庫訪問方案,它的默認構造函數的參數須要有:
l $zendDb,一個Zend_Db_Adapter的適配器實例
l $tableName,數據庫的表名稱
l $identityColumn:指定表中的記錄列
l $credentialColum:指定表中的憑記列(密碼列)
l $credentialTreatment:指定對錶中的憑記列進行的加密操做
1. 對象的初始化方式也能夠以下:(以set的方式替代構造函數參數)
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('zendLogin')
->setIdentityColumn('username')
->setCredentialColumn('password')
->setCredentialTreatment('MD5(?)');
2. 對象初始化後,就能夠調用
$auth->setIdentity(username);
$auth->setCredential(password);
$result=$auth->authenticate();
If($result->isValid()){
…
// the default storage is a sessionwith namespace Zend_Auth
$authStorage = $auth->getStorage();
$authStorage->write($userInfo);
}
進行用戶的認證了。
3. 而在用戶退出時則可使用:
Zend_Auth::getInstance()->clearIdentity();
清除保存的認證信息。
(在用戶進行成功經過認證以後,須要爲其設置一個持久的認證,這在Zend_Auth中默認使用Zend_Auth_Storage_Session實現認證信息保存功能。)
在Zend Framework中給出了一個通用性的日誌組件,Zend_Log,它負責進行各類日誌保存的操做,它又分爲
Log對象:Zend_Log的實例,經常使用的對象
Write對象:繼承與Zend_Log_Writer_Abstract,負責向存儲中保存數據
Filter對象:實現了Zend_Log_Filter_Interface,過濾一些不須要的數據
Formatter對象:實現了Zend_Log_Formatter_Interface,在Write寫入數據以前對日誌數據進行格式化工做,每一個Writer只能有一個Formatter對象
在下面只介紹Zend_Log對象。
大致使用方法:
$writer=newZend_Log_Writer_Stream(‘log.txt’);//初始化Zend_Log_Writer_Stream實例
$log=newZend_Log($writer); //初始化Zend_Log對象
$log->log(‘someitems’ Zend_Log::ALERT); //向日志中寫入數據,使用alert消息級別,可使用的消息級別有不少…具體查網上吧。。