Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

完美实现调用资讯显示缩略图(无缩略图的资讯显示无图文件),带缓存

[复制链接]
littlehz 发表于 2009-11-24 16:17:46 | 显示全部楼层 |阅读模式
本帖最后由 littlehz 于 2009-11-30 10:42 编辑

本调用代码用于放置在首页中,列表模块带缓存,每个分页的缓存时间相差20秒,避免同一时间所有缓存全部失效,某一时刻非常缓慢的问题。列表数量统计的模块也带缓存。
取所有频道的资讯文章,有缩略图显示缩略图,无缩略图显示无缩略图的文件。

对比嵌套循环查询,极大减少数据库查询次数(嵌套查询可能达到11次数据库查询),本方法只需查询一次数据库。
列表模块对应的SQL语句为
  1. SELECT i.itemid, i.catid, i.uid, i.username, i.subject, i.dateline, i.viewnum, i.replynum, i.digest, i.top, i.picid, c.name, n.message, a.thumbpath, a.subject AS a_subject
  2. FROM supe_spaceitems i
  3. INNER JOIN supe_spacenews n ON i.itemid = n.itemid
  4. INNER JOIN supe_categories c ON i.catid = c.catid
  5. LEFT JOIN supe_attachments a ON i.picid = a.aid
  6. WHERE i.type='news'
  7. ORDER BY i.top DESC, i.itemid DESC
复制代码
两个INNER JOIN内联一个LEFT JOIN左连接做四表联查,全部为主键或者索引查询,相对效率高。

由于用了联查,block模块中的perpage分页代码无效,只能自己调用multi函数处理分页内容。分页数量统计对应的SQL语句为
  1. SELECT count( itemid ) AS total FROM `supe_spaceitems` WHERE type='news'
复制代码
cachename缓存以mynews_pagexx命名的变量,解决缓存覆盖问题。

演示:http://www.littz.cn,SupeSite 7.5,256M内存VPS服务器在每秒1000次并发压力下,关闭缓存平均页面执行时间为0.08秒,开启缓存平均0.006秒执行时间。



完整调用代码如下:
  1. <!-- Article begin -->
  2. <div class="article">
  3.         <!--{eval $basecachetime = 3500; /*设置本页面基础缓存时间*/}-->
  4.         <!--{eval $baseperpage = 10; /*设置本页面的单页文章数量*/}-->
  5.         <!--{eval $mypage = $_SGET['page']?$_SGET['page']:1;}-->
  6.         <!--{eval $mystart = ($mypage-1)*$baseperpage}-->
  7.         <!--{eval $mycachename = 'mynews_page'.$mypage}-->
  8.         <!--{eval $mycachetime = $basecachetime + $mystart*2}-->
  9.         <!--{block name="spacenews" parameter="type/news/sql/SELECT%20i.itemid%2C%20i.catid%2C%20i.uid%2C%20i.username%2C%20i.subject%2C%20i.dateline%2C%20i.viewnum%2C%20i.replynum%2C%20i.digest%2C%20i.top%2C%20i.picid%2C%20c.name%2C%20n.message%2C%20a.thumbpath%2C%20a.subject%20AS%20a_subject%0D%0AFROM%20supe_spaceitems%20i%0D%0AINNER%20JOIN%20supe_spacenews%20n%20ON%20i.itemid%20%3D%20n.itemid%0D%0AINNER%20JOIN%20supe_categories%20c%20ON%20i.catid%20%3D%20c.catid%0D%0ALEFT%20JOIN%20supe_attachments%20a%20ON%20i.picid%20%3D%20a.aid%0D%0AORDER%20BY%20i.top%20DESC%2C%20i.itemid%20DESC/limit/$mystart,$baseperpage/cachename/$mycachename/cachetime/$mycachetime/tpl/data"}--><!--Thiese Block had cached in dollar_SBLOCK[$mycachename]-->
  10.         <!--{loop $_SBLOCK[$mycachename] $value}-->
  11.         <!--{eval $value['message'] = trim(strip_tags($value['message']));}-->
  12.         <!--{eval $value['message'] = trim(cutstr($value['message'], '290', '1'));}-->
  13.         <!--{if $value['top']}-->
  14.                 <!--{eval $value['subject'] = '[置顶'.$value['top'].'] '.$value['subject'];}-->
  15.         <!--{/if}-->
  16.         <!--{if $value['digest']}-->
  17.                 <!--{eval $value['subject'] .= ' [精华'.$value['digest'].']';}-->
  18.         <!--{/if}-->
  19.                         <div class="post">
  20.                     <h2><a href="$value['url']" title="$value['subject']">$value['subject']</a></h2>
  21.                     <span class="pcomments"><em>$value['replynum']</em>个评论</span>
  22.                     <div class="clear"></div>
  23.                     <!--{if $value['thumbpath']}-->
  24.                                 <a href="$value['url']"><img src="$_SSCONFIG['attachmenturl']/$value['thumbpath']" title="$value['a_subject']" alt="$value['a_subject']" class="thumb_image" /></a>
  25.                     <!--{else}-->
  26.                                 <a href="$value['url']"><img src="{S_URL}/templates/$_SCONFIG[template]/images/no-thumb.jpg" title="$value['subject']" alt="$value['subject']" class="thumb_image" /></a>
  27.                     <!--{/if}-->
  28.                         <div class="pcontent">
  29.                             $value['message']
  30.                         </div>
  31.                                                 <div class="clear"></div>
  32.                             <div class="pmeta">
  33.                                                         #date('Y-m-d',$value['dateline'])# / <a href="#action/category/catid/$value['catid']#" title="$value['name']">$value['name']</a> / $value['viewnum']浏览
  34.                         </div>
  35.                         <a href="$value['url']" title="阅读全文" class="readmore">阅读全文</a>
  36.            </div>
  37.         <!--{/loop}-->
  38.     <!-- Navigation begin -->
  39.     <div class="page_navi">
  40.     <!--翻页输出控制-->
  41.     <!--{eval $mylistcount = 1;}-->
  42.     <!--{block name="category" parameter="sql/SELECT%20count%28%20itemid%20%29%20AS%20total%20FROM%20%60supe_spaceitems%60/limit/1/cachetime/$basecachetime/cachename/indexcount/tpl/data"}--><!--Index listcount has cached in mylistcount-->
  43.     <!--{eval $mylistcount = $_SBLOCK['indexcount'][0]['total'];}-->
  44.         <!--{if $mylistcount}-->
  45.                 <!--{eval $_SGET['action'] = 'index';}-->
  46.                 <!--{eval $myurlarr = $_SGET;}-->
  47.                 <!--{eval unset($myurlarr['page']);}-->
  48.                 <!--{eval $_SBLOCK['mynews_multipage'] = multi($mylistcount, $baseperpage, $mypage, $myurlarr, 0);}-->
  49.         <!--{/if}-->
  50.     <!--{if $_SBLOCK['mynews_multipage']}-->
  51.                 $_SBLOCK['mynews_multipage']
  52.     <!--{/if}-->
  53.     </div>
  54.     <!-- Navigation end -->
  55. </div>
  56. <!-- Article end -->
