백엔드 개발 PHP 튜토리얼 Discuz!下Memcache缓存实现方法_php技巧

Discuz!下Memcache缓存实现方法_php技巧

May 17, 2016 am 09:25 AM
discuz memcache

前言
在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问量。同时给出一些使用Memcache去减轻MySQL压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。另外由于个人思维的问题,行文比较跳跃,特此声明!

系统分析
单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的PV,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。

就我手头的一些数据显示,目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力增大可以通过并行增加服务器解决,而MySQL压力却无处释放,在不考虑MySQL官方服务的情况下,我们通过合理的利用Memcache是可以达到减轻MySQL服务器负载的。

可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表)处理,但是当前的情况是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(注:本段文字针对已经成型的系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。

还可能有朋友会说利用MySQL的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在Mysql Master/Slave 模式中,Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,对外部请求进行处理,直到Master恢复正常。就是说:在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master/Slave同时提供服务。使用MySQL主从依然不能有效的降低MySQL的负载。

或许你又会问我为什么不使用MySQL集群(MySQL Cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。PS:说句题外话,MySQL手册中将MySQL集群解释为MySQL簇,不习惯。

其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一。但是遗憾的是,这种MySQL分区的方式我个人没有使用过的经历,也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用MySQL分区,但是遗憾的是我没有得到确切的数据。

好了分析总结了这么多种降低MySQL负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解Discuz!论坛的MySQL负载比较有效的方法就是使用Memcache!

使用Memcache的理由
1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。
2.金钱金钱金钱,最少的付出,获得最大的收益。
3.简单简单简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程

Discuz!使用Memcache
1.在config.inc.php中增加

$memcachehost = '127.0.0.1';
$memcacheport = 11211;
$memcachelife = 60;

2.在include/common.inc.php中

$mem = new Memcache;
$mem->connect($memcachehost, $memcacheport);

3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下:

function fetch_array($query, $result_type = MYSQL_ASSOC) {
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0];
}

function query_memcache($sql, $type = '') {
global $mem,$memcachelife;

$key = md5($sql);
if(!($query = $mem->get($key))) {
$query = $this->query($sql, $type);
while($item  = $this->fetch_array($query)) {
$res[] = $item;
}
$query = $res;
$mem->set($key, $query , 0, $memcachelife);
}
return $query;
}

function query($sql, $type = '') {
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;

$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}

if(substr($sql, 0, 6) == 'SELECT') {
echo 'Cache SQL:'.$sql.'

';
} else {
echo 'Flash SQL:'.$sql.'

';
}

$this->querynum++;
return $query;
}

4.将需要使用Memcache缓存的SQL查询的代码由

