这几天在想如何提高论坛的性能,从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内存就够了
现在我们只是简单的把读版页的主要数据放在了缓存中,如果需要存放其他的数据,请继续完善程序,有兴趣的可以找我(),很高兴和大家一起沟通
阅读(835) | 评论(0) | 转发(0) |