Chinaunix首页 | 论坛 | 博客
  • 博客访问: 618064
  • 博文数量: 151
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1664
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-13 16:37
文章分类

全部博文(151)

文章存档

2010年(16)

2009年(135)

我的朋友

分类: LINUX

2009-11-24 15:59:25

这几天在想如何提高论坛的性能,从mysql数据库的优化上已经提高不了多少了,而且又不能增加更多的服务器,因为nginx占用内存相对比较小,所以考虑到使用mem缓存来降低数据库的压力
至于memcached的安装就略过了,网上很多教程。
先启动memcached:
/usr/local/bin/memcached -d -m 1024 -u root -l 192.168.1.100 -p 12000
然后开始修改程序:
a) config.inc.php
增加:
$memcachehost = ‘192.168.1.100′;
$memcacheport = 12000;
$memcachelife = 5; // 不宜太大,否则用户体验不是很好
b) include/common.inc.php
增加:
$mem = new Memcache;
$mem->connect($memcachehost, $memcacheport);
c) include/db_mysql.class.php
增加:
function mem_query($sql, $type = ”) {
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes, $mem, $memcachelife;
$key = md5($sql);
if(!($query = $mem->get($key))) {
echo ‘’;
$query = $this->query($sql, $type);
while($item  = $this->fetch_array($query)) {
$res[] = $item;
}
$query = $res;
$mem->set($key, $query , 0, $memcachelife);
}
$this->querynum++;
return $query;
}
function mem_fetch_array($query, $result_type = MYSQL_ASSOC) {
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query;
}
d) forumdisplay.php
假设我们只针对读版页使用memcache缓存,需要做如下修改:
113行
$query = $db->query($sql);
while($sub = $db->fetch_array($query)) {
=>
$query = $db->mem_query($sql);
foreach($query as $sub) {
213行
$query = $db->query(”SELECT uid, groupid, username, invisible, lastactivity, action FROM {$tablepre}sessions WHERE $guestwhere fid=’$fid’ AND invisible=’0′”);
if($db->num_rows($query)) {

while($online = $db->fetch_array($query)) {
=>
$query = $db->mem_query(”SELECT uid, groupid, username, invisible, lastactivity, action FROM {$tablepre}sessions WHERE $guestwhere fid=’$fid’ AND invisible=’0′”);
if(count($query) > 0) {

foreach($query as $online) {
216行
while($online = $db->fetch_array($query)) {
=>
foreach($query as $online) {
260-190行
把 $db->query 改成 $db->mem_query
295行
while(($querysticky && $thread = $db->fetch_array($querysticky)) || ($query && $thread = $db->fetch_array($query)) || ($queryfloat && $thread = $db->fetch_array($queryfloat))) {
=>
$mem_info = $mem_info_s = $mem_info_q = $mem_info_f = array();
if($querysticky) {
$mem_info_s = $db->mem_fetch_array($querysticky);
}
if($query) {
$mem_info_q = $db->mem_fetch_array($query);
}
if($queryfloat) {
$mem_info_f = $db->mem_fetch_array($queryfloat);
}
$mem_info = array_merge($mem_info_s, $mem_info_q, $mem_info_f);
foreach($mem_info as $thread) {
好了,修改完毕。
以读版页每页50个主题为例,每页数据大概在30K左右,如果有100万个主贴,那么只要600M内存就够了
现在我们只是简单的把读版页的主要数据放在了缓存中,如果需要存放其他的数据,请继续完善程序,有兴趣的可以找我(),很高兴和大家一起沟通
 
 
 原文地址  
阅读(609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~