$db->query(

修改为

$db->query_memcache(

注意并将

while($post = $db->fetch_array($query)) {

修改为

foreach($query as $post) {

没有while的$db->fetch_array可以不用修改。

下面代码有用得着的就拿去:

preg_replace("/while\([$](\w+)\s*\=\s*[$]db->fetch_array\([$]query\)\)/is", "foreach(\$query as \$\\1)", $file);

回头放出个小工具批量替换下就可以了。
在EditPlus中可以这样替换:while\([$](.*) = [$]db->fetch_array\([$]query\)\)替换为foreach($query as $\1)
5.完成了,测试吧!~

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Discuz 백그라운드 로그인 문제 해결 방법 공개 Discuz 백그라운드 로그인 문제 해결 방법 공개 Mar 03, 2024 am 08:57 AM

Discuz 백그라운드 로그인 문제에 대한 해결책이 공개되었습니다. 인터넷의 급속한 발전으로 인해 웹 사이트 구축이 점점 보편화되고 있으며 일반적으로 사용되는 포럼 웹 사이트 구축 시스템으로 Discuz가 선호되고 있습니다. 많은 웹마스터. 그러나 강력한 기능으로 인해 Discuz를 사용할 때 백그라운드 로그인 문제와 같은 몇 가지 문제가 발생할 수 있습니다. 오늘은 Discuz 백그라운드 로그인 문제에 대한 해결책을 공개하고 구체적인 코드 예시를 제공하여 도움이 필요한 분들에게 도움이 되기를 바라겠습니다.

디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 Mar 03, 2024 am 10:33 AM

"Discovering Discuz: 정의, 기능 및 코드 예제" 인터넷의 급속한 발전과 함께 커뮤니티 포럼은 사람들이 정보를 얻고 의견을 교환하는 중요한 플랫폼이 되었습니다. 많은 커뮤니티 포럼 시스템 중에서 중국의 잘 알려진 오픈 소스 포럼 소프트웨어인 Discuz는 대다수의 웹 사이트 개발자 및 관리자가 선호합니다. 그렇다면 Discuz는 무엇입니까? 어떤 기능이 있으며 웹사이트에 어떻게 도움이 됩니까? 이 기사에서는 Discuz를 자세히 소개하고 독자가 이에 대해 더 자세히 알아볼 수 있도록 구체적인 코드 예제를 첨부합니다.

Discuz 사용자의 필수품! 소품명칭 종합분석! Discuz 사용자의 필수품! 소품명칭 종합분석! Mar 12, 2024 pm 10:15 PM

Discuz 사용자의 필수품! 소품명칭 종합분석! Discuz 포럼에서 이름 변경 기능은 항상 사용자들로부터 많은 관심과 요구를 받아왔습니다. 이름을 변경해야 하는 일부 사용자의 경우 이름 변경 소품을 사용하면 사용자 이름을 쉽게 수정할 수 있으며 이는 흥미로운 상호 작용 방법이기도 합니다. Discuz의 이름 바꾸기 소품을 얻는 방법, 사용 방법, 몇 가지 일반적인 문제에 대한 해결 방법을 포함하여 심층적으로 살펴보겠습니다. 1. 개명 소품은 Discuz에서 구입하세요. 개명 소품은 주로 포인트나 관리자를 통해 구매합니다.

잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! 잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! Mar 03, 2024 am 09:33 AM

잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! 토론하세요! 사용자에게 편리한 커뮤니케이션 플랫폼을 제공하는 매우 인기 있는 포럼 프로그램입니다. 디스커스를 이용해보세요! 포럼에 입장할 때, 때때로 잘못된 비밀번호를 접할 수 있으며, 이로 인해 사용자가 포럼에 정상적으로 로그인하고 이용하지 못할 수 있습니다. 자, Discuz를 만나보세요! 비밀번호가 틀리면 어떻게 신속하게 문제를 해결해야 합니까? 일부 솔루션은 참조용으로 제공된 특정 코드 예제와 함께 아래에서 공유됩니다. 1. 비밀번호가 맞는지 확인하세요

Discuz 등록 절차에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있습니다. Discuz 등록 절차에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있습니다. Mar 13, 2024 pm 12:21 PM

"Discus 등록 프로세스에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있도록 하기 위해 구체적인 코드 예제가 필요합니다." Discuz는 다양한 웹 사이트에서 널리 사용되는 강력한 커뮤니티 포럼 프로그램으로, 풍부한 사용자 등록 및 개인 정보 수정 기능을 제공합니다. 그리고 인터페이스. 이 글에서는 Discuz의 등록 프로세스를 자세히 소개하고, 개인 정보를 쉽게 사용자 정의하고 수정할 수 있도록 구체적인 코드 예제를 제공합니다. 1. 사용자 등록 과정 Discuz에서 사용자 등록은 등록 과정의 원활한 진행과 사이트의 중요한 기능 중 하나입니다.

Discuz 도메인 이름 수정 작업 가이드 Discuz 도메인 이름 수정 작업 가이드 Mar 09, 2024 pm 04:36 PM

Discuz 도메인 이름 수정 운영 가이드 Discuz 포럼 시스템을 사용하는 과정에서 포럼의 도메인 이름을 수정해야 하는 경우가 있습니다. 도메인 이름을 변경해야 하거나 일부 도메인 이름 확인 문제를 해결해야 하기 때문일 수 있습니다. 이 글에서는 Discuz 포럼 시스템에서 도메인 이름을 수정하는 방법을 자세히 소개하고 몇 가지 구체적인 코드 예제를 제공합니다. 1. 데이터 백업 작업을 수행하기 전에 작업 오류로 인한 데이터 손실을 방지하기 위해 데이터를 백업해야 합니다. Discuz에서는 백그라운드 데이터 백업을 사용할 수 있습니다

Discuz Editor: 효율적인 게시물 레이아웃 도구 Discuz Editor: 효율적인 게시물 레이아웃 도구 Mar 10, 2024 am 09:42 AM

Discuz Editor: 효율적인 게시물 레이아웃 도구입니다. 인터넷의 발달로 인해 온라인 포럼은 사람들이 정보를 교환하고 공유하는 중요한 플랫폼이 되었습니다. 포럼에서는 사용자들이 자신의 의견과 아이디어를 표현할 수 있을 뿐만 아니라 다른 사람들과 토론하고 교류할 수도 있습니다. 게시물을 게시할 때 명확하고 아름다운 형식은 종종 더 많은 독자의 관심을 끌고 더 정확한 정보를 전달할 수 있습니다. 사용자가 게시물을 빠르게 입력하고 편집할 수 있도록 하기 위해 Discuz 편집기가 등장하여 효율적인 게시물 조판 도구가 되었습니다. 디스크

Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! Mar 02, 2024 pm 06:03 PM

Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! 인기 포럼 플랫폼인 Discuz는 웹 사이트 구축 및 관리에 널리 사용되기 때문에 때때로 백엔드 로그인 실패가 발생하여 사람들이 고민하는 경우가 있습니다. 오늘은 Discuz 백엔드 로그인 실패를 일으킬 수 있는 문제에 대해 논의하고 몇 가지 솔루션과 구체적인 코드 예제를 제공하겠습니다. 이 기사가 비슷한 문제를 겪고 있는 웹마스터와 개발자에게 도움이 되기를 바랍니다. 1. 문제 해결은 Discuz 백그라운드 로그인 실패 문제를 해결하는 것입니다.

See all articles