久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PHP開發(fā)框架比較

 quasiceo 2014-04-30

PHP開發(fā)框架比較

Laravel 是一個簡單優(yōu)雅的 PHP WEB 開發(fā)框架,將你從意大利面條式的代碼中解放出來。通過簡單,、優(yōu)雅、表達式語法開發(fā)出很棒的 WEB應(yīng)用!
但是通過使用我們發(fā)現(xiàn)Laravel在開發(fā)效率和運行效率上都存在瓶頸,。如此優(yōu)秀的框架都存在諸多問題,,基于此我們在公司現(xiàn)有框架的基礎(chǔ)上參照諸多框架(不限于php語言也參照java和ruby)的優(yōu)點完成一個自主設(shè)計的框架。
自此,,YYUC框架的開發(fā)團隊征集并完成組建,,不斷的討論、編碼,、測試,、內(nèi)部開發(fā)和合作伙伴推廣;一個完整的版本就此形成,。

特性

codeigniter

laravel

YYUC

比較

路由規(guī)則

約定加自定義,,視圖需要手工指定。

約定加自定義,,視圖需要手工指定,。

約定加自定義。

不利用配置文件的路由規(guī)則就可以自由的構(gòu)建URL格式,,一般的路由約定是:

類/方法/參數(shù),,這種約定不夠靈活,YYUC的路由實現(xiàn)上可以更靈活,。

laravel的統(tǒng)一分發(fā)雖然使路由的定義更加靈活的,,但是個人覺得沒必要。只要層次設(shè)計好有利于SEO和用戶感官就好,,沒有必要獨立定義,。Laravel3之前開發(fā)和維護過程中查著路由表找控制器累不累啊。Laravel3之后解決了這個問題,,有了自動路由的方法:Route::controller(Controller::detect());

類加載

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

自動加載,。

插件形式自動加載,分為系統(tǒng)插件和用戶插件等,。

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

數(shù)據(jù)校驗

校驗方式靈活,。校驗規(guī)顯得有些雜亂

校驗方式靈活,預(yù)置的校驗種類全面,。

建議將提交的數(shù)據(jù)都封裝在模型中,,有對應(yīng)庫表的用數(shù)據(jù)庫模型,沒有的用簡單模型,。重寫校驗方法實現(xiàn)校驗,。有利于數(shù)據(jù)的統(tǒng)一管理,與此同時特定校驗的擴展性強,。

各有優(yōu)勢,,codeigniter的類加載本來就很丑了,再加上不同方式的校驗規(guī)則,,代碼顯的亂七八糟的,。

可擴展性

類相對獨立,并入框架內(nèi)部要加一些框架的實例化方法,。

框架基本上都是靜態(tài)風(fēng)格,,太過個性化。把網(wǎng)絡(luò)上開源的類引入框架中會顯得格格不入,。最好最為自定義的類放入項目中。要用這些類擴展框架就要對引入的類做大手術(shù),。