复制代码

评分

2

查看全部评分

lidq.jingwu 发表于 2009-11-24 17:54:55 | 显示全部楼层
支持一个
回复

使用道具 举报

理红轩 发表于 2009-11-24 19:26:55 | 显示全部楼层
太强了,严重支持一下!!
回复

使用道具 举报

理红轩 发表于 2009-11-25 05:42:01 | 显示全部楼层
本帖最后由 理红轩 于 2009-11-25 12:01 编辑

很想用到新创建的频道首页和分类页(news_category.html.php),该怎样改呢?
如在新创建的频道首页,作type/$channel/限制无效。
回复

使用道具 举报

理红轩 发表于 2009-11-25 13:10:03 | 显示全部楼层
type/news/实际上是不起作用的。那么,怎样才能用在复制频道上呢?
回复

使用道具 举报

 楼主| littlehz 发表于 2009-11-25 15:12:33 | 显示全部楼层
回复 5# 理红轩


    用了高级模式就不能用模版的指令,SQL语句WHERE后面加上 AND type='channel_id',分类就是 AND catid='xxx'
回复

使用道具 举报

理红轩 发表于 2009-11-25 19:24:36 | 显示全部楼层
本帖最后由 理红轩 于 2009-11-25 19:26 编辑

晕了~~

1.我用1楼的列表模块SQL语句创建模块,得到的sql部分是:

sql/SELECT%20i.itemid%2C%20i.catid%2C%20i.uid%2C%20i.username%2C%20i.subject%2C%20i.dateline%2C%20i.viewnum%2C%20i.replynum%2C%20i.digest%2C%20i.top%2C%20i.picid%2C%20c.name%2C%20n.message%2C%20a.thumbpath%2C%20a.subject%20AS%20a_subject%0D%0AFROM%20supe_spaceitems%20i%0D%0AINNER%20JOIN%20supe_spacenews%20n%20ON%20i.itemid%20%3D%20n.itemid%0D%0AINNER%20JOIN%20supe_categories%20c%20ON%20i.catid%20%3D%20c.catid%0D%0ALEFT%20JOIN%20supe_attachments%20a%20ON%20i.picid%20%3D%20a.aid%0D%0AWHERE%20i.type%3D%27news%27%0D%0AORDER%20BY%20i.top%20DESC%2C%20i.itemid%20DESC/

