PHP開發框架比較

自此,YYUC框架的開發團隊徵集並完成組建,不斷的討論、編碼、測試、內部開發和合做夥伴推廣;一個完整的版本就此造成。php

 

特性html

codeigniterlaravel

laravelweb

YYUCsql

比較chrome

路由規則數據庫

約定加自定義,視圖須要手工指定。php框架

約定加自定義,視圖須要手工指定。安全

約定加自定義。服務器

不利用配置文件的路由規則就能夠自由的構建URL格式,通常的路由約定是:

類/方法/參數,這種約定不夠靈活,YYUC的路由實現上能夠更靈活。

laravel的統一分發雖然使路由的定義更加靈活的,可是我的以爲不必。只要層次設計好有利於SEO和用戶感官就好,沒有必要獨立定義。Laravel3以前開發和維護過程當中查着路由表找控制器累不累啊。Laravel3以後解決了這個問題,有了自動路由的方法:Route::controller(Controller::detect());

類加載

手動指定加載的類,分爲幫助類,和字典類等等。

自動加載。

插件形式自動加載,分爲系統插件和用戶插件等。

類較少時三個框架的加載速度相差不大,YYUC是自動加載,不用開發人員手動指定。Laravel也是這一原理,codeigniter調用load方法和直接include差很少,代碼不夠簡潔明快。
對於YYUC插件類較多時如超出500動態加載每次都要從衆多文件中抽出所須要的類文件YYUC效率會有所降低。
若是工程特別大,通用類文件特別多考慮以指定包名稱的方式加載。若是隻是單一模塊下用到的類能夠將類下載控制器文件夾下,以"_"開頭,調用import方法加載該模塊的類,父模塊和子模塊的類能夠經過指明路徑層級明確調用。

數據校驗

校驗方式靈活。校驗規顯得有些雜亂

校驗方式靈活,預置的校驗種類全面。

建議將提交的數據都封裝在模型中,有對應庫表的用數據庫模型,沒有的用簡單模型。重寫校驗方法實現校驗。有利於數據的統一管理,與此同時特定校驗的擴展性強。

各有優點,codeigniter的類加載原本就很醜了,再加上不一樣方式的校驗規則,代碼顯的亂七八糟的。

可擴展性

類相對獨立,併入框架內部要加一些框架的實例化方法。

框架基本上都是靜態風格,太過個性化。把網絡上開源的類引入框架中會顯得格格不入。最好最爲自定義的類放入項目中。要用這些類擴展框架就要對引入的類作大手術。

插件形式引入,對於大多輸的類一般只需改下類的文件名就能夠自動被調用。

仍是喜歡本身寫的框架,核心是核心插件是插件,核心越精簡越高效越好,插件越強大越靈活越好。網絡上這麼多優秀的通過驗證的類爲何不直接引入其中呢。

安全性

安全機制強大

只包含通常安全校驗,如跨站提交等

自認爲安全機制強大

codeigniter能夠說把能作的安全防範機制都作了,laravel與其說是個框架倒更像一個路由分發的核心。不少安全問題須要本身考慮。YYUC參考了struct,Thinkphp以及codeigniter的安全驗證方式,把能加的安全防範規則都加了,可能因爲本身底層知識(包括php底層,web服務器底層)的侷限性還存在漏洞也是可能的。可是用YYUC發現漏洞能夠第一時間改掉。用其餘的框架,若是萬一有漏洞存在,要麼要修改他的核心代碼要麼要等待版本更新是神被動的。

先進行

傳統的MVC模式,可是Model層不夠靈活,與庫表數據的一一對應並很差。

最新的5.3+支持,先進的語法風格。顯得有些另類

傳統的MVC模式

laravel運用了最新的5.3規範,引入命名空間的概念,像namespace use等語法都是最新引入,可是部署上有侷限性。laravel引入了相似JS的匿名函數回調機制,開發者可能要在思惟角度上有所轉變。並且大量的回調更利於假設高性能的分發程序,不適合傳統的Web網站開發。因此laravel只是底層運用了這些模式,對於開發者來講仍是傳統的MVC模式。

數據庫支持

功能強大,全面支持。

PDO規範支持Mysql和Sqlserver不支持Oracle

只支持Mysql

YYUC目前只支持Mysql數據庫,可是封裝的DB類作了很好的多庫表,主從表的支持(主要參照的Thinkphp),超大數據量的系統也是能夠應對的。對於其餘數據庫之後版本想以插件的形式。在精而不在多。

效率與開銷

相應速度快,內存開銷通常。

相應速度較快,內存開銷稍大。

生產模式下相應速度快,內存開銷很小,開發模式下須要編譯速度會稍微慢一些。

我的認爲對PHP來講,框架類的層級過多並不必定是好事。

PHP的初衷就是敏捷開發快速相應,Http並非常鏈接的,處理好每次請求也就處理好了整個網站,好的框架並不必定要設計成像Spring那樣一應俱全。

 

開發運行效率示例:

下面的例子分別利用三種框架作了個數據插入到Mysql數據庫並查詢輸出的示例,示例只是實現基本的增長查詢功能並無進行數據校驗。下面的例子中將展現不一樣框架代碼量的,公平起見運行效率的統計方法沒有用框架底層的調試類而是採用原生的php方法計算運行時間和內存使用量:

數據表:

CREATE TABLE `test_article` (

  `id` int(11) NOT NULL auto_increment COMMENT '主鍵',

  `title` varchar(255) default NULL COMMENT '標題',

  `content` text COMMENT '內容',

  `updated_at` datetime default NULL,

  `created_at` datetime default NULL, --laravel必須這兩個字段(和Rails的如出一轍)

  PRIMARY KEY  (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

代碼量展現:

laravel:

視圖:

新增頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>測試新增</title>

</head>

<body>

<?php echo Form::open('test/new','POST');?>

標題:<?php echo Form::text('title',$title);?>

內容:<?php echo Form::text('content',$content);?>

<?php echo Form::submit('提交');?>

<?php Form::token()?>

<?php echo Form::close();?>

</body>

</html>

若是要實現表單自動填充的話仍是要手動指定的有些麻煩

新增成功頁:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>保存成功</title>

</head>

<body>

<h1>保存成功</h1>

</body>

</html>

 

展現頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>顯示數據</title>

</head>

<body>

標題:<?php echo $title?><br/>

內容:<?php echo $content?><br/>

</body>

</html>

 

模型:

<?php

class Article extends Eloquent {

       public static $table = 'test_article';

 

}

 

控制器:

<?php

class Test_Controller extends Base_Controller {

      

       /**

        * 頁面展現

        */

       public function action_init()

       {

              return View::make('test.new');

       }

       /**

        * 保存數據

        */

       public function action_new()

       {

              $title =  Input::get('title');

              $content = Input::get('content');

              $article = new Article;            

              $article->title = $title;

              $article->content = $content;             

              $article->save();

              return View::make('test.success');

       }

      

       /**

        * 顯示數據

        */

       public function action_show($id)

       {

              $article = Article::find($id);

              return View::make('test.show',array('title'=>$article->title,'content'=>$article->content));

       }

 

}

CodeIgniter:

視圖:

新增頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>測試新增</title>

</head>

<body>

<?php $this->load->helper('form');?>

<?php echo form_open('test/tonew'); ?>

標題:<?php echo form_input('title');?>

內容:<?php echo form_input('content');?>

<?php echo form_submit('mysubmit''提交');?>

</form>

</body>

</html>

 

一樣的表單自動填充也不省事,不對稱的標籤格式總讓人內心不舒服

新增成功頁:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>保存成功</title>

</head>

<body>

<h1>保存成功</h1>

</body>

</html>

 

展現頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>顯示數據</title>

</head>

<body>

標題:<?php echo $title?><br/>

內容:<?php echo $content?><br/>

</body>

</html>

 

模型:

 

<?php

class Article_model extends CI_Model {

 

       /**

        * 構造函數

        */

       public function __construct()

       {

              $this->load->database();

       }

       /**

        * 新增函數

        */

       public function to_new()

       {

              $data = array(

                            'title' => $this->input->post('title'),

                            'content' => $this->input->post('content')

              );    

              return $this->db->insert('test_article', $data);

       }

       /**

        * 查詢一條數據

        * @param $id

        */

       public function show_one($id)

       {

              $query = $this->db->get_where('test_article'array('id' => $id));

             return $query->row_array();

       }

      

}

不管怎樣類初始化後DB鏈接就創建了,並且數據查詢很不方便,徹底拋棄了POJO類的概念,要手動加屬性這點開發效率上是沒法和YYUC和laravel相比的。

控制器:

<?php

class Test extends CI_Controller {

       /**

        * 構造函數

        */

       public function __construct()

       {

              parent::__construct();

              $this->load->model('article_model');

       }

      

      

       /**

        * 頁面展現

        */

       public function init()

       {

              $this->load->view('test/new');           

       }

       /**

        * 保存數據

        */

       public function tonew()

       {

              $this->article_model->to_new();        

              $this->load->view('test/success');

       }

       /**

        * 顯示數據

        */

       public function show($id)

       {

              $data = $this->article_model->show_one($id);

              $this->load->view('test/show',$data);

       }

}

YYUC:

視圖:

新增頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>測試新增</title>

</head>

<body>

<form action="new.html" method="post">

標題:{$article->text('title')}

內容:{$article->text('content')}

<button type="submit">提交</button>

{tk()}

</form>

</body>

</html>

 

 

 

新增成功頁:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>保存成功</title>

</head>

<body>

<h1>保存成功</h1>

</body>

</html>

 

展現頁面:

<!doctype html>

<html>

<head>

       <meta charset="utf-8">

       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

       <title>顯示數據</title>

</head>

<body>

標題:{h $article->title}<br/>

內容:{h $article->content}<br/>

</body>

</html>

安全起見,視圖中轉義要輸出的字符

模型:

簡單的數據處理,沒有驗證、虛擬字段填充與回填、複雜數據計算等操做,使用自動模型構建就好,因此徹底不必自定義模型

控制器:

初始化和新增:

if(Request::post()){

       //數據提交

       $article = new Model('article');

       if($article->load_from_post()->save()){

              Page::view('success');

       }

}else{

       //初始化顯示

       $article = new SampleModel('article');

}

數據顯示:

$article = new Model('article');

if(!is_numeric(get(1)) || !$article->find(get(1))->has_id()){

       //數據不合法或者不存在跳轉到404頁面 上兩個框架判斷起來稍顯麻煩就沒寫 若是有這種狀況上兩個框架會直接拋異常的

       goto_404();

}

已經自動集成阻止跨站提交模塊

性能消耗:

三個框架均設置爲生產模式。

laravel:

新增展現:

內存使用狀況:
2989432bytes
運行時間:
0.0533249378204秒

數據保存:

內存使用狀況:
3433792bytes
運行時間:
0.130746126175秒

數據顯示:

內存使用狀況:
3374368bytes
運行時間:
0.0524969100952秒

 

 

CodeIgniter:

新增展現:

內存使用狀況:
2643704bytes
運行時間:
0.054661989212秒

數據保存:

內存使用狀況:
2471400bytes
運行時間:
0.158566141129秒

數據顯示:

內存使用狀況:
2572744bytes
運行時間:
0.0491800308228秒

 

YYUC:

新增展現:

內存使用狀況:
1850760bytes
運行時間:
0.0474209499359秒

數據保存:

內存使用狀況:
2076544bytes
運行時間:
0.090379867554秒

數據顯示:

內存使用狀況:
2075152bytes
運行時間:
0.0683400440216秒

綜述:

laravel是很是優美和整潔的php框架,路由功能很是強大,更像一個路由核心,有着良好的請求分發和路由控制,代碼風格整齊劃一。可是彷佛laravel擴展的功能太過簡單,沒有太多的具體實現。最重要的是全部請求都要走路由,看了它的2.x和3.x版新版本纔有默認規則,最新版簡直就和ROR如出一轍,好比數據表結構什麼的連字段的要求都是同樣的,Rails雖好也不至於模仿的這麼真真切切。基於laravel的前臺的各類控件不多,網上甚至沒有一個基於laravel的完整的例子。中文文檔還在翻譯中對於新人來講用laravel開發效率可能會大打折扣,並且laravel在安全性方面考慮的並很少這也是讓人頭疼的一部分,好像只有一個防止跨站提交的過濾器。我的認爲最重要的是選擇使用laravel人如今並很少。框架結構設計的很是優秀,可是仍是稍顯複雜的,引入了最新的命名空間,和閉包回調的機制,每次請求要加載的文件太多了或多或少的拖了性能,因此內存消耗方面laravel是最大的。

Codeigniter功能強大可是顯得又過於雜亂了,特別是控制器和視圖的對應上徹底背離了約定大於配置這一原則,沒有Rails的外部包裹機制,內部引入也顯得頁面和代碼不分家。Codeigniter沒有模型類的自動裝載功能,實際開發起來效率就會有些低,視圖代碼不講究對稱讓人看了不順心。好像Codeigniter並無自動的POJO類的概念,Model類側很重Active Record模式,數據庫的操做很大程度上依賴了手寫。還有就是開發的時候沒有顯示的類調用,這樣就得不到IDE友好提示,開發效率上多少會有影響的。

其實全部MVC的框架機制是同樣,可是YYUC其中一個特色是按需加載,控制器是程序片斷而不是一個類,一般的面向類的控制器若是對應10個請求的話那麼每次頁面請求都會無故的加載9段多餘的其餘代碼。php不像Java常駐內存,每次請求能少加載些就少加載些。YYUC控制器中的變量是不須要顯示的聲明注入到視圖中的,視圖和控制器在同一個級別之下,這樣即提升了開發效率又加快了代碼的執行效率。YYUC的Model既有原始POJO類的特色也能夠經過子類實現Active Record模式,能夠在開發時靈活選擇。經過插件規則YYUC內置了不少經常使用控件,像分頁、日期,上傳,圖片截取,驗證碼、顏色選取、富文本編輯器、HTML5的視頻音頻兼容播放、HTML5的WebSocket兼容支持等等。

相關文章
相關標籤/搜索