Warning: curl_exec() has been disabled for security reasons in /pub/host/sunboyu/sunboyu/www/wp-includes/http.php on line 1022
原创技术 一个程序猿 孙小一,孙小二,PHP,MYSQL,LINUX,APACHE,原创技术,扯淡

设计模式研究

作者 : admin 于 2010年12月02日, 22:47:27
2010
12-2

研究PHP设计模式其实很久,不过真正在使用上却用的不是很多。但凡设计模式都用在大型负载的商业软件商,而对于web开发,尤其一些短平快的产品,设计模式显得不是那么重要。而只有一些非常核心和通用的部分,我们加以封装,主要是方便复用。

通过最近做一些项目,松散的设计明显不能满足项目的需求,随意的代码虽然能加快项目进度,但也造成很严重的技术透支。

重新认识框架,可以得出以下体会:

框架的确是限制人的,但不是技术的限制,不是思想的限制,而是规范合作的限制。

项目的设计规划人员要付出更多,其设计了框架的核心后,开发人员在你的思路下进行开发,你的一点点错误会在几个人身上得到成倍的放大。

坚持一种设计思路,即使已经走了很多弯路,但起码保证这些弯路要走踏实,而不是一条泥泞的弯路。

一个优化的框架不仅是完成基本功能,更要让开发人员感觉爽,这是最重要的(很难实现)。

最后,继续琢磨我的框架吧。

—————————-题外话——————————–

最新学了一段时间的C,包括我以前也提倡,用写C的态度来写PHP。写C语言,每个变量,每块内存都要完全规划在你的脑子里,处理不好,程序是绝对跑不动的。做PHP项目,也要注意这些细节,虽然PHP是弱类型的语言。当然,做一个项目,也要去考虑方方面面。

学习PHP开发的一些资源

作者 : admin 于 2010年11月09日, 22:42:26
2010
11-9

http://blog.csdn.net/alexdream/archive/2008/03/24/2213344.aspx

http://devzone.zend.com/node/view/id/1022

http://blog.csdn.net/alin0725/archive/2007/04/08/1556460.aspx

http://devzone.zend.com/article/1024-Extension-Writing-Part-III-Resources 这篇文章不错,讲PHP如果管理连接符

http://www.phpbbchina.com/wiki/index.php/%E7%BC%96%E5%86%99PHP%E6%89%A9%E5%B1%95 中文教程

使用MYSQL C api操作mysql

作者 : admin 于 2010年10月31日, 21:13:06
2010
10-31


#include
#include
#include “mysql.h”