多出了红色部分,不知是哪里设置的不对?

2.按楼上,在WHERE后面加 AND type='channel_id',创建模块后用于复制频道首页和分类页,均出现提示:

SupeSite info: MySQL Query Error

User: lhx
Time: 2009-11-25 6:58pm
Script: /index.php

SQL: SELECT i.itemid, i.catid, i.uid, i.username, i.subject, i.dateline, i.viewnum, i.replynum, i.digest, i.top, i.picid, c.name, n.message, a.thumbpath, a.subject AS a_subject
FROM [Table]spaceitems i
INNER JOIN [Table]spacenews n ON i.itemid = n.itemid
INNER JOIN [Table]categories c ON i.catid = c.catid
LEFT JOIN [Table]attachments a ON i.picid = a.aid
WHERE i.type='news' AND type='channel_id'
ORDER BY i.top DESC, i.itemid DESC LIMIT 0,10
Error: Column 'type' in where clause is ambiguous
Errno.: 1052

不知问题出在哪里?

楼主的设计,调用信息全面、效率高,的确很完美。但SS用户大多不懂SQL,因比较复杂,最好能直接给出复制频道首页和分类页的完整调用代码,则善莫大焉!
另外,关于置顶,提点建议:最好是“置顶1”只在分类页置顶,“置顶2”同时在频道首页和分类页置顶,“置顶3”同时在网站首页、频道首页和分类页置顶,与论坛相似。
回复

使用道具 举报

理红轩 发表于 2009-11-26 10:17:19 | 显示全部楼层
发现个问题:

<!--{eval $baseperpage = 10; /*设置本页面的单页文章数量*/}-->

改上面的数后,点到后面的页,再点第一页,无效,仍停留在原页。点其它页则有效。仅在个别情况下,当“1”跑到“上一页”之前时,点了才有效。
回复

使用道具 举报

 楼主| littlehz 发表于 2009-11-26 10:19:08 | 显示全部楼层
回复 8# 理红轩


    刚改动的话清空缓存一下就可以了
回复

使用道具 举报

 楼主| littlehz 发表于 2009-11-26 10:24:47 | 显示全部楼层
多表联查语句要加表名缩写 i. 的,做网站不是做论坛了,不可能简单到鼠标点几下就能完成的,需要掌握一定的PHP和DIV+CSS基础。

这个SQL模块放news_index.html.php模版文件或者放复制的文章频道的模版文件。
  1. sql/SELECT%20i.itemid%2C%20i.catid%2C%20i.uid%2C%20i.username%2C%20i.subject%2C%20i.dateline%2C%20i.viewnum%2C%20i.replynum%2C%20i.digest%2C%20i.top%2C%20i.picid%2C%20c.name%2C%20n.message%2C%20a.thumbpath%2C%20a.subject%20AS%20a_subject%0D%0AFROM%20supe_spaceitems%20i%0D%0AINNER%20JOIN%20supe_spacenews%20n%20ON%20i.itemid%20%3D%20n.itemid%0D%0AINNER%20JOIN%20supe_categories%20c%20ON%20i.catid%20%3D%20c.catid%0D%0ALEFT%20JOIN%20supe_attachments%20a%20ON%20i.picid%20%3D%20a.aid%0D%0AWHERE%20i.type%3D%27$_SGET['action']%27%0D%0AORDER%20BY%20i.top%20DESC%2C%20i.itemid%20DESC/
复制代码
这个SQL模块放news_category.html.php模版文件。
  1. sql/SELECT%20i.itemid%2C%20i.catid%2C%20i.uid%2C%20i.username%2C%20i.subject%2C%20i.dateline%2C%20i.viewnum%2C%20i.replynum%2C%20i.digest%2C%20i.top%2C%20i.picid%2C%20c.name%2C%20n.message%2C%20a.thumbpath%2C%20a.subject%20AS%20a_subject%0D%0AFROM%20supe_spaceitems%20i%0D%0AINNER%20JOIN%20supe_spacenews%20n%20ON%20i.itemid%20%3D%20n.itemid%0D%0AINNER%20JOIN%20supe_categories%20c%20ON%20i.catid%20%3D%20c.catid%0D%0ALEFT%20JOIN%20supe_attachments%20a%20ON%20i.picid%20%3D%20a.aid%0D%0AWHERE%20i.catid%3D%27$_SGET['catid']%27%0D%0AORDER%20BY%20i.top%20DESC%2C%20i.itemid%20DESC/
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-24 03:45 , Processed in 0.026807 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表