原文详见:http://www.ucai.cn/blogdetail/7031?mid=1&f=12
可以在线运行查看结果哦
一、框架课程总结
框架、设计模式和队列是5月份公开课的三个主题,第一周讲设计模式,第二、四周讲框架,第三周讲队列。框架讲了两周,介绍了框架的概念、PHP框架的应用范围,以及常用的PHP框架,今天是框架的最后一讲,是对整个框架系列课程的汇总,同时和大家讨论一些框架之外、或者框架之下的技术。
今天要讨论的分为这几个方面,总结框架系列课程、探讨框架可能存在,或者解决不了的问题,以及其解决方案和当前的探索。
在框架第一讲中,志华老师也站得高度很高,讲述了框架、架构的概念,以及对比了它的异同。总结来讲就是架构涉及到的是一个产品的性能、可扩展性之类问题。而框架则涉及到一个产品在实际的实现过程之中,所用的技术方案。比如性能和可扩展性,也就是架构所关系的内容,和底层语言其实关系不大。无论是PHP语言,还是Ruby语言,来实现一个大型网站,后端都可以部署数据库,数据库有主从,都需要缓存,缓存都可以是Memcached,数据库可以是MySQL。而框架则是我们做一个产品实现所用的具体技术实现方案,不但跟语言本身关系密切,而且涉及到在开发中的具体开发方案。打一个比喻,建造一个开发区。架构就是图纸,水、电、暖布局、楼盘、商业布局、容量布局,而框架则是细化的实施方案,这个写字楼是板楼还是塔楼,是做写字楼还是做酒店,前者与材料外观无关,后者则与材料外观相关。
再在后面的课程中,我们分别了解了Durpal、Symfony、ThinkPHP、YII、ZendFramework等框架的用法与扩展。
通过对框架的学习,我们认识到各自的框架都有自己的优势,使用框架带来了巨大的便利,比如很快构建起一个脚手架,英文叫Skeleton,有很多可用的方便工具和函数。当然,学习一套框架有成本,使用一套框架更有约束。也能看到框架的作用,可以归结为如下几点:
1、快速构建的脚手架,而不是从零开始
2、一套共同的约束和规则,保证开发质量。
3、工具和函数库、共同认识,无疑提高了开发效率
二、跳出PHP应用开发框架看框架
但是?今天我们从两个层次来看讨论问题。
第一个层次是高级的层次,我们简单看一下。在前面讲的,都基于PHP的应用开发框架而展开,即使我们讲了这么些框架,但这些框架也只是小部分代表,如果只站在应用的这个层次再多讨论也没有太大的意义。我们要跳出来看,就像, 框架就是在应用开发这个层次吗?就只讨论PHP语言吗?他们的共同特点在哪里?
框架并不是局限于某个特定语言、或者特定用途东西。比如我们讲Web 开发框架,这个Web开发框架,可以是PHP的,也可以是Ruby语言写的,像Ruby on rails,甚至最近流近的 go 语言,也开始有自己的 Web开发框架,甚至还有用 C语言去写的。而框架也不仅限于Web开发或者网站功能开发,有测试框架,像PhpUnit,JUnit这样的软件。像Thrift、ICE这样的,属于分布式通信框架。
共同特点,有几点:
1、都提供了自己领域内较完整强大的功能。(区别于函数库,比函数库更综合,更完整)。
2、都提供了自己领域内功能较具体的实现。(区别于架构这个较虚的概念)。
3、但是提供的是一些规范、脚手架。(区别于现成的产品,这只是一个特定领域的半成品)。
三、框架可能或者带来的问题
了解了框架在整个编程开发领域,大面上的感性认识,我们具体来探讨这两周公开课下来,框架所不能解决的问题。这是第二个层次,是更深入的层次。
1、第一个问题,就是开发习惯上的问题。如果团队决定采用一个框架。特别是全新的框架,就比较费劲了,可能还得有一个正式的培训阶段。
2、第二个问题,框架都有其适用的场景,需要架构师需要在什么阶段在合适的时候,采用合适的框架。
3、第三个问题,性能问题。大部分的框架,都用到了一些复杂的规则,比如ORM、比如模板引擎,这些东西,天生就是比较低效,尤其是像PHP这样的动态脚本语言。在企业系统、小流量的时候,还好,但是如果进入大流量时期,这个性能问题,就不容忽视了。
4、第四个问题,是扩展性问题。比如流量大了,数据库后端,也不再是一个数据库了,同一个数据类型也不再是一个数据表了。这个时候,框架有些地方,就该动动了。ThinkPHP那一讲上分享了这样的问题。
四、PHP性能的改进手段
好的,那我们来看一下,PHP业界,在提高框架性能、或者者整个PHP性能问题上,所做的一些探索。这也是我们今天的重点。
那么,我们想一想,你想提高PHP程序的效率,可以做哪些尝试?另外还有一个意思的事情是,你觉得,谁对提高 PHP程序的效率,最有动力?
第一、我们知道,PHP很容易写出很低效的程序,数据库频繁重连。写的查询很低效。某个函数实现,可能有问题等等。那么这些问题,需要有一个很好的手段去发现。这个时候,一个神器诞生了。这就是XHProf。XHProf是谁出的呢?Facebook,这是我们刚才讲的谁最有动力来提高PHP效率呢,谁在大规模的环境下,经常使用PHP,就最有动力。Facebook就最有这个动力了。
第二、上面讲的是第一个层次,先把PHP语言本身的一些东西给优化了。把第一个层次应用到框架上,就是我们通过XHprof可能发现了框架的一些性能瓶颈。第二个层次呢?我们再反问一下,提高程序性能最有效的方式是什么?我相信大部分同学都会提一个手段,缓存。没有错,第二个提升的层次就是缓存,
我们将模板编译,是一种缓存方式,或者在库中,支持一些外部缓存,比如ThinkPHP 就是一个很典型的例子,支持模板编译缓存。也支持大量预置的Cache函数库。
第三个层次,有人就想了,PHP这种动态的脚本语言,在每一次运行时都是现编译解析,有没有一些办法,把这个每次编译解析的过程省了。这其实也经过了两个步骤。在CGI时代,每一个PHP页面的运行,所有的PHP模块都需要重新加载。每一个程序都有这个加载过程其实很浪费的。
因此就进入了mod_php 这个阶段,就是这张图
而再到后来改进成这张图,
再到后来,人们从PHP本身的编译过程上再省一步,加进了opcache,就是opcode 的cache,就是从PHP脚本编译成为操作码的缓存,这样的话,对程序,省去了第一个编译环节。
就成了这一张图
上面虚线的部分,就是缓存住了的,一个脚本只执行一次编译,后面的调用,都共享第一次编译所留下来的opcode缓存,APC就是一个实现opcode缓存的框架,同类的还有XCache,eAccelerator,我们今天的例子是用的zend opcache。
上面说了这么多,这还只是第三个层次,其实还有三个层次的手段。
第四个层次,是将核心的,有瓶颈的业务逻辑,转到后端去实现。也就是说不用PHP了,举一个典型的例子,就是分库分表,连接池这样的功能,当然,分库分表,我们可以采用PHP来实现,但是连接池这样的功能就比较费劲一些了。所以一般对于一个高效的分布式架构来讲,这种逻辑会有一个DB Proxy,来管理着客户端对服务器的长连接,PHP本身不再直接连接数据库,而是连接这个代理,由这个代理,来实现多表查询等操作。这里只是举一个例子。比如我们讲的缓存,甚至KVDB、全文检索,估计也有朋友写过PHP版存储和引擎,但是实际上在现实的使用中,还是更多的使用后端的服务。
第五个层次,就是一些大神出来了,他们受不了传统PHP,PHP框架的低效,开发模块,开发模块化的PHP框架。这个比较好理解。模块嘛,C语言实现,编译成二进制共享库,从Web Server一启动就预加载。所以必然会高效一截。今天我们来看看Yaf、Phalcon这两C写的框架。也正好呼应咱们框架总结的这个主题。
第六个层次,我就该来问了?是不是PHP本身也是非常陈旧和低效了,是不是有改进的空间,甚至PHP重新用不一样的思路实现,可行不可行?这个问题,后面慢慢道来。
好的,是不是感觉有了一种全新的视角?我们回过来看看这些改进,在实际生产中的实现。
五、PHP性能改进在生产中的实践
5.1、XHProf
首先来看一下XHProf这个工具,怎么能改进我们的PHP语言本身。
首先安装这个工具,就是模块化安装。
我们封装一下操作类。
<?php /** * 优才网公开课示例代码 * * XHProf 封装类 * * @author 伍星 * @see http://www.ucai.cn */ class XHProf { public function __construct() { // start profiling $XHPROF_ROOT = "/home/wwwroot/ucai_app/samples"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; } public function beginProf() { xhprof_enable(); register_shutdown_function('XHProf::endProf'); } public function endProf() { $xhprof_data = xhprof_disable(); $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo"); echo "<a href=\"http://samples.app.ucai.cn/xhprof_html/index.php?run=$run_id&source=xhprof_foo\">性能分析结果</a>"; } }
值得注意的是这句话:
register_shutdown_function('XHProf::endProf');
什么意思呢,就是在整个页面完成了之后,输出结果报表链接。
5.2 、Opcache的安装与配置
其次我们来看看 opcache,安装过程没有什么讲的,主要是推荐一个配置,并且需要强调,opcache不是PHP extension,是zend extension, 所以非常容易出错。配置如下:
[opcache] zend_extension="/usr/local/php/lib/php/extensions/no-debug-zts-20090626/opcache.so" opcache.enable_cli=1 opcache.memory_consumption=128 //共享内存大小, 这个根据你们的需求可调 opcache.interned_strings_buffer=8 //interned string的内存大小, 也可调 opcache.max_accelerated_files=4000 //最大缓存的文件数目 opcache.revalidate_freq=60 //60s检查一次文件更新 opcache.fast_shutdown=1 //打开快速关闭, 打开这个在PHP Request Shutdown的时候 // 会收内存的速度会提高 opcache.save_comments=0 //不保存文件/函数的注释
5.3、Yaf和Phalcon
再次来看两个C语言写的PHP框架
第一个介绍的是Yaf 框架,这是一个纯C语言框架。具体的安装过程和实验如下:
1、从github 下载 php-yaf https://github.com/laruence/php-yaf
2、解压,按PHP模块的编译手法编译
phpize
./configure --with-php- /usr/local/php/bin/php-config
make
make install
3、在php.ini 中配置
extension = "yaf.so"
yaf.environ="product"
4、通过命令行上执行 php –m|grep yaf 你就能看到模块已经安装好了。
5、余下的就是Web测试。
在源码目录下,找到
php-yaf-master/tools/cg
./yaf_cg ucai_gkk
6、将output 目录下的 ucai_gkk 移至 samples.app.ucai.cn 所在的目录下,就可以通过 http://samples.app.ucai.cn/ucai_gkk
来访问。
7、我们可以做一下改造实验,了解一下这个框架的基本结构。
大家可以看到,我只是一通过一个工具,就生成了整个程序的框架,就可以根据需要,添加自己的业务逻辑。
比如 ,在models/Sample.php 中增加一个方法,
public function selectProductSample() { return "<h1>Hello Haha</h1>"; }
在 views 目录下新建文件,product/index.phtml
<?php /** * 优才网公开课示例代码 * * Yaf 视图 * * @author 伍星 * @see http://www.ucai.cn */ echo $content, " I am ", $name, " From Product"; ?> 在controllers 目录下建立 Product.php <?php /** * 优才网公开课示例代码 * * Yaf 控制器 * * @author 伍星 * @see http://www.ucai.cn */ /** * @name IndexController * @author root * @desc 默认控制器 * @see http://www.php.net/manual/en/class.yaf-controller-abstract.php */ class ProductController extends Yaf_Controller_Abstract { /** * 默认动作 * Yaf支持直接把Yaf_Request_Abstract::getParam()得到的同名参数作为Action的形参 * 对于如下的例子, 当访问http://yourhost/hello/index/index/index/name/root 的时候, 你就会发现不同 */ public function indexAction($name = "Product") { //1. fetch query $get = $this->getRequest()->getQuery("get", "default value"); //2. fetch model $model = new SampleModel(); //3. assign $this->getView()->assign("content", $model->selectProductSample()); $this->getView()->assign("name", $name); //4. render by Yaf, 如果这里返回FALSE, Yaf将不会调用自动视图引擎Render模板 return TRUE; } }
这样我们就可以通过,http://samples.app.ucai.cn/hello/?a=index&c=product
这样的链接来访问,我们新建的内容了。操作起来很简单。
用同样的方式,我们安装Phalcon。虽然从形式上,它更简单。通过目录就知道,内容更为丰富。
这也是Yaf跟Phalcon的很大的不同之处,Yaf尽管效率很高,但是要在生产上使用,还是略显单薄,功能不够丰富。而Phalcon则真的是功能很全的。正像优才网培养的叫全栈工程师,而Phalcon也号称自己是Full Stack 的一个框架。
这次,没有工具来生成一个基本的框架,但是我们可以从Github上的一个教程,作为切入点。
https://github.com/phalcon/tutorial
下载了这个教程之后,我们就可以开始动手了。先看看功能 。
放到相应的目录下之后,比如 http://samples.app.ucai.cn 目录下之后,得配置一下rewrite 规则。
rewrite ^/phalcon/(.*?)$ /phalcon/public/index.php?_url=/$1 last;
rewrite ^/phalcon$ /phalcon/public/index.php last;
然后,通过 http://samples.app.ucai.cn/phalcon/ 可以访问。
发现有一个注册功能,那我们就来想这个数据怎么保存的。
发现在 public/index.php 中有一段配置,
//Set the database service $di->set('db', function() { return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "127.0.0.1", "username" => "xxxx", "password" => "xxxxx", "dbname" => "xxxxxx" )); });
我们在这里改了配置了之后,再看看提交的情况。
发现在SignupControll.php 中有一段保存代码 ,
$user = new Users(); $user->name = $name; $user->email = $email; //Store and check for errors if (($userid = $user->save()) == true) { echo 'Thanks for register!'; } else { echo 'Sorry, the next problems were generated: '; foreach ($user->getMessages() as $message) { echo $message->getMessage(), '<br/>'; } }
过去看这个 models/Users.php 却是空的?
我们在不修改Users.php的时候,看看是否能将数据保存进去?
当然前提是建一个表,因为我怀疑,这存在某种关系 的映射。
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(70) NOT NULL, `email` varchar(70) NOT NULL, PRIMARY KEY (`id`) );
发现果不其然,保存进去了,好,我们再进一步,找一现实中可能会用的表格格式,比如下划线的表格 users_exinfo。
CREATE TABLE `users_exinfo` ( `id` int(10) unsigned NOT NULL default 0, `schoolname` varchar(70) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`) );
看看能否实现保存,于是乎也建了一个空类。
class UsersExinfo extends Phalcon\Mvc\Model{ }
同时也修改了视图,将数据保存了进去。
结果如下:
大家看到,成功地保存了数据。
相关推荐
### Java开源框架集总结 #### 一、Spring Framework:强大的J2EE开发框架 Spring框架是一种广泛使用的开源框架,主要用于解决J2EE开发中的常见问题。该框架通过提供一种一致的方式来管理业务对象,并且鼓励开发者...
根据提供的文件信息:“JAVA开源框架学习文档”,我们可以深入探讨与JAVA开源框架相关的多个知识点,包括但不限于框架的选择、安装配置、核心概念以及实际应用场景等。由于提供的具体内容为空,本篇文章将基于标题和...
总结来说,这篇论文详细讨论了基于PHP开源框架(尤其是dedeCMS和CI)的动态网站设计与开发,展示了如何利用这些工具和技术构建一个功能完善的CMS系统,并强调了其在当前网络环境下对企业的重要意义。通过深入研究和...
为了应对这一需求,开发者社区推出了一些开源框架,这些框架使得Android应用能够轻松地处理SVG文件。本文将详细介绍一个名为“svg-android”的开源框架,它为Android提供了SVG支持。 首先,svg-android框架允许...
本文将深入探讨一款基于.NET Framework和C#语言的开源框架——NFox,它为Cad的二次开发提供了强大的支持。 NFox框架的设计理念是提供一个易用、高效且功能丰富的平台,使得开发者能够快速构建出与CAD系统紧密集成的...
### 基于开源框架Flask的教务系统的设计与实现 #### 1. 教务管理系统的重要性 教务管理是高校日常管理的核心部分之一,它不仅涉及学校的教学活动安排,还包括学籍管理、课程设置、成绩记录等多方面的工作。随着...
总结来说,Jeesite开源框架凭借其代码生成的特性,模块化的设计,以及基于成熟技术栈的选择,成为了IT开发领域的一款高效工具。它不仅节省了开发时间,还提高了代码质量,让程序员能够更好地聚焦于业务创新,推动...
总结来说,Jaws是一个功能全面、易用且灵活的PHP开源框架,适合用于快速构建动态网站。其开源性质鼓励了开发者社区的参与和创新,通过多样化的模块化设计和强大的内容管理系统,Jaws成为了开发高效Web应用的有力工具...
总结来说,JavaEE三大框架的课程设计涵盖了Web应用开发的重要方面:Struts2负责请求处理和视图展现,Spring提供依赖管理和事务控制,Hibernate则处理数据持久化。通过学习和实践,开发者能够构建出结构清晰、易于...
【Tapestry开源框架详解】 Tapestry是一个基于Java的Web应用框架,它与流行的Struts框架进行全方位对比,展示了其独特的特性和优势。Tapestry的核心理念是通过对象、方法和属性替换URL和查询参数,以此简化Web应用...
"tpframe开源框架"是一个专为高效开发API接口、移动WAP网站、微信应用以及传统PC站点设计的PHP框架。这个框架基于ThinkPHP,一个在中国广泛使用的轻量级MVC(模型-视图-控制器)框架,具有高度的灵活性和可扩展性。...
【基于轻量级开源框架的科研论文管理系统设计与实现】 本文主要探讨了如何利用轻量级开源框架构建高效、安全的科研论文管理系统。系统设计基于经典的MVC(Model-View-Controller)模式,采用Struts作为核心开发框架...
Java 开源框架是开发者在构建应用程序时常用的工具,它们提供了许多功能,可以帮助简化开发过程,提高效率。Apache Commons 是一个著名的 Java 开源项目,由多个模块组成,提供了大量的实用工具类和组件。以下是对 ...
本文将详细探讨“机智云开源框架智能家居系统”,这是一个基于机智云平台的安卓开源项目,旨在创建一个简易的智能家庭环境,其中包括温湿度监测、灯光控制以及人体与有毒气体检测等功能。核心控制器是ESP8266微处理...
JavaScript MVC开源框架是一种用于构建富前端应用的框架,它整合了多种JavaScript库和技术,如jQuery,使得开发者可以更高效地组织和管理前端代码,实现Model-View-Controller(MVC)设计模式。在这个"第二部分"中,...
ASP.NET MVC(Model-View-Controller)是微软提供的一款用于构建Web应用程序的开源框架,它基于模式驱动的架构,允许开发者在模型、视图和控制器之间实现松散耦合。该框架提供了高度的可测试性、灵活的URL路由、以及...
【开源框架下WebGIS的设计与实现】 WebGIS(Web Geographic Information System)是一种基于Web的地理信息系统,它将地理数据和信息处理集成在一个统一的平台上,为用户提供地理信息的访问和服务。传统的WebGIS可能...
### 开源搜索框架Lucene介绍 #### 一、Lucene简介 Lucene是一款非常优秀且成熟的开源全文索引检索工具包,它完全采用Java语言编写,由Doug Cutting于1999年创建,并于2001年10月捐赠给了Apache基金会,成为Apache...