int main(int argc, char **argv)
{
MYSQL mysql, *sock;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
char sql[160];
char host[20];
char user[20];
char pass[20];
char data[20];
int i;
if(argc!=6)
{
fprintf(stderr, “Please input you host, username, password, dbname, sql\n\n”);
exit(0);
}
sprintf(host, argv[1]);
sprintf(user, argv[2]);
sprintf(pass, argv[3]);
sprintf(data, argv[4]);
sprintf(sql, argv[5]);
mysql_init(&mysql);
if(!(sock=mysql_real_connect(&mysql, host, user, pass, data, 0, NULL, 0)))
{
fprintf(stderr, “Can’t connect to engine!\n%s\n”, mysql_error(&mysql));
perror(”");
exit(0);
}
if(mysql_query(sock, sql))
{
fprintf(stderr, “Query failed (%s)\n”, mysql_error(sock));
exit(1);
}
if(!(res=mysql_store_result(sock)))
{
fprintf(stderr, “Couldn`t get result from %s\n”, mysql_error(sock));
exit(1);
}
printf(”number of fields returned:%d\n”, mysql_num_fields(res));
while(row=mysql_fetch_row(res))
{
for(i=0;i {
printf("%d:%s ",i,row[i]);
}
printf("\r\n");
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return 0;
}

编译参数:gcc mysql.c -o mysql -I /usr/include/mysql -L /lib/mysql -lmysqlclient

缸炉烧饼

作者 : admin 于 2010年10月24日, 16:33:21
2010
10-24

最近做梦,梦见了老家的缸炉烧饼。在北京找了数多地方,没找到卖缸炉烧饼的。流连之际,发现有人跟我一样怀念着家乡不起眼的小吃。遂转载一故乡作家的文章。

土豆网:缸炉烧饼的介绍

缸炉烧饼

  正如到北京不吃全聚德烤鸭就不算到北京一样,如果到了平山不吃缸炉烧饼,那就不能说到过平山。

  说起平山,可能没几个人知道这个小小的县城,但说起革命圣地西柏坡,恐怕用如雷贯耳来形容一点儿也不过分,而这个大名鼎鼎的西柏坡,就是平山县的一个小村庄。从1990年离开家乡平山,到今年已经整整二十年了。二十年间,家乡的很多东西都如过眼烟云,并没有在我心中留下多少印象。倒是这缸炉烧饼,总如儿时那样的亲切,以至于每次回老家,都回吃上一次,甚至于有亲戚朋友回去,都委托他们带回来几个尝尝鲜。

  面食里叫烧饼的并不少,无非是放了油盐,和好面后上面沾上芝麻,用锅烙得金黄。但缸炉烧饼却有它的独特之处,一是方形,据我了解,各地的烧饼样式不少,但大部分是圆的,仅有这缸炉烧饼,便便做成了方形,原因当然不得而知,但这便从形状上与其他的烧饼分开了;二是有细分类,大致可分为;普通、油酥、牛肉罩等;三是制作方式不同,大部分烧饼都是用锅烙,而缸炉烧饼却是像烤红薯一样,做好后放在一个铁筒中烘烤。

  刚出炉的烧饼,表面焦黄,如上中间有一个山包样的大鼓,上面粘着白白的芝麻,咬一口酥中带脆,满口清香,油酥烧饼,更是酥软可口,至于牛肉罩的,是在烧饼的表面放了一层细如肉松的牛肉粒,一口下去,不仅香气四溢,而且烤牛肉的香味久久不散,晚上连牙都舍不得刷了。

  记得很小的时候,每到赶集,总是跟在家长后面缠着要去,其实也没什么东西可买,只是为了2分钱一个的烧饼,但因为家里条件实在不好,就是这样的要求一年也只能实现有限的几次。于是又求了家长在家里做,面和油都不错,但就是做不出那个味道,但有总比没有的好,吃不上买的,自己做的也可以解一下馋。每年年底,姥爷都会来家里看看,对于他带来的其他东西,我们一概不问,只是找他书包里的那几个缸炉烧饼。久而久之,姥爷每次来,也总会带一包缸炉烧饼来。

  后来,缸炉烧饼又长到5分一个,一角一个,两角一个,现在,已经是四角一个了。但我对于缸炉烧饼的情节,不仅没有减退,而是越来越浓重了。

  四个角的缸炉烧饼就像是一座城,一座建在我心中的城,一座没有城门的城。不论走到哪里,我总也无法突破它,也从来没有想过要突破它。

密码保护:制定新的学习计划

作者 : admin 于 2010年10月17日, 22:35:08
2010
10-17

这是一篇受密码保护的文章。您需要提供访问密码:


使用Lucene 构建强大的discuz 论坛搜索模块

作者 : admin 于 2010年07月27日, 14:21:18
2010
07-27

在我搞完公司的论坛优化后,我一直想写一个圈套的dz性能优化的方案。当时的全文检索使用的是公司内部某人开发的检索系统,没有开源,所以我做此方案来实现。
此文刚打完草稿,处于调试通过的状态。没有形成具体可用的用户文档。希望在这个底稿的基础上,朋友能给予测试和支持,以鼓励我做出一套完整的方案。

下载:lucene_dz

欢迎加入QQ讨论群:41886598

使用XDEBUG进行PHP性能分析

作者 : admin 于 2010年07月22日, 09:47:49
2010
07-22

最近给论坛做性能优化,写了一个文档,在线编辑器不好用,就写了个wps文档。

文件下载:使用XDEBUG进行PHP性能分析

discuz7.2针对session表的分析和优化

作者 : admin 于 2010年07月07日, 17:04:54
2010
07-7

广告时间:新建一个qq群,欢迎大家进来讨论discuz的性能优化 qq群 41886598 接头暗号:dz

引子

最近一个朋友的论坛由discuz转化为phpwind,因为discuz在负载较大的情况下频频当机,但在我观察,瓶颈基本是数据库,并且负载最高的表定位为sessions表。之前我们论坛在进行了大的改进后,除了分表这些基本优化,改动最大的就是sessions表。我们使用张宴写的tcsql来存储用户的session信息,经推算,系统负载应该能支撑10~20w人同时在线。

这个10~20w人只是推测,因为原来我们优化sessions表但没有切换到tcsql的时候,最高支撑到4~6w人-也就是某次游戏临时维护,用户大量涌向论坛,在大概4~6w用户的情况下,论坛崩溃。而tcsq的读写效率远远高于mysql,因此推算tcsql代替sessions表的情况下,论坛至少可以承载10~20w人同时在线。
毕竟tcsql用C进行开发,而且没有开源。去年的文章发表后,一直有朋友在探讨dz的优化问题,但那几个方案都依赖了第三方的应用。这次,我想到的是在不依赖其他应用的前提下,完成dz的sessions表优化。

这里,我对sessions表的访问情况作了一个统计:

一个没访问过的论坛,我作为一个用户:1、进入首页 2、ajax登录 3、进入某板块 4、点击某帖子。4个操作,统计session表的操作:select 5次,insert 2次,delete 2次,update,3次,select联查,4次,一共16次操作。对于一个成熟的网站,大部分用户的操作连起来,统计数据跟我统计的会有区别,但从全局看来,sessions表的确是mysql查询数的一个瓶颈。

以子之矛

对于这个问题,dz程序其实是有解决方案的。

  1. if($pvfrequence && $discuz_uid) {
  2. if($spageviews >= $pvfrequence) {
  3. $pageviewsadd = ', pageviews=\'0\'';
  4. $db->query("UPDATE {$tablepre}members SET pageviews=pageviews+'$spageviews' WHERE uid='$discuz_uid'", 'UNBUFFERED');
  5. } else {
  6. $pageviewsadd = ', pageviews=pageviews+1';
  7. }
  8. } else {
  9. $pageviewsadd = '';
  10. }

这个功能是统计用户浏览量的一个小东西,$spageviews是保存在用户session表的一个变量,如果每次浏览都更新用户表的浏览数,member表的负担是很大的。dz的程序员就用客户端更新数据这种方式,把数据更新动作放在了session表,每$spageviews个周期更新一次,有效降低了member表压力,而且此配置在网站后台作出了用户接口。

为什么这个问题可以解决,只不过把压力进行了转移,而sessions表的压力为什么不能解决一下呢?我百思不得其解。

攻子之盾

member的压力可以转移到sessions表,当然sessions表的压力就不能再转移给别的表了,这样处理,不管转移到哪里,都是数据库的压力,所以,得想办法转移到数据库之外。

再考虑为什么member的压力可以转移:因为用户浏览数这个统计项,用户每必要也不需要实时看到更新。

而用户的session信息是用户实时要用,并且有部分权限控制方面的东西,是非常必要的,所以,必须实时获取。既然其他表的压力也都来了sessions表,那更新也必然需要在sessions表中做。这个事情,不就是php的session应该做的事情么?

再考虑sessions表除模拟php的session功能外的其他功能:

1、状态传递:需要把用户的当前状态实时传递给其他用户。在线状态、用户所在位置等。

2、统计分析:在dz可以看到当前多少用户在线,对于单纯使用php session功能是无法满足的,故dz采用sessions表来替代这个功能。

现在就设计一个机制,既满足用户session的功能,又满足统计分析的功能。当然,用php+mysql了。需要及时更新的信息存储于php的session,而需要统计的信息分阶段更新到mysql。

流程如此 用户创建一个mysql记录,创建一个session,session的过期机制类似于mysql表。每次访问,取session信息,如果session信息不存在,取sessions表中的信息。像用户浏览次数这类数据,可以每过一段时间更新到mysql中。用户session每次更新,也只是更新session数据,而session机制的并发性和效率,远远高于mysql的。如此解决,既不阉割原有的功能,又不会对环境造成很严重的依赖,只要支持phpsession的环境即可。

总结

在修改完成后,我又进行了测试,这次session表的访问频度已经降到了原来的1/3之下,我想,对于大型的论坛,起码能节约1/3的服务器吧。这样改动也并不是没有缺点的:统计就会有延迟和偏差。因为中间用户突然离开,会损失sessions表更新的及时性甚至会损失这部分数据。如果严重依赖论坛自己某些统计功能的话,那这种方式欠妥,但对于已经使用第三方统计或者对那部分数据不很敏感的论坛用户,这种方案还是非常适合的。

附言:dz的大多数产品设计都采用sessions表这种设计思路,因此,这个思路可以优化几乎所有的dz产品。

tips:如何定位sessions表的负载: 在mysql数据类的query方法里增加如下代码,数据少可以用肉眼数,数据多可以写个脚本去分析

  1. $handle = fopen("sql.log","a+");
  2. fwrite($handle,str_replace("\r\n","",$sql)."\r\n");
  3. fclose($handle);

附上代码:

dz

最近的感想

作者 : admin 于 2010年06月05日, 20:25:28
2010
06-5

1、我总在努力学习,学习技术。技术好有用么?有用。但能干好活么?态度。

2、第二个目标-让自己坚持。坚持自己的技术方向,这个我做到了,在工作中能不能做到,问号?叹号。做得不够。

3、尊重别人的劳动成果。无论是工作中还是生活中。

4、三人行必有我师。高手往往低调。

5、买书是比较廉价的学习方式。

配置php下的mysql连接池-sqlrelay

作者 : admin 于 2010年05月20日, 22:13:50
2010
05-20

本文主要介绍sqlrelay的配置安装。通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接。

什么是sqlrelay?

Sqlrelay是一个开源的数据库连接池软件。它可以预建立数据库连接,同时可作为数据库连接代理和负载均衡器使用。

SQL Relay is a persistent database connection pooling, proxying and load balancing system for Unix and Linux.

Sqlrelay项目主页 http://sqlrelay.sourceforge.net/
Sqlrelay源码下载 http://sqlrelay.sourceforge.net/download.html

Sqlrelay原理示意:

连接池示意图:

pool

负载均衡示意图:

router

1、 sqlrelay的安装

下载源代码(因为不能yum或者apt-get)
#wget http://prdownloads.sourceforge.net/sqlrelay/sqlrelay-0.41.tar.gz?download
解压缩
#tar –zxvf sqlrelay-0.41.tar.gz
配置
#cd sqlrelay-0.41
#./configure –prefix=/opt/sqlrelay –with-mysql-prefix=/opt/mysql-5.0.22 –with-php-prefix=/opt/php-5.2.6 –disable-python
注释:因为我用的python版本跟sqlrelay版本稍有纠结,所以显式得去声明不增加python下的api。
为啥我软件编译目标路径是/opt,我也不知道,也许第一次看见某人这么做的,我也就一直这么做。大家别问了,没啥道理,其实编译到 /shit 下边,也不影响正常的运行。
查看编译好的文件:
#cd /opt/sqlrelay
#ls
Bin etc include lib share var
如果出现下列目录,安装“基本完毕”。
2、 sqlrelay的配置
sqlrelay有个问题,如果指定了prefix,而$prefix/bin/目录如果不在环境变量中,则主进程运行是有问题的。因为,编译完后,我们在/etc/profile中增加一条命令:
PATH=$PATH:/opt/sqlrelay/bin #此目录就是你prefix的目录

配置文件:

  1. < ?xml version="1.0"?>
  2. < !DOCTYPE instances SYSTEM "sqlrelay.dtd">
  3. <instances>
  4. <instance id="mysqlpool" port="9002" socket="/tmp/sqlrelay.socket" dbase="mysql" connections="20" maxconnections="50" maxqueuelength="5" growby="1" ttl="60" maxsessioncount="10" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0" reloginatstart="no" timequeriessec="-1" timequeriesusec="-1">
  5. </instance>
  6. </instances>

这样,就配置了一个id为mysqlpool的连接池。
Port=9002 sqlrelay提供服务的端口是 9002
Dbase=mysql 要连接mysql
Connections=20 起始创建20个连接
Maxconnections=50 最大连接数 50
其他参数可以自己琢磨,在具体应用中还需要修改后边的参数,都啥含义,看字面或者看手册皆可。

启动sqlrelay:
#./sqlr-start –id mysqlpool //启动刚才定义的id为mysqlpool的连接池
关闭sqlrelay
#./sqlr-stop

3、 sqlrelayPHP api的配置

sqlrelay的PHP api扩展在编译的时候已经生成,在php的./lib/php/extensions/no-debug-non-zts-20060613/ 目录下,修改php.ini中extension_dir的值:extension_dir=”/opt/php-5.2.6/lib/php/extensions/no-debug-non-zts-20060613/”
而后增加引用声明:extension=sql_relay.so

重启php,执行 php –m 查看是否有 sql_relay 如果有,则证明配置成功。

4、sqlrelay的使用

$con=sqlrcon_alloc(“mysqlpool”,9002,””,”root”,”123456”,0,1);
Var_dump($con);

这样,利用sqlrelay的phpapi,就可以跟mysql建立链接。

————————————————————————————————-

另求高并发的测试环境搭建方案,有经验的朋友可以提供相关信息。注:本人只有非常SB的惠普V3000系列高发热强雪花屏笔记本一台做测试环境。

 Page 3 of 30 « 1  2  3  4  5 » ...  Last »