插件形式引入,,對于大多輸?shù)念愅ǔV恍韪南骂惖奈募涂梢宰詣颖徽{(diào)用。

還是喜歡自己寫的框架,,核心是核心插件是插件,,核心越精簡越高效越好,插件越強大越靈活越好,。網(wǎng)絡(luò)上這么多優(yōu)秀的經(jīng)過驗證的類為什么不直接引入其中呢,。

安全性

安全機制強大

只包含一般安全校驗,如跨站提交等

自認(rèn)為安全機制強大

codeigniter可以說把能做的安全防范機制都做了,laravel與其說是個框架倒更像一個路由分發(fā)的核心,。很多安全問題需要自己考慮,。YYUC參考了struct,,Thinkphp以及codeigniter的安全驗證方式,把能加的安全防范規(guī)則都加了,,可能由于自己底層知識(包括php底層,,web服務(wù)器底層)的局限性還存在漏洞也是可能的。但是用YYUC發(fā)現(xiàn)漏洞可以第一時間改掉,。用其他的框架,,如果萬一有漏洞存在,要么要修改他的核心代碼要么要等待版本更新是神被動的,。

先進行

傳統(tǒng)的MVC模式,,但是Model層不夠靈活,與庫表數(shù)據(jù)的一一對應(yīng)并不好,。

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

傳統(tǒng)的MVC模式

laravel運用了最新的5.3規(guī)范,,引入命名空間的概念,,像namespace use等語法都是最新引入,但是部署上有局限性,。laravel引入了類似JS的匿名函數(shù)回調(diào)機制,,開發(fā)者可能要在思維角度上有所轉(zhuǎn)變。而且大量的回調(diào)更利于假設(shè)高性能的分發(fā)程序,,不適合傳統(tǒng)的Web網(wǎng)站開發(fā),。所以laravel只是底層運用了這些模式,對于開發(fā)者來說還是傳統(tǒng)的MVC模式,。

數(shù)據(jù)庫支持

功能強大,,全面支持。

PDO規(guī)范支持Mysql和Sqlserver不支持Oracle

只支持Mysql

YYUC目前只支持Mysql數(shù)據(jù)庫,,但是封裝的DB類做了很好的多庫表,,主從表的支持(主要參照的Thinkphp),超大數(shù)據(jù)量的系統(tǒng)也是可以應(yīng)對的,。對于其他數(shù)據(jù)庫以后版本想以插件的形式,。在精而不在多。

效率與開銷

相應(yīng)速度快,,內(nèi)存開銷一般,。

相應(yīng)速度較快,內(nèi)存開銷稍大,。

生產(chǎn)模式下相應(yīng)速度快,,內(nèi)存開銷很小,開發(fā)模式下需要編譯速度會稍微慢一些。

個人認(rèn)為對PHP來說,,框架類的層級過多并不一定是好事,。

PHP的初衷就是敏捷開發(fā)快速相應(yīng),Http并不是常連接的,,處理好每次請求也就處理好了整個網(wǎng)站,,好的框架并不一定要設(shè)計成像Spring那樣包羅萬象。

開發(fā)運行效率示例:

下面的例子分別利用三種框架做了個數(shù)據(jù)插入到Mysql數(shù)據(jù)庫并查詢輸出的示例,,示例只是實現(xiàn)基本的增加查詢功能并沒有進行數(shù)據(jù)校驗,。下面的例子中將展示不同框架代碼量的,公平起見運行效率的統(tǒng)計方法沒有用框架底層的調(diào)試類而是采用原生的php方法計算運行時間和內(nèi)存使用量:

數(shù)據(jù)表:

CREATE TABLE `test_article` (

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

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

  `content` text COMMENT '內(nèi)容',

  `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');?>

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

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

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

<?php Form::token()?>

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

</body>

</html>

如果要實現(xiàn)表單自動填充的話還是要手動指定的有些麻煩

新增成功頁:

<!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>顯示數(shù)據(jù)</title>

</head>

<body>

標(biāo)題:<?php echo $title?><br/>

內(nèi)容:<?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');

       }

       /**

        * 保存數(shù)據(jù)

        */

       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');

       }

      

       /**

        * 顯示數(shù)據(jù)

        */

       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'); ?>

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

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

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

</form>

</body>

</html>

 

同樣的表單自動填充也不省事,不對稱的標(biāo)簽格式總讓人心里不舒服

新增成功頁:

<!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>顯示數(shù)據(jù)</title>

</head>

<body>

標(biāo)題:<?php echo $title?><br/>

內(nèi)容:<?php echo $content?><br/>

</body>

</html>

 

模型:

 

<?php

class Article_model extends CI_Model {

 

       /**

        * 構(gòu)造函數(shù)

        */

       public function __construct()

       {

              $this->load->database();

       }

       /**

        * 新增函數(shù)

        */

       public function to_new()

       {

              $data = array(

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

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

              );    

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

       }

       /**

        * 查詢一條數(shù)據(jù)

        * @param $id

        */

       public function show_one($id)

       {

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

             return $query->row_array();

       }

      

}

無論怎樣類初始化后DB連接就建立了,,而且數(shù)據(jù)查詢很不方便,,完全拋棄了POJO類的概念,要手動加屬性這點開發(fā)效率上是無法和YYUC和laravel相比的,。

控制器:

<?php

class Test extends CI_Controller {

       /**

        * 構(gòu)造函數(shù)

        */

       public function __construct()

       {

              parent::__construct();

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

       }

      

      

       /**

        * 頁面展示

        */

       public function init()

       {

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

       }

       /**

        * 保存數(shù)據(jù)

        */

       public function tonew()

       {

              $this->article_model->to_new();        

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

       }

       /**

        * 顯示數(shù)據(jù)

        */

       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">

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

內(nèi)容:{$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>顯示數(shù)據(jù)</title>

</head>

<body>

標(biāo)題:{h $article->title}<br/>

內(nèi)容:{h $article->content}<br/>

</body>

</html>

安全起見,,視圖中轉(zhuǎn)義要輸出的字符

模型:

簡單的數(shù)據(jù)處理,沒有驗證,、虛擬字段填充與回填,、復(fù)雜數(shù)據(jù)計算等操作,使用自動模型構(gòu)建就好,,所以完全沒必要自定義模型

控制器:

初始化和新增:

if(Request::post()){

       //數(shù)據(jù)提交

       $article = new Model('article');

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

              Page::view('success');

       }

}else{

       //初始化顯示

       $article = new SampleModel('article');

}

數(shù)據(jù)顯示:

$article = new Model('article');

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

       //數(shù)據(jù)不合法或者不存在跳轉(zhuǎn)到404頁面 上兩個框架判斷起來稍顯麻煩就沒寫 如果有這種情況上兩個框架會直接拋異常的

       goto_404();

}

已經(jīng)自動集成阻止跨站提交模塊

性能消耗:

三個框架均設(shè)置為生產(chǎn)模式,。

laravel

新增展示:

內(nèi)存使用情況:
2989432bytes
運行時間:
0.0533249378204秒

數(shù)據(jù)保存:

內(nèi)存使用情況:
3433792bytes
運行時間:
0.130746126175秒

數(shù)據(jù)顯示:

內(nèi)存使用情況:
3374368bytes
運行時間:
0.0524969100952秒

 

 

CodeIgniter

新增展示:

內(nèi)存使用情況:
2643704bytes
運行時間:
0.054661989212秒

數(shù)據(jù)保存:

內(nèi)存使用情況:
2471400bytes
運行時間:
0.158566141129秒

數(shù)據(jù)顯示:

內(nèi)存使用情況:
2572744bytes
運行時間:
0.0491800308228秒

 

YYUC

新增展示:

內(nèi)存使用情況:
1850760bytes
運行時間:
0.0474209499359秒

數(shù)據(jù)保存:

內(nèi)存使用情況:
2076544bytes
運行時間:
0.090379867554秒

數(shù)據(jù)顯示:

內(nèi)存使用情況:
2075152bytes
運行時間:
0.0683400440216秒

綜述:

laravel是非常優(yōu)美和整潔的php框架,路由功能非常強大,,更像一個路由核心,,有著良好的請求分發(fā)和路由控制,代碼風(fēng)格整齊劃一,。但是似乎laravel擴展的功能太過簡單,,沒有太多的具體實現(xiàn)。最重要的是所有請求都要走路由,,看了它的2.x和3.x版新版本才有默認(rèn)規(guī)則,,最新版簡直就和ROR一模一樣,比如數(shù)據(jù)表結(jié)構(gòu)什么的連字段的要求都是一樣的,,Rails雖好也不至于模仿的這么真真切切,。基于laravel的前臺的各種控件很少,,網(wǎng)上甚至沒有一個基于laravel的完整的例子。中文文檔還在翻譯中對于新人來說用laravel開發(fā)效率可能會大打折扣,,而且laravel在安全性方面考慮的并不多這也是讓人頭疼的一部分,,好像只有一個防止跨站提交的過濾器。個人認(rèn)為最重要的是選擇使用laravel人現(xiàn)在并不多??蚣芙Y(jié)構(gòu)設(shè)計的非常優(yōu)秀,,但是還是稍顯復(fù)雜的,引入了最新的命名空間,,和閉包回調(diào)的機制,,每次請求要加載的文件太多了或多或少的拖了性能,所以內(nèi)存消耗方面laravel是最大的,。

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

其實所有MVC的框架機制是一樣,但是YYUC其中一個特點是按需加載,,控制器是程序片段而不是一個類,,通常的面向類的控制器如果對應(yīng)10個請求的話那么每次頁面請求都會無端的加載9段多余的其他代碼。php不像Java常駐內(nèi)存,,每次請求能少加載些就少加載些,。YYUC控制器中的變量是不需要顯示的聲明注入到視圖中的,視圖和控制器在同一個級別之下,,這樣即提高了開發(fā)效率又加快了代碼的執(zhí)行效率,。YYUC的Model既有原始POJO類的特點也可以通過子類實現(xiàn)Active Record模式,可以在開發(fā)時靈活選擇,。通過插件規(guī)則YYUC內(nèi)置了很多常用控件,,像分頁、日期,,上傳,,圖片截取,驗證碼,、顏色選取,、富文本編輯器、HTML5的視頻音頻兼容播放、HTML5的WebSocket兼容支持等等,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多