yaf 學習

轉自 http://blog.congcong.us/archives/283.htmlphp

框架的存在主要意義就是提升程序員的開發效率,同時也帶來性能上的一部分損失。
當前開發面向對象已經成爲主流,同時爲了規範開發使用MVC模式已經成爲了一種趨勢,當前市面上的框架很是之多,大部分也是MVC模式,可是相對來講對於PHP性能都必定的損失。css

那麼有沒有一種框架既能知足開發效率,又儘量少的減小性能的損失呢?因而Yaf框架面世。html

Yaf是以PHP插件的形式出現,因此少了編譯加載等步驟,增強了性能。提供MVC模式,有必定的路由規則,必定的錯誤處理機制,有必定的觸發器。
同時也伴之有不足之處好比說缺乏ORM等形式git

Yaf的框架搭建的時候目錄結構:程序員

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public
      index.php
      .htaccess
      css
      img
      js
conf
      application.ini
applciation
      controllers
           Index.php
      views
           index
                index.phtml
      modules
      library
      models
      plugins

Yaf的啓動bootstrap

1
2
$app new Yaf_Application(App_PATH. "/CONF/APPLICATION.INI" );
$app ->run();

配置Yaf的路由規則 開啓URL重寫緩存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
RewriteEngine On
RewriteCond ${REQUEST_FILENAME} !-f
RewriteRule .* index.php
 
 
server{
      listen ***;
      server_name domain.com
      root document_root;
      index index.php index.html index.htm
      if (!-e  $request_filename ){
           rewrite ^/(.*) /idnex.php/ $1 last;
      }
}

SAE下的重寫app

