[pLog-svn] r2779 - in plog/trunk/class: dao view/admin
Oscar Renalias
oscar at renalias.net
Fri Jan 13 07:12:08 GMT 2006
No. Comments and trackbacks are only cached per post. If you go to
manage->comments or manage->trackbacks you're actually loading them
every time.
The problem with articles is that *all* of them were being loaded,
and then only the needed ones were returned.
Oscar
On 13 Jan 2006, at 05:52, Mark Wu wrote:
> Hi Oscar:
>
> Then, does it mean the same situation will happened in comments &
> trackbacks
> ..?
>
> If one post has 100 comments or 200 trackbacks, will this overkill
> lifetype?
>
> Mark
>
>> -----Original Message-----
>> From: plog-svn-bounces at devel.lifetype.net
>> [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of
>> oscar at devel.lifetype.net
>> Sent: Friday, January 13, 2006 6:46 AM
>> To: plog-svn at devel.lifetype.net
>> Subject: [pLog-svn] r2779 - in plog/trunk/class: dao view/admin
>>
>> Author: oscar
>> Date: 2006-01-12 22:45:38 +0000 (Thu, 12 Jan 2006) New Revision: 2779
>>
>> Modified:
>> plog/trunk/class/dao/articles.class.php
>> plog/trunk/class/dao/model.class.php
>> plog/trunk/class/view/admin/admindashboardview.class.php
>> Log:
>> I had to reconsider some ideas regarding caching of long
>> lists of articles... It is overkill to load all articles at
>> once, cache them all and then return only what we need
>> because the system will slow down considerably and we'll hit
>> the 8mb limit. I reverted Articles::getBlogArticles and
>> Articles::getNumBlogArticles to what they basically were in
>> 1.0.x (plus just a bit of caching) and things seem to work
>> much better now (both in performance and memory) Regarding
>> memory, the db from lifetype.net fits perfectly now in
>> between 3.5 and 5.0mb memory depending on the situation,
>> which is quite an improvement!
>>
>> Modified: plog/trunk/class/dao/articles.class.php
>> ===================================================================
>> --- plog/trunk/class/dao/articles.class.php 2006-01-12
>> 22:35:22 UTC (rev 2778)
>> +++ plog/trunk/class/dao/articles.class.php 2006-01-12
>> 22:45:38 UTC (rev 2779)
>> @@ -51,7 +51,7 @@
>> {
>> $blogArticles = $this->getMany( "blog_id",
>> $blogId,
>> - CACHE_ARTICLES_BYBLOG,
>> + null,
>> Array(
>> CACHE_ARTICLES => "getId" ),
>> Array( "date"
>> => "DESC" ),
>>
>> $searchTerms,
>> @@ -274,18 +274,20 @@
>> $status =
>> POST_STATUS_PUBLISHED,
>> $userId = 0,
>> $maxDate = 0,
>> - $searchTerms = Array())
>> - {
>> - $articles = $this->getBlogArticles( $blogId,
>> - $date,
>> -
>> -1,
>> -
>> $categoryId,
>> -
>> $status,
>> - $userId,
>> -
>> $maxDate,
>> -
>> $searchTerms );
>> + $searchTerms = "")
>> + {
>> + $postStatus = $status;
>> + $prefix = $this->getPrefix();
>> + $where = $this->buildWhere( $blogId,
>> $date, $amount, $categoryId, $status, $userId, $maxDate,
>> $searchTerms );
>> + $query = "SELECT COUNT(*) AS total FROM
>> {$prefix}articles
>> +a, {$prefix}articles_categories c,
>> {$prefix}article_categories_link l
>> +WHERE $where ";
>>
>> - return count($articles);
>> + $result = $this->_db->Execute( $query );
>> +
>> + if( !$result )
>> + return 0;
>> +
>> + $number = $result->RowCount();
>> + return( $number );
>> }
>>
>> /**
>> @@ -372,7 +374,66 @@
>>
>> return( $searchCondition );
>> }
>> +
>> + /**
>> + * builds a WHERE clause for a query
>> + *
>> + * @private
>> + */
>> + function buildWhere( $blogId, $date = -1,
>> $amount = -1, $categoryId = 0, $status = 0, $userId = 0,
>> $maxDate = 0, $searchTerms = "" )
>> + {
>> + $postStatus = $status;
>> + $prefix = $this->getPrefix();
>> + if($blogId == -1){
>> + $query = "a.blog_id = a.blog_id";
>> + }
>> + else{
>> + $query = "a.blog_id = ".Db::qstr($blogId);
>> + }
>> + if( $date != -1 ) {
>> + // consider the time difference
>> + include_once(
>> PLOG_CLASS_PATH."class/dao/blogs.class.php" );
>> + $blogs = new Blogs();
>> + $blogInfo = $blogs->getBlogInfo( $blogId );
>> + $blogSettings =
>> $blogInfo->getSettings();
>> + $timeDifference = $blogSettings->getValue(
>> "time_offset" );
>> + $SecondsDiff = $timeDifference * 3600;
>> + $query .= " AND
>> FROM_UNIXTIME(UNIX_TIMESTAMP(a.date)+$SecondsDiff)+0 LIKE '$date%'";
>> + }
>>
>> + // the common part "c.id = a.category_id" is
>> needed so that
>> + // we don't get one article row as many times as
>> the amount of categories
>> + // we have... due to the sql 'join' operation
>> we're carrying out
>> + if( $categoryId == -1 )
>> + $query .= " AND c.id = l.category_id AND
>> a.id = l.article_id ";
>> + else {
>> + if( $categoryId > 0 )
>> + $query .= " AND a.id = l.article_id AND
>> l.category_id = $categoryId AND c.id = l.category_id";
>> + else {
>> + $query .= " AND c.id = l.category_id AND
>> a.id = l.article_id AND c.in_main_page = 1";
>> + }
>> + }
>> +
>> + if( $status > 0 )
>> + $query .= " AND a.status = '$postStatus'";
>> + if( $userId > 0 )
>> + $query .= " AND a.user_id = ".Db::qstr($userId);
>> + if( $maxDate > 0 )
>> + $query .= " AND a.date <= '$maxDate'";
>> +
>> + // in case there were some search terms
>> specified as parameters...
>> + if( $searchTerms != "" ) {
>> + $whereString =
>> $this->getSearchConditions( $searchTerms );
>> + // and add it to the current search
>> + $query .=" AND {$whereString} ";
>> + }
>> +
>> + if( $categoryId <= 0 )
>> + $query .= " GROUP BY a.id ";
>> +
>> + return $query;
>> + }
>> +
>> /**
>> * Returns all the articles for a given blog,
>> according to the conditions specified in
>> * the call. If this function is too cumbersome to
>> use (I reckon it might be, @@ -402,25 +463,65 @@
>> $searchTerms = "",
>> $page = -1 )
>> {
>> - $articles = $this->getArticles( $blogId, $searchTerms );
>> -
>> - if( !$articles )
>> - $articles = Array();
>> + // build the query
>> + // the query gets quite complicated to build
>> because we have to take care of plenty
>> + // of conditions, such as the maximum date, the
>> amount, the category,
>> + // wether the category has to be shown in the
>> main page or not, etc...
>> + $postStatus = $status;
>> + $prefix = $this->getPrefix();
>> + $where = $this->buildWhere( $blogId, $date,
>> $amount, $categoryId, $status, $userId, $maxDate, $searchTerms );
>> + $query = "SELECT a.id as id, a.id, a.date,
>> +
>> a.user_id,a.blog_id,a.status,a.properties,
>> + a.num_reads, a.slug, 1 AS
>> relevance FROM {$prefix}articles a, {$prefix}articles_categories c,
>> + {$prefix}article_categories_link l";
>> + if( $searchTerms != "" )
>> + $query .= ", {$prefix}articles_text t ";
>> + $query .= " WHERE ";
>> + if( $searchTerms != "" )
>> + $query .= " t.article_id = a.id AND ";
>> + $query .= " $where";
>> +
>> +
>> + // if we're doing a search, we should
>> sort by relevance
>> + if( $searchTerms != "" ) {
>> + $query .= " ORDER BY
>> relevance";
>> + }
>> + else {
>> + $query .= " ORDER BY a.date
>> DESC";
>> + }
>>
>> - $result = Array();
>> - $total = 0;
>> - foreach( $articles as $article ) {
>> - if( $this->check( $article, $date,
>> $categoryId, $status, $userId, $maxDate )) {
>> - $result[] = $article;
>> - $total++;
>> - }
>> - }
>> -
>> - // do the slicing only if necessary
>> - if( $page > -1 && $amount > -1 )
>> - $result = array_slice( $result,
>> ($page-1) * $amount, $amount );
>> -
>> - return( $result );
>> + // we don't need limits if we're getting the
>> posts for a given day
>> + if( ($amount > 0) && ($date == -1) && ($page == -1 ))
>> + $query .= " LIMIT $amount;";
>> +
>> + // in case we're using a paged display
>> + if( $page > 0 ) {
>> + $start = (($page - 1) *
>> $amount);
>> + $query .= " LIMIT $start, $amount";
>> + }
>> +
>> + // execute the query
>> + $result = $this->Execute( $query );
>> +
>> + if( !$result )
>> + return Array();
>> +
>> + if( $result->RowCount() == 0 )
>> + return Array();
>> +
>> + $articles = Array();
>> + while( $row = $result->FetchRow()) {
>> + // map the row to an object
>> + $article = $this->mapRow( $row );
>> + $articles[] = $article;
>> + // and cache it for later use,
>> we might need it
>> + $this->_cache->setData(
>> $article->getId(), CACHE_ARTICLES, $article );
>>
>> + $this->_cache->setData(
>> $article->getPostSlug(), CACHE_ARTICLES_BYNAME, $article );
>> + }
>> +
>> + $result->Close();
>> +
>> + return $articles;
>> }
>>
>> /**
>> @@ -1066,9 +1167,9 @@
>> $article->setCategories(
>> $articleCategories );
>> // get information about the categories of the article
>> $article->setBlogInfo( $blogInfo );
>> - if ( $this->users === null )
>> + /*if ( $this->users === null )
>> $this->users = new Users();
>> - $article->setUserInfo(
>> $this->users->getUserInfoFromId( $query_result['user_id'] ));
>> + $article->setUserInfo(
>> $this->users->getUserInfoFromId(
>> +$query_result['user_id'] ));*/
>>
>> // counters
>> $article->setTotalComments(
>> $query_result['num_comments'] );
>>
>> Modified: plog/trunk/class/dao/model.class.php
>> ===================================================================
>> --- plog/trunk/class/dao/model.class.php 2006-01-12
>> 22:35:22 UTC (rev 2778)
>> +++ plog/trunk/class/dao/model.class.php 2006-01-12
>> 22:45:38 UTC (rev 2779)
>> @@ -310,11 +310,10 @@
>> $orderBy .= "$field $dir";
>> }
>> }
>> +
>> // build the query including all parts
>> $query = $query.$where.$orderBy;
>>
>> - $this->log->debug("query = $query");
>> -
>> $result = $this->Execute( $query );
>>
>> if( !$result )
>>
>> Modified: plog/trunk/class/view/admin/admindashboardview.class.php
>> ===================================================================
>> --- plog/trunk/class/view/admin/admindashboardview.class.php
>> 2006-01-12 22:35:22 UTC (rev 2778)
>> +++ plog/trunk/class/view/admin/admindashboardview.class.php
>> 2006-01-12 22:45:38 UTC (rev 2779)
>> @@ -72,13 +72,22 @@
>> $numOwnedBlogs = 0;
>> foreach( $this->_userBlogs as $userBlog ) {
>>
>> $recentPosts[$userBlog->getId()] =
>> $articles->getBlogArticles( $userBlog->getId(),
>> -
>>
>> -1,
>> -
>>
>> DASHBOARD_MAX_RECENT_ITEMS,
>> -
>>
>> 0,
>> +
>>
>> -1, // no date,
>>
>>
>> +
>>
>> DASHBOARD_MAX_RECENT_ITEMS,
>> +
>>
>> 0,
>>
>>
>>
>>
>> POST_STATUS_PUBLISHED );
>> -
>> $recentComments[$userBlog->getId()] =
>> $comments->getBlogComments ( $userBlog->getId(),
>> DASHBOARD_MAX_RECENT_ITEMS );
>> -
>> $recentTrackbacks[$userBlog->getId()] =
>> $trackbacks->getBlogTrackbacks( $userBlog->getId(),
>> DASHBOARD_MAX_RECENT_ITEMS );
>> -
>> +
>> $recentComments[$userBlog->getId()] =
>> $comments->getBlogComments ( $userBlog->getId(),
>> +
>> COMMENT_ORDER_NEWEST_FIRST,
>> +
>>
>> COMMENT_STATUS_ALL,
>> +
>>
>> "", // no search terms
>> +
>>
>> 1, // first page
>> +
>>
>> DASHBOARD_MAX_RECENT_ITEMS );
>> +
>> $recentTrackbacks[$userBlog->getId()] =
>> $trackbacks->getBlogTrackbacks( $userBlog->getId(),
>> +
>> COMMENT_ORDER_NEWEST_FIRST,
>> +
>>
>> COMMENT_STATUS_ALL,
>> +
>>
>> "",
>> +
>>
>> 1,
>> +
>>
>>
>> DASHBOARD_MAX_RECENT_ITEMS );
>> if( $userBlog->getOwner() ==
>> $this->_userInfo->getId())
>> $numOwnedBlogs++;
>> }
>>
>> _______________________________________________
>> pLog-svn mailing list
>> pLog-svn at devel.lifetype.net
>> http://devel.lifetype.net/mailman/listinfo/plog-svn
>
> _______________________________________________
> pLog-svn mailing list
> pLog-svn at devel.lifetype.net
> http://devel.lifetype.net/mailman/listinfo/plog-svn
>
More information about the pLog-svn
mailing list