GVKun编程网logo

ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼(thinkphp路由规则)

19

本文将带您了解关于ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼的新内容,同时我们还将为您解释thinkphp路由规则的相关知识,另外,我们还将为您提供关于laravel5.2、thi

本文将带您了解关于ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼的新内容,同时我们还将为您解释thinkphp路由规则的相关知识,另外,我们还将为您提供关于laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试、Laravel、Yii、ThinkPHP性能测试、Laravel框架与ThinkPHP框架的不同、laravel框架与thinkPHP框架的区别的实用信息。

本文目录一览:

ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼(thinkphp路由规则)

ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼(thinkphp路由规则)

前言

读过一篇关于Zend Framework2的技术文章《ZF2多级树形路由Route配置实例》,是介绍路由配置的。我觉得很有意思,这是的需求:

/user对应用户列表页面 /user/:user_id对应用户的个人主页,比如 /user/Allovince 就对应Allovince用户的个人主页 /user/:user_id/blog/对应用户的博客列表页面,比如 /user/Allovince/blog 就会列出Allovince写过的Blog /user/:user_id/blog/:blog_id对应用户的一篇博客文章 方案引用自原文:

array( 'routes' => array( 'user' => array( 'type' => 'Segment','options' => array( 'route' => '/user[/]','defaults' => array( 'controller' => 'UserController','action' => 'index',),'may_terminate' => true,'child_routes' => array( 'profile' => array( 'type' => 'Segment','options' => array( 'route' => '[:id][/]','constraints' => array( 'id' => '[a-zA-Z0-9_-]+' ),'defaults' => array( 'action' => 'get' ),'child_routes' => array( 'blog' => array( 'type' => 'Segment','options' => array( 'route' => 'blog[/]','constraints' => array( ),'defaults' => array( 'action' => 'blog' ) ),'child_routes' => array( 'post' => array( 'type' => 'Segment','options' => array( 'route' => '[:post_id][/]','constraints' => array( 'post_id' => '[a-zA-Z0-9_-]+' ),'defaults' => array( 'action' => 'post' ) ),//profile child_routes end ),//profile end ),//user child_routes end ),//user end ),

看了这篇文章后,我打算使用我用过的PHP框架来实现这个路由需求。

ThinkPHP

新建一个ThinkPHP项目:

代码如下:
dist

命令行显示我安装的是3.2.2

Installing topthink/thinkPHP (3.2.2) 我看ThinkPHP官网最新稳定版本是3.2.3。

我特意去packagist官网查了一下,库中稳定版确实是3.2.2。

我得使用3.2.3。为什么我特别纠结这一点哩?因为:

3.2的路由功能是针对模块设置的,所以URL中的模块名不能被路由,路由定义也通常是放在模块配置文件中。 3.2.3版本开始增加全局路由定义支持,可以在项目的公共配置文件中定义路由。 也就是说,路由重写的部分是Controller和Action部分,Moudle还是存在。

我希望的是/user,而不是home/user。(ThinkPHP中默认Module是Home,'DEFAULT_MODULE' => 'Home',可以修改)

当然,这个问题也可以修改.htaccess文件的解决。但是,我还是决定安装3.2.3。

在ThinkPHP官网下载最新的包,解压。

使用浏览器访问一下项目的入口文件,让ThinkPHP自动生成了一个默认的应用模块Home。

修改公共配置文件tp\Application\Common\Conf\config.PHP:

rush:PHP;"> true,// URL访问模式,可选参数0、1、2、3,代表以下四种模式: // 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式 'URL_MODEL' => 2,// URL伪静态后缀设置,为空表示可以支持所有的静态后缀 // 使用U函数生成URL时会不带后缀 'URL_HTML_SUFFIX' => '',// URL变量绑定到Action方法参数,默认为true 'URL_ParaMS_BIND' => true,// URL变量绑定的类型 0 按变量名绑定 1 按变量顺序绑定,默认为0 'URL_ParaMS_BIND_TYPE' => 0,// 路由配置 'URL_ROUTE_RULES' => array( '/^url$/' => 'Home/User/url','/^user$/' => 'Home/User/index','/^user\/([a-zA-Z0-9_-]+)$/' => 'Home/User/show?name=:1','/^user\/([a-zA-Z0-9_-]+)\/blog$/' => 'Home/Blog/index?name=:1','/^user\/([a-zA-Z0-9_-]+)\/blog\/([0-9]+)$/' => 'Home/Blog/show?name=:1&blog_id=:2',); ?>

创建文件tp\Application\Home\Controller\UserController.class.PHP:

rush:PHP;"> PHP namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function url() { $name = 'jing'; $blogId = 1; $urls = array( U('/user'),U("/user/{$name}"),U("/user/{$name}/blog"),U("/user/{$name}/blog/{$blogId}"),); foreach ($urls as $url) { echo "
\n"; } } public function index() { echo '我是用户列表^_^'; } public function show($name) { echo "欢迎你,{$name}"; } } ?>

创建文件tp\Application\Home\Controller\BlogController.class.php:

{$url}访问:

输出:

代码如下:



访问上面4个链接,依次返回:

我是用户列表^_^ 欢迎你,jing 这是jing的博客列表 jing的这篇博客的id为1 下面其他框架,也同样输出以上内容。

Zend Framework 2

使用ZF2骨架程序创建一个ZF2项目:

composer create-project --stability="dev" zendframework/skeleton-application zf2

修改默认模块Application的配置文件zf2\module\Application\config\module.config.php:

array( 'routes' => array( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal','options' => array( 'route' => '/url','defaults' => array( 'controller' => 'Application\Controller\User','action' => 'url',// The following is a route to simplify getting started creating // new controllers and actions without needing to create a new // module. Simply drop new controllers in,and you can access them // using the path /application/:controller/:action 'application' => array( 'type' => 'Literal','options' => array( 'route' => '/application','defaults' => array( '__NAMESPACE__' => 'Application\Controller','controller' => 'Index','child_routes' => array( 'default' => array( 'type' => 'Segment','options' => array( 'route' => '/[:controller[/:action]]','constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*','action' => '[a-zA-Z][a-zA-Z0-9_-]*','defaults' => array( ),'user_list' => array( 'type' => 'Segment','options' => array( 'route' => '/user[/]','controller' => 'User','child_routes' => array( 'user' => array( 'type' => 'Segment','options' => array( 'route' => '[:name][/]','constraints' => array( 'name' => '[a-zA-Z0-9_-]+','defaults' => array( 'action' => 'show','child_routes' => array( 'blog_list' => array( 'type' => 'Segment','options' => array( 'route' => 'blog[/]','constraints' => array( ),'defaults' => array( 'controller' => 'Blog',) ),'child_routes' => array( 'blog' => array( 'type' => 'Segment','options' => array( 'route' => '[:blog_id]','constraints' => array( 'blog_id' => '[0-9]+','defaults' => array( 'action' => 'show',) ),'service_manager' => array( 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory','Zend\Log\LoggerAbstractServiceFactory','aliases' => array( 'translator' => 'MvcTranslator','translator' => array( 'locale' => 'en_US','translation_file_patterns' => array( array( 'type' => 'gettext','base_dir' => __DIR__ . '/../language','pattern' => '%s.mo','controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController','Application\Controller\User' => 'Application\Controller\UserController','Application\Controller\Blog' => 'Application\Controller\BlogController','view_manager' => array( 'display_not_found_reason' => true,'display_exceptions' => true,'doctype' => 'HTML5','not_found_template' => 'error/404','exception_template' => 'error/index','template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml','application/index/index' => __DIR__ . '/../view/application/index/index.phtml','error/404' => __DIR__ . '/../view/error/404.phtml','error/index' => __DIR__ . '/../view/error/index.phtml','template_path_stack' => array( __DIR__ . '/../view',// Placeholder for console routes 'console' => array( 'router' => array( 'routes' => array( ),); ?>

这个文件是骨架程序中自带的,我只是修改了router部分和controllers部分。要我写这么长的文件,那就太为难我了。这也是ZF官方发布了一个骨架程序的原因。

创建文件zf2\module\Application\src\Application\Controller\UserController.php:

url()->fromRoute('user_list'),$this->url()->fromRoute('user_list/user',array('name' => $name)),$this->url()->fromRoute('user_list/user/blog_list',$this->url()->fromRoute('user_list/user/blog_list/blog',array('name' => $name,'blog_id' => $blogId)),); $view = new ViewModel(compact('urls')); $view->setTerminal(true); return $view; } public function indexAction() { $view = new ViewModel(); // 禁用布局模板 $view->setTerminal(true); return $view; } public function showAction() { $username = $this->params()->fromRoute('name'); $view = new ViewModel(compact('username')); $view->setTerminal(true); return $view; } } ?>

创建文件zf2\module\Application\src\Application\Controller\BlogController.php:

params()->fromRoute('name'); $view = new ViewModel(compact('username')); $view->setTerminal(true); return $view; } public function showAction() { $username = $this->params()->fromRoute('name'); $blogId = $this->params()->fromRoute('blog_id'); $view = new ViewModel(compact('username','blogId')); $view->setTerminal(true); return $view; } } ?>

zf2不支持Action参数绑定,ThinkPHP不仅支持绑定,还支持2种绑定方式:按变量名绑定和按变量顺序绑定。

zf2中Action必须得返回视图,除非exit()。如果你知道可以禁用视图的办法,请告诉我。

创建文件zf2\module\Application\view\application\user\url.phtml:

" >

创建文件zf2\module\Application\view\application\user\index.phtml:

我是用户列表^_^ 创建文件zf2\module\Application\view\application\user\show.phtml:

欢迎你, 创建文件zf2\module\Application\view\application\blog\index.phtml:

这是的博客列表 创建文件zf2\module\Application\view\application\blog\show.phtml:

代码如下:的这篇博客的id为

Yaf

安装Yaf

使用代码生成工具创建Yaf项目

修改启动文件yaf\application\Bootstrap.PHP,修改其中的_initRoute方法:

getRouter(); $route0 = new Yaf_Route_Rewrite('url',array( 'controller' => 'User',array() ); $route1 = new Yaf_Route_Rewrite('user',array() ); $route2 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)#','action' => 'show',array(1 => 'name',) ); $route3 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog#',array( 'controller' => 'Blog',) ); $route4 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog/([0-9]+)#',2 => 'blogId',) ); $router->addRoute('url',$route0); $router->addRoute('user_list',$route1); $router->addRoute('user',$route2); $router->addRoute("blog_list",$route3); $router->addRoute("blog",$route4);

Yaf有路由功能,但是没有根据路由名生成URL的方法。所以我定义了一个项目名,用于拼接URL。

在配置文件中添加配置项yaf\conf\application.ini:

代码如下:

创建文件yaf\application\controllers\User.PHP:

rush:PHP;"> getConfig()->project->name; $urls = array( "/{$projectName}/user","/{$projectName}/user/{$name}","/{$projectName}/user/{$name}/blog","/{$projectName}/user/{$name}/blog/{$blogId}",); foreach ($urls as $url) { echo "
\n"; } return false; } public function indexAction() { echo '我是用户列表^_^'; // 禁用视图模板 return false; } public function showAction($name) { echo "欢迎你,{$name}"; return false; } }

创建文件yaf\application\controllers\Blog.php:

{$url} 代码如下:PHP class BlogController extends Yaf_Controller_Abstract { public function indexAction($name) { echo "这是{$name}的博客列表"; return false; } public function showAction($blogId,$name) { echo "{$name}的这篇博客的id为{$blogId}"; return false; } }

Yaf的Action支持参数绑定,是按变量名绑定的。$name、$blogId要和路由中配置的名称一样,而和参数顺序无关。

Laravel

新建Laravel项目:

代码如下:aravel --prefer-dist

清除合并文件。在目录laravel\vendor\下有个文件compiled.PHP,这个文件是为了减少IO提高框架性能,将很多类文件合并到一个文件中而生存的。在开发环境下,应该删除该文件,否则修改了一些文件发现没有效果,其实是因为文件已经合并缓存了。 清除命令:

代码如下:PHP artisan clear-compiled

在生产环境中应该开启,以提升性能:

代码如下:PHP artisan optimize --force

修改路由文件laravel\app\Http\routes.PHP:

代码如下: )); Route::get('/user',array('uses' => )); Route::get('/user/{username}',array('uses' => )); Route::get('/user/{username}/blog',array( 'as' => 'blog_list', 'uses' => , )); Route::get('/user/{username}/blog/{blogId}',array( 'as' => 'blog', 'uses' => , ))->where(array('blogId' => '[0-9]+'));

查看路由定义情况:

代码如下:PHP artisan route:list

输出:

代码如下:

定义路由变量全局模式,修改文件laravel\app\Providers\RouteServiceProvider.PHP中的boot方法:

代码如下:pattern('username','[a-zA-Z0-9_-]+');

parent::boot($router); }

创建UserController控制器:

代码如下:PHP artisan make:controller UserController

Laravel帮我们在laravel\app\Http\Controllers目录下创建了文件UserController.PHP,文件中已经为我们写好一部分骨架代码。修改文件laravel\app\Http\Controllers\UserController.PHP:

代码如下:PHP namespace App\Http\Controllers; use App\Http\Controllers\Controller; class UserController extends Controller { public function getUrl() { $name = 'jing'; $blogId = 1; $urls = array( url('/user'), action(,array($name)), route('blog_list', route('blog',array($name,$blogId)), ); foreach ($urls as $url) { echo "
\n"; } } public function getIndex() { echo '我是用户列表^_^'; } public function getShow($name) { echo "欢迎你,{$name}"; } }

创建BlogController控制器:

{$url} 代码如下:PHP artisan make:controller BlogController

修改文件laravel\app\Http\Controllers\BlogController.PHP:

代码如下:PHP namespace App\Http\Controllers; use App\Http\Controllers\Controller; class BlogController extends Controller { public function getIndex($name) { echo "这是{$name}的博客列表"; } public function getShow($name,$blogId) { echo "{$name}的这篇博客的id为{$blogId}"; } }

Laravel的Action也支持参数绑定,是按变量顺序绑定的,和变量名无关。

后语

我是Laravel粉,但是我也没有想黑其他框架的意思,大家有兴趣也可以用自己熟悉的框架来实现这个小例子,写了记得@我,语言不限。

以上所述就是本文的全部内容了,希望大家能够喜欢。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

总结

以上是小编为你收集整理的ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试

laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试

测试使用同一台机器、同一个数据库,同一个表,发现laravel语法和tp5语法相似度极高,而且性能也差不多,从数据上看tp5性能比laravel高一点点,但还没tp3高

请求5000次,并发200 laravel

Requests per second:    1655.54 [#/sec] (mean)每秒请求数(平均)越大越好
Time per request:       120.807 [ms] (mean)每次并发请求时间越小越好
Time per request:       0.604 [ms] (mean, across all concurrent requests)每次并发请求时间越小越好

thinkphp5

Requests per second:    1697.69 [#/sec] (mean)每秒请求数(平均) 越大越好
 Time per request:       117.807 [ms] (mean)每次并发请求时间 越小越好
 Time per request:       0.589 [ms] (mean, across all concurrent requests))每次并发请求时间 越小越好

laravel代码

模型



class DocumentArticle extends Model
{
    protected $table = ''document_article'';
    //
}

控制器


class IndexController extends Controller
{
    public function index(){

       $list =  DocumentArticle::all();


        return view(''index'', [''list'' => $list]);
    }

}

视图

@foreach ($list as $user)
   {{ $user->id }}:{!! $user->content !!}
@endforeach

测试结果

Server Software:        Apache/2.4.17
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /laravel/public
Document Length:        340 bytes

Concurrency Level:      200
Time taken for tests:   0.604 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      597000 bytes
HTML transferred:       340000 bytes
Requests per second:    1655.54 [#/sec] (mean)
Time per request:       120.807 [ms] (mean)
Time per request:       0.604 [ms] (mean, across all concurrent requests)
Transfer rate:          965.19 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       1
Processing:    33  107  17.7    113     131
Waiting:       33  107  17.6    113     131
Total:         34  108  17.7    114     131

Percentage of the requests served within a certain time (ms)
  50%    114
  66%    115
  75%    115
  80%    116
  90%    118
  95%    121
  98%    124
  99%    127
 100%    131 (longest request)

thinkphp5代码

模型



class DocumentArticle extends Model
{

}

控制器


class Index extends Controller
{
    public function index()
    {
        $list = DocumentArticle::all();
        $this->assign(''list'',$list);
        return $this->fetch(''index'');
    }
}

视图

{volist name="list" id="vo"}
{$vo.id}:{$vo.content}<br/>
{/volist}

测试结果

Server Software:        Apache/2.4.17
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /tp5/public
Document Length:        336 bytes

Concurrency Level:      200
Time taken for tests:   0.589 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      589000 bytes
HTML transferred:       336000 bytes
Requests per second:    1697.69 [#/sec] (mean)
Time per request:       117.807 [ms] (mean)
Time per request:       0.589 [ms] (mean, across all concurrent requests)
Transfer rate:          976.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       1
Processing:    33  106  17.5    110     132
Waiting:       33  106  17.5    110     132
Total:         34  106  17.5    110     133

Percentage of the requests served within a certain time (ms)
  50%    110
  66%    115
  75%    117
  80%    118
  90%    120
  95%    121
  98%    124
  99%    127
 100%    133 (longest request)
 

thinkphp3.2.3表现不错

Server Software:        Apache/2.4.17
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /onetk
Document Length:        331 bytes

Concurrency Level:      200
Time taken for tests:   0.528 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      579000 bytes
HTML transferred:       331000 bytes
Requests per second:    1893.83 [#/sec] (mean)
Time per request:       105.606 [ms] (mean)
Time per request:       0.528 [ms] (mean, across all concurrent requests)
Transfer rate:          1070.83 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       2
Processing:    27   95  15.5     99     121
Waiting:       27   94  15.5     98     121
Total:         28   95  15.5     99     121

Percentage of the requests served within a certain time (ms)
  50%     99
  66%    100
  75%    100
  80%    101
  90%    108
  95%    112
  98%    117
  99%    119
 100%    121 (longest request)

Laravel、Yii、ThinkPHP性能测试

Laravel、Yii、ThinkPHP性能测试

#主流PHP框架性能非权威测试

作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情。

ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情。不过很多第三方功能不需要自己写,众多大牛已经给铺好路了。

Laravel的话,传说写起来很爽扩展性也够,但是学习成本有点高,总不能给初级开发者半个月的时间去学习框架吧。而且据说江湖人士透漏,Laravel性能不怎么样,文档也并不是特别丰富。

Yii的话,语法有点啰嗦,前后端代码分离有点小麻烦,不过性能是非常好的,而且已经有众多国内大公司在使用了,出现意外可以快速的找到大牛答疑解惑。

不如做个简单的性能评测,选个性能出色的总不会出错

#性能测试 测试时间: 2016年05月06日

测试工具: siege (因为MAC系统的ab总是会出现 pr_socket_recv: Connection reset by peer (54) 的错误,所以选择了siege)

测试机器: MacPro Core i5 处理器/8GB内存/256GB SSD闪存

测试环境: Apache PHP5.6

框架版本: ThinkPHP 3.2.3 Laravel 5.2 Yii2.0.5

测试原则: 每次测试循环5次,取中等数据

补充说明: 所有项目都是让在子目录中

#结果说明 Transactions: 2119 hits 处理请求总数量 Availability: 96.85 % 可用性 Elapsed time: 9.74 secs 运行时间 Data transferred: 1.31 MB 数据传输量 Response time: 0.60 secs 响应时间 Transaction rate: 217.56 trans/sec 每秒处理效率 Throughput: 0.13 MB/sec 每秒处理数据 Concurrency: 130.28 并发 Successful transactions: 2162 成功的请求 Failed transactions: 69 失败的请求 Longest transaction: 2.85 最长的单个请求 Shortest transaction: 0.01 最短的单个请求 #开始测试

##增加一个控制器,并在控制器中输入10000次HelloWorld

并发50循环10次

首先向我们走来的是ThinkPHP,看上去还行

Transactions:		         500 hits
Availability:		      100.00 %
Elapsed time:		        2.81 secs
Data transferred:	       52.45 MB
Response time:		        0.26 secs
Transaction rate:	      177.94 trans/sec
Throughput:		       18.67 MB/sec
Concurrency:		       47.10
Successful transactions:         500
Failed transactions:	           0
Longest transaction:	        0.48
Shortest transaction:	        0.03

然后是Laravle,嗯,略微有些失望

Transactions:		         500 hits
Availability:		      100.00 %
Elapsed time:		       13.33 secs
Data transferred:	       52.45 MB
Response time:		        1.27 secs
Transaction rate:	       37.51 trans/sec
Throughput:		        3.93 MB/sec
Concurrency:		       47.55
Successful transactions:         500
Failed transactions:	           0
Longest transaction:	        3.64
Shortest transaction:	        0.07

最后赛前比较看好的Yii

Transactions:		         500 hits
Availability:		      100.00 %
Elapsed time:		        4.84 secs
Data transferred:	       52.45 MB
Response time:		        0.46 secs
Transaction rate:	      103.31 trans/sec
Throughput:		       10.84 MB/sec
Concurrency:		       47.65
Successful transactions:         500
Failed transactions:	           0
Longest transaction:	        0.88
Shortest transaction:	        0.04

并发200循环10次

首先是ThinkPHP

Transactions:		        1977 hits
Availability:		       98.85 %
Elapsed time:		       10.03 secs
Data transferred:	      207.40 MB
Response time:		        0.95 secs
Transaction rate:	      197.11 trans/sec
Throughput:		       20.68 MB/sec
Concurrency:		      187.68
Successful transactions:        1977
Failed transactions:	          23
Longest transaction:	        1.22
Shortest transaction:	        0.02

然后是Laravel

Transactions:		        1890 hits
Availability:		       94.50 %
Elapsed time:		       51.85 secs
Data transferred:	      198.27 MB
Response time:		        4.88 secs
Transaction rate:	       36.45 trans/sec
Throughput:		        3.82 MB/sec
Concurrency:		      178.00
Successful transactions:        1890
Failed transactions:	         110
Longest transaction:	       26.01
Shortest transaction:	        0.07

最后是Yii

Transactions:		        1996 hits
Availability:		       99.80 %
Elapsed time:		       18.95 secs
Data transferred:	      209.39 MB
Response time:		        1.79 secs
Transaction rate:	      105.33 trans/sec
Throughput:		       11.05 MB/sec
Concurrency:		      188.57
Successful transactions:        1996
Failed transactions:	           4
Longest transaction:	        3.29
Shortest transaction:	        0.10

没想到在没有优化的情况下,ThinkPHP的速度是最快的,Yii略微多一些,Laravel步履蹒跚的跑完了测试。结果是有些出人意料的,不过上述的测试只代表了开发环境,下面会对框架进行优化,模拟线上环境。

##优化框架 ThinkPHP:

APP_DEBUG改为false

Laravel:

APP_DEBUG改为false
php artisan route:cache
php artisan optimize
php artisan config:cache
composer dumpautoload -o

Yii:

YII_DEBUG改为false
composer dumpautoload -o

并发200循环10次

ThinkPHP

Transactions:		        1655 hits
Availability:		       82.75 %
Elapsed time:		        8.21 secs
Data transferred:	      173.62 MB
Response time:		        0.69 secs
Transaction rate:	      201.58 trans/sec
Throughput:		       21.15 MB/sec
Concurrency:		      139.29
Successful transactions:        1655
Failed transactions:	         345
Longest transaction:	        7.83
Shortest transaction:	        0.00

Laravel:

Transactions:		        1520 hits
Availability:		       76.00 %
Elapsed time:		       34.95 secs
Data transferred:	      159.45 MB
Response time:		        3.15 secs
Transaction rate:	       43.49 trans/sec
Throughput:		        4.56 MB/sec
Concurrency:		      136.84
Successful transactions:        1520
Failed transactions:	         480
Longest transaction:	       19.18
Shortest transaction:	        0.00

Yii:

Transactions:		        1704 hits
Availability:		       85.20 %
Elapsed time:		       15.16 secs
Data transferred:	      178.76 MB
Response time:		        1.46 secs
Transaction rate:	      112.40 trans/sec
Throughput:		       11.79 MB/sec
Concurrency:		      164.21
Successful transactions:        1704
Failed transactions:	         296
Longest transaction:	        9.04
Shortest transaction:	        0.00

###比较奇怪的一点,当框架关掉调试模式后都出现了较多失败的情况。不过明显的看到,Laravel进行简单的优化后,性能大大的提升了,但还是低于其他两个框架。

#结论

在测试的过程中,其他我的心情是沮丧的,感觉自己的三观世界已经崩塌了,崩塌至渣。

ThinkPHP的性能比Yii高出一倍,比Laravel高出近四倍 Yii的性能比较中庸,但是在测试中会明显发现请求失败的情况比其他两个框架要少 Laravel依旧优雅,不过性能堪忧,用网友的话形容比较好 学之者生用之者死

#最后

我的项目最后使用了自建框架进行开发,得益于composer的强大,开发的过程非常顺利,最后附上自有框架在200并发10次循环的数据,框架开源但是更新比较忙,欢迎在github上搜索PPPHP,和我一起搭建框架。

Transactions:		        1672 hits
Availability:		       83.60 %
Elapsed time:		        6.18 secs
Data transferred:	      175.40 MB
Response time:		        0.57 secs
Transaction rate:	      270.55 trans/sec
Throughput:		       28.38 MB/sec
Concurrency:		      153.16
Successful transactions:        1672
Failed transactions:	         328
Longest transaction:	        4.57
Shortest transaction:	        0.01

Laravel框架与ThinkPHP框架的不同

Laravel框架与ThinkPHP框架的不同

作为一个PHP菜鸟初学Laravel框架 在学习过程中我发现了其与TP框架的不同点,由于时间问题和认识还不够完善我先写出其中几点,有错误的地方希望各位大牛斧正...      

    1.渲染模版方式的不同:在Laravel框架里,使用return view()来渲染模版;而ThinkPHP里则使用了$this->display()的方式渲染模版;

    2.在实际开发中我们常常遇到这样的问题,就是开发地点不固定,这就造成了我们需要频繁的更改数据库配置,给开发工作造成了麻烦,TP依然没有避免这个"灾难";在laravel框架中,.env环境文件的出现解决了这个麻烦,我们只需要在不同的工作地点配置好.env文件就不避再进行配置,因为无论是git还是svn " .env是不会随着文件一起提交到服务器的";

    3.Laravel框架提供了大量的闭包,作为菜鸟的我目前只使用了use方法,即如何在函数内部使用外层变量

    

    

    4.post传值中注意点不同:在Laravel框架里,由于其考虑到了跨站攻击, 所以如果使用form表单以post方式进行传值时,如果不再form表单中加入{{csrf_field()}}则会报出TokenMethodnotfound的语法错误;而TP框架则需要自己手动完成防止跨站攻击的代码;

    

    5.条件判断语句书写方式的差异:Laravel框架里 if else判断语句和foreach语句 书写时必须以@if开头  以@endif结尾,如果没有则报语法错误,@foreach @endforeach同理;而TP框架则和PHP语法规则使用方式一致直接ifesle语句判断和foreach循环遍历

    

    6.Laravel里内置了大量的方法供开发者使用,在实际应用中更接近于"让对象完成一切"的开发思想,比如在后台表单验证的时候,Laravel内置了大量的验证方法,例如对用户名的验证:我们使用可以validate方法里''username''=>''required''(不能为空)|alpha_dash(必须数字字母下划线)|between:6,18(在多少位数之间);还内置了例如email;same:字段名;diff:字段名等大量的方法极大的提高了开发速度;

    

    代码有待完善  只是实验用

    7.加密方式

      在TP框架中 我们对用户名密码进行加密时使用md5();的方式进行加密,但md5的缺点在于其可以逆向破解,而且在同等规则下同样的密码md5加密出的字符串是有可能出现相同的,这就降低其安全性;但在Laravel框架中内置了"哈希"Hash加密单向加密方法,且同样的参数加密出的字符串是绝对不会出现相同的情况 这就提高了安全性

 

在经过了一段时间的开发后,我对Laravel框架的认识又在逐步的加深,对于这个世界占有量NO.1的框架...  我想说,我已经在逐步的感受到他的恐怖之处...

   8.建表--Laravel在数据库建表上有自己独立内置的结构,可以完全不用借助原生SQL语句或者SQLyogEnt、Navicat 这样的建表工具,进行数据库的建立,增删改查,和数据交互;我想这可能是它牢牢占据NO.1的一大靓点;在ThinkPHP中则需要我们借助SQL语句或者建表工具去逐步完善数据

    8.1.首先我们需要建立模型:我用的是gitbash,gitbash是Windows下的命令工具,基于msys GNU环境,有git分布式版本控制工具,主要应用于git.但是在Laravel里也可以直接使用     php artisan  make:model Models/GoodsModel -m 完成模型的创建和建表结构的创建(/database/migrations)

    

    8.2.向goods数据表填充数据,要注意数据的类型是严格区分的,并且一定要加..编程之友:注释君;添加完后使用php artisan migrate命令完成表的创建;可以自行YY下 多表同时创建的那种"还有谁"的感觉;

Schema::create(''goods'', function (Blueprint $table) {
$table->increments(''id'')->comment(''商品主键'');
$table->string(''title'')->comment(''商品的标题'');

    

    8.3.假设某个字段不符合要求或者需要添加字段怎么办,无须担心,从github中pull下项目后在数据表里直接修改  只需要用php artisan migrate:refresh

    ,然后今天的工作结束后push到github库里,其他小伙伴在更新后就可以直接使用新的数据表结构,而且还可以看到更改记录...这是开发者的一大福音~~

  9.ORM---在介绍建表时已经使用了创建模型的命令,php artisan make:model  XXX;Laravel里模型是对面向对象开发思想最好的诠释,让对象帮我们完成需求;

    摘自5.1手册:(Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库进行交互。每个数据库表都有一个对应的「模型」可用来跟数据表进行交互。你可以通过模型查找数据表内的数据,以及将记录添加到数据表中。)

    本人在实际使用中也实实在在的感受到了通过创造模型对数据表操作带来的便利,譬如批量赋值,跨表查询,删除模型和软删除,模型关联,当然这些在TP框架中也可以利用模型实现,这一点属于仁者见仁智者见智;根据个人喜好而定

  10:session的用法

    10.1.ThinkPHP对Session操作进行了封装,并且无需引入就可以使用,Session的启动会在应用初始化的时候自动执行,所以无需手动使用Session::start() 来启动Session。
            使用Session类操作和普通方式调用$_SESSION来操作并没有本质不同,只是Session类很多参数可以根据项目配置来灵活设置,最常用的操作方法示例: // 检测Session变量是否存在:Session::is_set(''name'');  // 给Session变量赋值:Session::set(''name'',''value'');// 获取Session变量:Session::get(''name'');
    10.2.Laravel中Session的常用方法有
    $request->session()->get(''key'');//获取session里的某个键名
    $request->session()->set(''key'',''default'');//设定一个默认值,当指定键名不存在便返回默认值
    $request->session()->all()返回所有数据
    session(''k''=>$v)写入session保存数据;
    以及闪存数据session()->flash();和保留特定数据->keep(['''','''']);

    也可以自定义session驱动

  转自:麦先生     博客地址:http://www.cnblogs.com/maixiansheng

laravel框架与thinkPHP框架的区别

laravel框架与thinkPHP框架的区别

laravel框架与thinkPHP框架的区别

主要区别:

1.渲染模版方式的不同:

在Laravel框架里,使用return view()来渲染模版;

而ThinkPHP里则使用了$this->display()的方式渲染模版;

2.在Laravel框架里,由于其考虑到了跨站请求伪造, 所以如果使用form表单以post方式进行传值时,如果不再form表单中加{{csrf_field()}}则会报出TokenMethodnotfound的语法错误;

而TP框架则需要自己手动完成防止跨站攻击的代码;

3.Laravel是一个重路由的框架(5.4),所有的功能都是由路由发起的,哪怕没有控制器方法,只要写了路由就能够访问,thinkPHP(3.2),必须要有控制器方法才能正常访问;

4.laravel具有强大的社区化扩展,(composer扩展自动加载);

5.laravel具有强大的Blade模版引擎;

6.中间件,Laravel特点,可以实现访问前后的处理,例如请求和返回,权限认证等;

7.条件判断语句书写方式的差异:

Laravel框架里 if else判断语句和foreach语句 书写时必须以@if开头 以@endif结尾,如果没有则报语法错误,@foreach@endforeach同理;而TP框架则和PHP语法规则使用方式一致直接ifesle语句判断和foreach循环遍历

8.Laravel里内置了大量的方法供开发者使用,在实际应用中更接近于让对象完成一切的开发思想,比如在后台表单验证的时候,Laravel内置了大量的验证方法,例如对用户名的验证:我们使用可以validate方法里'username'=>'required'(不能为空)|alpha_dash(必须数字字母下划线)|between:6,18(在多少位数之间);还内置了例如email;same:字段名;diff:字段名等大量的方法极大的提高了开发速度;

9.加密方式 在TP框架中 我们对用户名密码进行加密时使用md5();的方式进行加密,但md5的缺点在于其可以逆向破解,而且在同等规则下同样的密码md5加密出的字符串是有可能出现相同的,这就降低其安全性;但在Laravel框架中内置了哈希Hash加密单向加密方法,且同样的参数加密出的字符串是绝对不会出现相同的情况 这就提高了安全性;

10.在实际开发中我们常常遇到这样的问题,就是开发地点不固定,这就造成了我们需要频繁的更改数据库配置,给开发工作造成了麻烦,TP依然没有避免这个灾难;在laravel框架中,.env环境文件的出现解决了这个麻烦,我们只需要在不同的工作地点配置好.env文件就不必再进行配置,因为无论是git还是svn .env是不会随着文件一起提交到服务器的;

相关推荐:《TP5》《laravel》

我们今天的关于ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼thinkphp路由规则的分享就到这里,谢谢您的阅读,如果想了解更多关于laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试、Laravel、Yii、ThinkPHP性能测试、Laravel框架与ThinkPHP框架的不同、laravel框架与thinkPHP框架的区别的相关信息,可以在本站进行搜索。

本文标签: