一个不错的Discuz!技术博客

2011-08-17 wangbin

朋友做了一个很不错的Discuz!技术博客,总体感觉来说不错,朋友的Discuz!技术也不错,慢慢来吧,我们也能在他那里学到很多关于论坛(BBS)的东西,加油!

PHP for循环

2011-06-16 wangbin

先看看基本用法
for(init; condition; next) {
statement(s);
}

从1++++到100
s = 0;
for (i=0;i<=100;i++ ) {
s = s+i;
trace(s);
}

除了基本用法,偶往往看到些怪异的写法,不知道什么意思,帮助里还找不到,对于咱这些没学过语言的真晕
经高人指点(sso),看了下c语言的教材。。。。原来是这样的~~~~~— —!
小括号一共3个参数,看看都是什么

init 初始赋值
condition 循环条件
next 还是赋值

一般都是后两个参数配合,来退出循环~~ ,比如上边那个for (i=0;i<=100;i++ )
i大于100了就退了~~

运行for的时候,init只执行一次,后两个参数就不一定执行多少次了,看你了。
三个参数其实就是三个表达式,可以是带逗号的表达式,也可以是由多个表达式组成的表达式。而且三个都是可以省略的。
但是分号“;”不可以省略哦

知道这些,一些怪异的写法就很简单了,看一下~

逗号表达式
for(a=0,b=0;a<5;a++,b–){
trace(a)
trace(b)
}
呵呵,或者前边已经有了初值,就不用第一个参数了,~
a = 0;
for (; a<5; a++) {
trace(a);
}
或者第3个参数也不要拉,放到大括号里边
a = 0;
for (; a5)break;
trace(a);
}

总结一下吧,第一个参数省略就省略吧,后两个省略就要小心拉,如果后两个省略就要想办法在后边大括号里把循环结束掉,不然,轻则弹出对话框要求停止脚本,严重了flash会自动关掉哦哦。。。。。没保存的话。。。。。。。。。。
所以还是按套路出牌吧~~~

省略完参数了,再把大括号里的东西省略了吧~,大括号不能省啊!
for(a=0;a<5;trace(a),a++){}

好玩吧~~再搞搞~~

for(a=0; a<5; trace(a++)){}

PHP:10个不常见却非常有用的PHP函数

2011-02-15 wangbin

1. sys_getloadavg()
sys_getloadavt()可以获得系统负载情况。该函数返回一个包含三个元素的数组,每个元素分别代表系统再过去的1、5和15分钟内的平均负载。
与其让服务器因负载过高而宕掉,不如在系统负载很高时主动die掉一个脚本,sys_getloadavg()就是用来帮你实现这个功能的。 不过很遗憾,该函数在windows下无效。
2. pack()
Pack()能将md5()返回的32位16进制字符串转换为16位的二进制字符串,可以节省存储空间。
3. cal_days_in_month()
cal_days_in_month()能够返回指定月份共有多少天。
4. _()
WordPress开发者经常能见到这个函数,还有_e()。这两个函数功能相同,与gettext()函数结合使用,能实现网站的多语言化。具体可参见PHP手册的相关部分介绍。
5. get_browser()
在发送页面前先看看用户的浏览器都能做些什么是不是挺好?get_browser()能获得用户的浏览器类型,以及浏览器支持的功能,不过首先你需要一个php_browscap.ini文件,用来给函数做参考文件。
要注意,该函数对浏览器功能的判断是基于该类浏览器的一般特性的。例如,如果用户关闭了浏览器对JavaScript的支持,函数无法得知这一点。但是在判断浏览器类型和OS平台方面,该函数还是很准确的。
6. debug_print_backtrace()
这是一个调试用的函数,能帮助你发现代码中的逻辑错误。要理解这个函数,还是直接看个例子吧:

