歡迎光臨, 訪客. 請先 登入註冊一個帳號.
十一月 23, 2024, 02:37:44 上午
19595 文章 在 3865 主題 由 4579 會員
最新註冊會員: aa123aa1
  列出文章
頁: [1]
1  開發 / 核心補強 / 关于LifeType的数据对象的改良,提了一个方法,以Article类为例 於: 二月 23, 2008, 04:11:57 上午
空闲编写,代码不可运行,只表明了想法,大家看看是否可行,因为并没有深入了解LifeType的一些东西,所以我无法真实的估计这种方法的可行性:

<?php

/**
 * LifeType 中 Article 对象的构造建议,没有深入地了解 LifeType 的代码
 * 只是提出一个方案建议,大家可讨论。
 *
 * 时间不多,代码并没有写完整,只是表达了自己的想法,有兴趣的可尝试改
 * 造,来验证它的可行性。
 *
 * Author : Zhang Shiwei (asers_z@hotmail.com)
 * 2008-2-23
 */
class Article
{
   
   /**
    * 用来存储文章列表的数组,无论一篇或多篇
    *
    * @private Array
    */
   private $_articles = array();

   /**
    * 存储此次循环时获得的文章资料
    *
    * @private Array && Default FALSE
    */
   private $_article = false;

   /**
    * 存储此次循环中获得的数组索引
    *
    * @private Int
    */
   private $_subScript = false;


   /**
    * 构造函数
    *
    * @public
    */
   public function __construct( $topic, $text, $categories, $user, $blog, $status, $numReads, $properties = Array(), $slug = "", $id = -1 )
   {
      // LifeType 的具体实现
   }

   /**
    * 将获得的文章压入数组,执行LifeType中类似 getBlogArticles 方法时,循环压入
    *
    * @param : result 获得单条数据库记录数组
    * @return : true
    */
   public function pushArticle( $result )
   {
      // 如果 _article 成员为 false,意为该对象压入第一条记录,则记录在这个成员上
      // 并将压入数组
      //
      // 记录第一条的原因是系统并不知道此时压入的是文章列表或单条文章,记录在这里
      // 后可以确保如果是单条文章,下面的各个方法仍然可以正常取值
      //
      // 当然也可以通过构造函数来确认此时压入的是单篇文章而不是列表
      if($this->_article === false) {
         $this->_article = $result;
         $this->_articles[] = $this->_article;
      }

      else $this->_articles[] = $result;
   }

   /**
    * 在其他位置需要对列表进行读取时使用 while 句柄循环该方法
    *
    * @public
    */
   public function listArticles()
   {
      return list($this->_subScript, $this->_article) = each($this->_articles);
   }

   /**
    * 获得文章的标题
    *
    * @public
    */
   public function getTopic()
   {
      return $this->_article["topic"];
   }

   /**
    * 获得文章的介绍内容
    *
    * @public
    */
   public function getIntroText()
   {
      return $this->_article["introtext"];
   }

   // ...... 更多的相关方法的实现不再一一列表

}

/**
 * 下面是一段简单的示例代码,当调用了 getBlogArticles 时将结果集
 * 压入数组
 *
 * 并在接下来的示例代码中循环显示这些内容
 */
class Articles extends Model
{
   // ........... //

   function getBlogArticles( $blogId,
                       $date         = -1,
                       $amount       = -1,
                       $categoryId   = 0,
                       $status       = POST_STATUS_PUBLISHED,
                       $userId       = 0,
                       $maxDate      = 0,
                       $searchTerms  = "",
                       $page         = -1 )
   {
      // ............ //
      $article = new Article( ... );

      while( $row = $result->FetchRow()) {
         // Push article
         $article->pushArticle( $row );
         // and cache it for later use, we might need it
         $this->_cache->setData( $article->getId(), CACHE_ARTICLES, $article );
         $this->_cache->setMultipleData( $article->getPostSlug(), CACHE_ARTICLES_BYNAME, $article );
      }

      $result->Close();

      return $article;
   }

   // ................ //
}

$article = new Article( ... );
while( $article->listArticles() ) {
   // ......... //
   // ....
}
2  開發 / 核心補強 / LifeType内存使用测试 於: 二月 23, 2008, 02:55:13 上午
一个简单的测试,插入15篇文章形成一个完整列表。

这个列表页面内存使用是:5272400 Bytes

一个类LifeType框架,取消了实质的DAO概念,同样是列表,内存消耗是:834488 Bytes

无论是否使用缓存,这个结果没有太大的区别。

5M的内存消耗对PHP来说实在是恐怖了点,难免admin.php的注释要求调整到16M
3  開發 / 核心補強 / 关于LifeType中DAO的问题 於: 二月 22, 2008, 05:09:56 下午
LifeType贯穿始终都有一个很强的面向对象的味道,其中很多思想值得借鉴学习,唯一一点我想说一下我的观点,希望大家可以讨论一下:

在LifeType的dao目录中大量的数据对象模型,例如article / blogcategory 等等。以article为例,在获取单个文章时,使用这个模型无疑是上上之策,但是在获取一个列表时,articles的getBlogArticles方法里面,他使用了mapRow的方法将数据库的结果集压入article对象,然后返回这个对象,再然后把这些对象压入到一个数组,我想,这么做可以带来极大的便利,并可以让代码非常的优雅。但他所带来的负面影响却远胜于这些优点,例如资源消耗以及执行效率。

LifeType引入了DAO的模式,将数据层中的基础数据操作与复杂的数据逻辑分离开来,这无疑是一个非常不错的做法,但是这么做带来的资源占用确实不容小觑,尤其是在一个高并发的WEB应用中。我在下面描述一下一个可能的需求,看看LifeType的DAO将会如何工作:

一名用户发表了一篇Blog文章,LifeType将这篇文章压入Article对象(在LifeType中他们把这称作dbObject),然后将这个对象传递到articles的addArticle方法中,然后根据需求解析这个对象,并将数据写入到数据库中。如果我需要在发布后立即观看这篇文章,那么就存在的另外一个问题Lifetype需要取出数据再次写入到article对象中,然后再到模板中解析这个对象显示数据。或者说,我需要返回到文章列表,依然是无可避免的再次大量的对象被创建。

我十分想知道LifeType这么做的原因,处于维护角度还是强烈的OO思想使他们不得不这样做?我相信这样做并不会对程序效能有任何提升。它实际上是绕了一个圈子。


有错误之处希望大家能指出,不知道是否可以去掉这些过程,来提升效能以及对内存的占用。
4  開發 / 核心補強 / Re: 请教一下。大家说得pdb是什么意思? 於: 二月 22, 2008, 04:51:30 下午
PDB? PDO or PDB?

PDO = PHP Database Object
頁: [1]