1
2
3
4
name:your_app_name
version:1
handle:
      -rewrite: if (! is_dir () && ! is_file () && path ~  "^(.*)$" goto "/index.php"

輸出HelloWorld框架

1
2
3
4
5
6
7
<?php
class IndexController  extends Yaf_Controller_Abstract{
      public function indexAction(){
           $this ->getView()->assign( "content" , "Hello world" );
      }
}
?>
1
2
[product]
      application.driectory = APP_PATH. "/application/"

建立demodom

1
yaf_cg sample

配置文件 至少一個application.directory
其餘可選:

1
2
3
4
5
6
7
8
9
10
11
12
application.ext php腳本的擴展名
application.bootstrap Bootstrap路徑
application.library 類庫的絕對目錄地址
application.baseUri 在路由中須要忽略的路徑前綴
applciation.dispatcher.defaultModule 默認的模塊
applciation.dispatcher.throwException 出錯的時候拋出異常
applciation.dispatcher.catchException 使用默認的異常捕獲Controller
application.dispatcher.defaultController 默認控制器
application.dispatcher.defaultAction 默認動做
appcation.view.ext 視圖模板擴展名
appcation.modules 聲明存在的模塊名,注意若是要定義這個值必定要定義Index Module
application.system.* 經過這個屬性,能夠修改yaf的runtime configure 好比application.system.lowcase_path,可是請注意只有PHP_INI_ALL的配置項才能夠在這裏被修改,此選項從2.2.0開始引入

自動加載器
Autoloader 目錄映射加載MVC類
非框架MVC類 Yaf支持全局類和自身類的兩種加載方式 支持大小寫敏感和大小寫不敏感兩種方式

全局類和自身類(本地類)
全局類:指有產品之間共享的類,這些類庫的路徑是經過ap.library在php.ini
本地類:產品自身的類庫,這些類庫的路徑是經過在產品的配置文件中,經過ap.library配置的
在yaf中,經過調用Yaf_Loader的regiterLocalNamespace方法,來申明那些類前綴是本地類,便可

類加載規則
下劃線分割目錄信息,Yaf按照目錄信息完成自動加載

1
2
$loader = Yaf_Loader::Instance(0);
$loader ->registerLocalNamespace( array ( "Foo" , "Local" ));

Bootstrap 引導程序 提供一個全局配置的入口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$app new Yaf_Application( "conf.ini" );
$app ->bootstrap()->run();
 
 
// _init開頭
//這些方法都接受一個參數:Yaf_Dispatcher $dispatcher
//調用順序按照聲明順序
 
class Bootstrap  extends Yaf_Bootstrap_Abstract{
      public function _initConfig(){
           $config = Yaf_Application::app()->getConfig();
           Yaf_Registry::set( "config" , $config );
      }
      public function _initDefaultName(Yaf_Dispatcher  $dispatcher ){
           $dispatcher ->setDefaultModule( "Index" )->setDefaultController( "Index" )->setDefaultAction( "Index" );
      }
}

Yaf支持的Hook
routerStartup
routerShutdown

dispatchLoopStartup
preDispatch
posDispatch
dispatchLoopShutdown

自定義插件(可接受兩個參數 Yaf_Request_Abstract 和 Yaf_Response_Abstract)

1
2
3
4
5
<?php
class UserPlugin  extends Yaf_Plugin_Abstract{
      public function routerStartup(Yaf_Request_Abstract  $request ,Yaf_Response_Abstract  $response ){}
      public function routerShutdown(Yaf_Request_Abstract  $request ,Yaf_Response_Abstract  $response ){}
}

Yaf插件 必須繼承自Yaf_Plugin_Abstract plugins目錄

路由和路由協議
路由組件有兩個部分:路由器(Yaf_Router)和路由協議(Yaf_Route_Abstract).
路由註冊的順序很重要,最後註冊的路由協議,最早嘗試路由,這就有個陷阱,請注意。

Yaf零基礎學習總結1-Yaf框架簡介
從今天開始,給你們講解下yaf框架,講解以前確定要了解下yaf是個什麼東西,固然,從標題咱們已經知道yaf是個PHP框架了,也許你們對於PHP框架並不陌生,通常PHP程序員用過的框架至少有一兩個吧,國內用的比較多的有ThinkPHP,YII之類的,用Yaf的還真很少。緣由我的感受有兩個,一個是剛推廣不久,第二個就是門檻高,讓新手無從下手,大多數新手更喜歡用那些使用普遍,教程文檔多的框架

首先引用yaf的做者對yaf的一個簡單引述:

隨着PHP的發展, PHP框架層出不窮, 但到底用不用PHP框架, 還存在很大的爭論, 反對者認爲使用框架會下降性能, 常常舉例的就是Zend Framework. 而支持者則認爲,採用框架能提升開發效率, 損失點性能也是值得的.
而這些也正是公司內框架種類繁多的一個緣由, 有的項目組爲了性能而選擇某些框架, 而另一些項目組, 則爲了更好的封裝選擇了另外的框架
那, 有沒有倆全的辦法呢? 也就是說, 有沒有那麼一個框架, 既不會有損性能, 又能提升開發效率呢.
Yaf, 就是爲了這個目標而生的.
Yaf有着和Zend Framework類似的API, 類似的理念, 而同時又保持着對Bingo的兼容, 以此來提升開發效率, 規範開發習慣. 本着對性能的追求, Yaf把框架中不易變的部分抽象出來,採用PHP擴展實現(c語言),以此來保證性能.在做者本身作的簡單測試中, Yaf和原生的PHP在一樣功能下, 性能損失小於10%, 而和Zend Framework的對比中, Yaf的性能是Zend Framework的50-60倍.


能夠看出,Yaf框架一個最大的優點就是快,他是用C語言寫的,和原生PHP同樣,速度快,接近原生的PHP,如同做者而言,劍的三層境界:一是手中有劍,心中亦有劍;二是手中無劍,心中有劍;三是手中無劍,心中亦無劍,在和其餘用PHP寫的PHP框架來比的話, Yaf就是劍的第二層境界. 框架不在你手中, 而在PHP的"心"中.

官方文檔對Yaf的優勢作了如下總結

1. 用C語言開發的PHP框架, 相比原生的PHP, 幾乎不會帶來額外的性能開銷.
2. 全部的框架類, 不須要編譯, 在PHP啓動的時候加載, 並常駐內存.
3. 更短的內存週轉週期, 提升內存利用率, 下降內存佔用率.
4. 靈巧的自動加載. 支持全局和局部兩種加載規則, 方便類庫共享.
5. 高性能的視圖引擎.
6. 高度靈活可擴展的框架, 支持自定義視圖引擎, 支持插件, 支持自定義路由等等.
7. 內建多種路由, 能夠兼容目前常見的各類路由協議.
8. 強大而又高度靈活的配置文件支持. 並支持緩存配置文件, 避免複雜的配置結構帶來的性能損失.
9. 在框架自己,對危險的操做習慣作了禁止.
10. 更快的執行速度, 更少的內存佔用

默認狀況下路由器是Yaf_Router 默認路由協議 Yaf_Route_Static 基於Http路由的,他指望一個請求時Http請求而且請求對象是使用yaf_Request_Http

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
      //路由器實例
      $router = Yaf_Dispatcher::getInstance()->getRouter();
      //路由器協議
      $router ->addRoute( 'myRoute' , $route );
在配置文件中定義:
[common]
;自定義路由 順序很重要
routes.regex.type=  "regex"
routes.regex.match =
routes.regex.route.controller = Index
routes.regex.route.action = action
routes.regex.map.1 = name
routes.regex.map.2 = value
 
;添加一個名爲simple的路由協議
routes.simple.type= "simple"
routes.simple.controller = c
routes.simple.module = m
routes.simple.action = a
 
;添加一個名爲supervar的路由協議
routes.supervar.type =  "supervar"
routes.supervar.varname = r
 
[product:common]
;product節是Yaf默認關心的節,添加一個名爲rewrite的路由協議
routes.rewrite.type =  "rewrite"
routes.rewrite.match =  "/product/:name/:value"
 
<?php
class Bootstrap  extends Yaf_Bootstrap_Abstract{
 
      public function _initRoute(Yaf_Dispatcher  $dispatcher ){
           $router = Yaf_Dispatcher::getInstance()->getRouter();
           //添加配置中的路由
           $router ->addConfig(Yaf_Registry::get( "config" )->routes);
      }
}

//其實路由器也提供給咱們不一樣的方法來獲得和設置包含在它內部的信息,一些重要的方法以下:
getCurrentRoute() //在路由結束之後, 獲取起做用的路由協議
getRoute(), getRoutes();//看函數基本意思也就知道.

自定義路由器:申明你的路由協議實現了Yaf_Route_Interface接口便可

異常和錯誤

application.dispatcher.throwException 打開的狀況下 會拋異常,不然會觸發錯誤

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class ErrorController  extends Yaf_Controller_Abstract{
      publi  function errorAction( $exception ){
      //NO1.
      assert( $exception ===  $exception ->getCode());
      $this ->getView()->assign( "code" , $exceptioon ->getCode());
      $this ->getView()->assign( "message" , $exception ->getMessage());
 
      //NO.2
       $exception $this ->getRequest()->getException();
 
   try {
     throw $exception ;
   catch (Yaf_Exception_LoadFailed  $e ) {
     //加載失敗
   catch (Yaf_Exception  $e ) {
     //其餘錯誤
   }
 
      }
}
相關文章
相關標籤/搜索