$a = 0;
function iterate() {
global $a;
if( $a < 10 )
recur();
echo $a . “, “;
}
function recur() {
global $a;
$a++;
// how did I get here?
echo “\n\n\n”;
debug_print_backtrace();
if( $a 100 apples
# [1] => 110 apples
# [2] => 5 apples
# [3] => 55 apples
# )
natsort($items);
print_r($items);
# Outputs:
# Array
# (
# [2] => 5 apples
# [3] => 55 apples
# [0] => 100 apples
# [1] => 110 apples
# )

9. levenshtein()
Levenshtein()告诉你两个单词之间的“距离”。它告诉你如果想把一个单词变成另一个单词,需要插入、替换和删除多少字母。
看个例子吧:

$dictionary = array(
“php”, “javascript”, “css”
);
$word = “japhp”;
$best_match = $dictionary[0];
$match_value = levenshtein($dictionary[0], $word);
foreach($dictionary as $w) {
$value = levenshtein($word, $w);
if( $value < $match_value ) {
$best_match = $w;
$match_value = $value;
}
}
echo “Did you mean the ‘$best_match’ category?”;

10. glob()
glob()会让你觉得用opendir(), readdir()和closedir()来寻找文件非常蠢。

foreach (glob(“*.php”) as $file)
echo “$file\n”;

服务器的php程序附件下载不完整的问题

2011-01-18 wangbin

最近收拾了一台nginx的web server, 就是之前别人配置过了, 他默认是使用nginx unix socket方式跑的
我为了能稳定点, 把nginx重新配置了一下, 换了tcp/socket方式跑
结果出了点问题, 论坛里所有的稍大的附件, 没有特别具体的大小, 应该在60K左右以上的附件, 无论如何都只能下载47.7K, 论坛跑是的discuz, 默认是跑的php4.4.8, fastcgi方式.

我开始了漫长的检查过程, 一开始我怀疑是nginx的某些配置不对, 但是我使用直接下载是正常的, 说明nginx server是没问题的, 我又开始是程序的问题, discuz的attachment.php提供了4种方式的下载”mode”, 即// read local file’s function: 1=fread 2=readfile 3=fpassthru 4=fpassthru+multiple, 默认是2, 我开始一个一个测试, 使用了4, 可以使用例如讯雷, IDM等软件正常下载, 但是正常用IE或者ff的默认下载还是不行, 至多下载50多K, 继续郁闷中…, 为了确定一下, 我测试了其他论坛软件的php处理附件下载, 效果一样! 痛苦了两天吧
无奈咨询了domin, 没多会他居然给解决啦, 我羞愧中… 原来是fastcgi_temp目录的权限问题, domin都修改成777啦, 结果下载正常!!! 那个…一种解决问题的畅快伴随着两天问题未解决苦恼的顺带的一点点的羞愧…不知道怎么形容
后台因为安全的考虑, 我测试把权限都修改会700, 同时清空了fastcgi_temp目录, 结果还是依旧正常, 问题显而易见啦, 之前的fastcgi_temp目录下的文件不管是属组还是属性都比较错乱了, 因此建议如果是升级php或者对web server做正常的操作, 建议把之前程序生成的缓存目录都清理一下, 这样可以减少很多不必要的麻烦, 但是也要小心, 别删错东西, 最后先mv到backup下, 呵呵

作者: hao32 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.hao32.com/webserver/98.html

首次面试

2010-12-16 wangbin

今天一整天都在期待着去康盛面试。
整体上我对此次的面试表现还算满意吧,稍微有点紧张,20%的话没有说出来。技术我实在是不行,唯一的优势就是做过手握手项目,也不知今天能否给我个二面的机会。

memcache_engine

2010-12-09 wangbin

不得不说,memcache_engine是个很好的东西,根据他官网上的介绍:“The memcache_engine allows memcache to work as a storage engine to MySQL. This means that you can SELECT/UPDATE/INSERTE/DELETE from it as though it is a table in MySQL.”。

说memcache_engine可以让Memcache作为MySQL数据库的一个存储引擎和MySQL集成起来,然后直接使用标准的SQL进行CRUD操作了,太强大了。在写Discuz!的Memcache缓存实现(地址:http://www.ccvita.com/261.html)的时候,虽然PHP可以很容易的操作Memcache,但是仍然没有memcache_engine来的方便和强大。

貌似其官网上也在说memcache_engine目前还是试验性质的。

根据robbin给出的一些示例如下:
CREATE TABLE `a` (
`a` int(11) NOT NULL DEFAULT ‘0′,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=MEMCACHE DEFAULT CHARSET=latin1
CONNECTION=’localhost:6666\;localhost:6688′;

啥也不说了,期待正式版本吧。

Discuz!的Memcache缓存实现

2010-12-09 wangbin

前言:
在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!
Read the rest of this entry »

Memcache基础教程

2010-12-09 wangbin

Memcache是什么
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Memcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解

为什么会有Memcache和memcached两种名称?
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

Memcache的安装
分为两个过程:memcache服务器端的安装和memcached客户端的安装。
所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储
所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。

具体的配置大家可以参考:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html
Memcache分布式部署方案:http://www.ccvita.com/395.html

PHP的Memcache

connect(“192.168.0.200″, 12000);
Read the rest of this entry »

Memcache分布式部署方案

2010-12-09 wangbin

前言
应该是很久之前,我开始研究Memcache,写了一系列的学习心得,比如《Discuz!的Memcache缓存实现》等。后面的好几十条回复也让这篇文章成为了此博客中颇受关注的一员。

同时在百度和Google,关键词Memcache在长达一年多的时间里占据着第二位(第一位是官方),为很多需要了解或者应用Memcache的朋友提供了一些信息,但是我始终觉着还不够,于是本文诞生。

唠唠叨叨说了半天,如果你觉着前面啰嗦,请直接看最后一大段,那是本文的重点。

基础环境
其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定。先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式。

首先,进行Memcache被安装具体可查看:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html;
其次,进行PHP扩展的安装,官方地址是http://pecl.php.net/package/memcache
最后,启动Memcache服务,比如这样

/usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11215 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
启动三个只使用10M内存以方便测试。

Read the rest of this entry »

数据库设计范式的理解

2010-12-09 wangbin

前言
为什么要写这篇文章呢,从去年年底开始,就和很多做技术的朋友交流过,从数据库设计到数据库架构各个方面的内容。有一些朋友执着于ORM,执着于所谓的数据库设计,却忘记了一切技术是要为业务服务这个基石。当然这文章里也有一些自己的理解,想向大家表达。

范式是什么
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

范式的原理

第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 Read the rest of this entry »