`
cyber4cn
  • 浏览: 37863 次
社区版块
存档分类
最新评论

各开源框架使用与设计总结(一)

阅读更多

原文详见: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{
   
}
 

 

 

 

同时也修改了视图,将数据保存了进去。



 结果如下:

 

 

 大家看到,成功地保存了数据。

 

 

  • 大小: 14.9 KB
  • 大小: 265.9 KB
  • 大小: 380.4 KB
  • 大小: 805 KB
  • 大小: 15 KB
  • 大小: 14.4 KB
  • 大小: 59 KB
分享到:
评论

相关推荐

    C# socket 框架例程

    本文介绍的EMTASS 2.0 是笔者一段工作的总结,也是学习基于.NET的类设计、组件设计、模式设计等的一个小结。笔者的目标就是不断修改和完善,设计与实现一个可靠与稳定的、有良好可扩展性的和易于使用的Socket数据包...

    GuozhongCrawler的是一个无须配置、便于二次开发的爬虫开源框架.zip

    其设计灵感来源于多个爬虫国内外爬虫框架的总结。采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线… 爬虫(Web Crawler)是一种自动化程序,用于从互联网上...

    毕设&课设&项目&实训-无须配置、便于二次开发的爬虫开源框架,它提供简单灵活的API.zip

    无须配置、便于二次开发的爬虫开源框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫。其设计灵感来源于多个爬虫国内外爬虫框架的总结。采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面...

    计算机组成原理实验报告,硬件结构设计,RISC-V,SoC,picoRV32

    本次课程设计要求基于开源的RISC-V 核——picoRV32 搭建一个完整的 SoC(片上系统),并在自己搭建的 SoC 之上进行软件编程,体会硬件设计与软件编程的结合。 RISC-V-On-PYNQ Overlay实现了在PYNQ-Z2板上的RISC-V...

    深入浅出设计模式 完整扫描版

     所有章节都是先通过具体的示例讲解为什么需要使用某个设计模式,然后讲解该模式的实现原理,最后再通过详细的示例或对很多开源框架进行分析,加深读者对设计模式的理解。  《深入浅出设计模式》适用于中、高级...

    深入浅出设计模式

    《深入浅出设计模式》总结了许多系统软件在...所有章节都是先通过具体的示例讲解为什么需要使用某个设计模式,然后讲解该模式的实现原理,最后再通过详细的示例或对很多开源框架进行分析,加深读者对设计模式的理解。

    基于Java的京东电商系统的设计与实现.docx

    23 4.6.4 提交订单 24 4.7 本章小结 24 第5章 系统测试 25 5.1 界面测试 25 5.2 功能测试 25 5.3 本章小结 27 总结与展望 28 基于Java的京东电商系统的设计与实现全文共29页,当前为第4页。基于Java的京东电商系统的...

    竞赛资料源码-全国人工智能创新应用大赛-MindSpore开源框架工程化应用专题赛-遥感图像耕地识别.zip

    源码与竞赛资料:教育部认可的大学生竞赛备赛资料代码、源码、竞赛总结。 功能与质量保证:这个资源库是一个宝贵的学习平台,有助于他们深入了解计算机技术的原理和应用。这些源码经过测试和验证,可以直接运行,...

    86丨开源实战四(下):总结Spring框架用到的11种设计模式1

    在第 51 节课中,我们讲到,适配器其中一个作用是“统一多个类的接口设计”。利用适配器模式,我们将不同方式定义的 Controller 类中的函数,适配为统一的

    springboot基于springboot框架的企业合同管理系统设计与实现.zip

    总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...

    开源GIS视频教程优化版

    2、通过对典型开源GIS项目的分析,重点学习GIS设计的基本内容:项目规划,组织管理,系统设计,编码技能和系统测试与维护 3、通过典型模式分析,掌握设计模式在GIS项目中的使用原则和方法以及技巧,难点是分析设计...

    java三大框架

    而现在比较流行开源框架,主要是struts,hibernate,spring等 比如struts是在原有mvc基础上实现在代码分离等功能,非常好用。 而hibernate可以把我们的关系型数据库转换成我们在JAVA中的面像对像来使用。从而让我们在...

    软件技术专业本科毕业设计基于WebGIS的物流信息系统的设计与实现

    2.5 本章小结 12 第3章 需求分析 13 3.1 系统实现目标 13 3.2 系统运行环境 13 3.3 系统的开发环境 14 3.4 功能性需求描述 14 3.4.1 发送货物 15 3.4.2 查询货物状态 16 3.4.3 提货 16 3.4.4 查询系统信息 16 3.4.5 ...

    dubbo协议、netty框架总结

    Dubbo是一个开源的分布式服务框架,旨在帮助开发人员快速而简单地设计分布式应用程序。Dubbo基于服务端-客户端模型,实现了基于可扩展的协议和服务的动态伸缩以及安全性等特性。Dubbo协议以及Netty框架是Dubbo的两个...

    【计算机软件毕业设计】二手车交易平台的分析、设计与实现文献综述1.doc

    1.3 Spring框架 徐景秀在期刊发表说Spring是一个开源框架,它由Rod Johnson在2004年3月24日发布 创建,并在他的著作《J2EE设计开发编程指南》里进行了描述,这也使他一度成为一个改 变Java世界的大师级人物。...

    图书馆管理系统(Java) 优秀毕业设计论文+软件设计源码.zip

    本系统使有jsp进行网页界面的设计,使用MVC设计模式,采用了开源框架Struts,它采用了当今软件设计的最新技术,具有开发效率高、设计灵活、生成的软件界面友好美观等特点。本系统中通过JDBC驱动和数据库进行无缝连接...

    《高级软件架构师培训讲义》.rar PDF

    非常棒的一部内部讲义,强烈推荐高级软件架构师 目录: 00 架构师与设计师 01 软件流程实施方案选择 02 软件架构文档设计 03 软件架构风险管理 04 如何描述和评估软件架构质量 ...23 软件构架设计总结

    Pixhawk源码总结.rar_pixhawk_pixhawk代码解读_pixhawk源码_开源飞控

    总结开源飞控pixhawk的各种代码解读,总体框架结构的运行思路,各模块详细设计步骤

    面向对象设计 PPT

    主要讲的ssi框架,MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,...由于最近用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。

Global site tag (gtag.js) - Google Analytics