推荐
分类目录
日期索引
- 2011 年十二月 (1)
- 2011 年九月 (1)
- 2011 年八月 (5)
- 2011 年七月 (1)
- 2011 年六月 (1)
- 2011 年五月 (2)
- 2011 年四月 (2)
- 2011 年三月 (2)
- 2011 年一月 (1)
- 2010 年十二月 (3)
- 2010 年十一月 (8)
- 2010 年九月 (5)
- 2010 年七月 (1)
- 2010 年六月 (6)
- 2010 年五月 (10)
- 2010 年四月 (18)
- 2010 年三月 (8)
- 2010 年一月 (5)
- 2009 年十二月 (1)
- 2009 年十一月 (12)
- 2009 年十月 (3)
- 2009 年九月 (6)
- 2009 年八月 (8)
- 2009 年七月 (13)
- 2009 年六月 (5)
- 2009 年五月 (11)
- 2009 年四月 (12)
- 2009 年三月 (3)
- 2009 年二月 (9)
- 2009 年一月 (5)
- 2008 年十二月 (8)
- 2008 年十一月 (3)
- 2008 年十月 (6)
- 2008 年九月 (3)
- 2008 年八月 (15)
Friendship Link
我的CASE
资料链接
功能
标签云
最近评论
- wangzii 发表在《软件推荐:jQuery代码调试器jQueryPad》
- wangzii 发表在《jquery如何停止ajax请求?》
- wangzii 发表在《惊现牛人:JS版高仿LINUX》
- Always.Life 发表在《Ubuntu下通过SSH翻墙》
- welpher yu 发表在《关于CSS控制打印时强制分页》
数据存储 归档
-
[转]mysql_pconnect的水挺深,apache下的数据库长连接
在 2011年09月14日 上发表 | 一条评论服务器上一直用着mysql_pconnect,之前听说它会出现各种各样的问题,但服务器一直没事,也就没去管。今天看这篇文章,才知道原来mysql_pconnect有这么多的道道。 原文地址:http://www.cnblogs.com/funlake/archive/2011/09/08/2171822.html php的mysql持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现,这家伙也不容易啊,要看apache的脸色,还得听mysql指挥。 对于做为apache模块运行的php来说,要实现mysql持久化连接,首先得取决于apache这个web服务器是否支持Keep-Alive。 Keep-Alive Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条tcp请求,这个请求成功一次就得需要来回握三次手才能确定,成功以后,浏览器利用socket tcp连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?tcp连接需要三次握手,也就是来回请求三次方能确定一个tcp请求是否成功,然后tcp关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上了,能不能一次socket tcp连接发送多次http请求呢?于是Keep-Alive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下apache,让它默认就是Keep-Alive持久连接模式(apache必须1.2+才能支持Keep-Alive).在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久tcp最多允许的请求数,如果过小,很容易在tcp未过期的情况下,达到最大连接,那下次连接就又是新的tcp连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒). 好了,重启apache,测试一下,赶紧写行东西 <?php echo "Apache进程号:".getmypid(); ?> 很简单,获取当前php执行者(apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,…15,16。好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的apache进程了,为什么15秒后就变成新的进程了?记得我们在apache里设置的KeepAliveTimeout吗?它的值就是15秒.现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,apache就会断开socket了,那么下次同一客户端再次请求,apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求给了同一个apache进程。 浏览器是怎么知道不需要重新进行tcp连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并发送http请求,于是乎浏览器就知道应该怎么做了. php怎么做 那么,php的mysql连接资源是怎么被hold住的呢,这需要查看php的mysql_pconnect的函数代码,我看了下,大概的做法就是根据当前apache进程号,生成hash key,找hash表内有无对应的连接资源,没有则推入hash表,有则直接使用。有些代码片段可以说明(具体可查看php5.3.8源码ext/mysql/php_mysql.c文件690行php_mysql_do_connect函数) #1.生成hash key user=php_get_current_user();//获取当前php执行者(apache)的进程唯一标识号 hashed_details_length = spprintf(&hashed_details, 0, "mysql__%s_", user);//hashed_details就是hash key #2.如果未找到已有资源,就推入hash表,名字叫persistent_list,如果找到就直接使用 /*... -
修复mysql 5.1升级至5.5出现的BUG: Cannot load from mysql.proc. The table is probably corrupted
在 2011年07月18日 上发表 | 没有评论LINUX下将mysql从5.1升级至5.5后,发现存储过程不能用了。创建和使用存储过程时就会提示Cannot load from mysql.proc. The table is probably corrupted。 查遍整个百度,结果还是印证了那一句话“天下文章一大抄”啊! 所有的文章几乎都是这么说的 解决方法非常简单,运行mysql_upgrade命令即可。此命令会在数据目录下生成一个文本文件mysql_upgrade_info,里面的内容为升级后的数据库版本。 但不知道什么原因,在我这里无效,升级后各种升级OK,但仍然报这个错误。 最后还是求助GOOGLE吧 http://bugs.mysql.com/bug.php?id=50183 原因是mysql.proc升级时有个字段没有升级成功。 在5.1中mysql.proc表的comment字段是varchar(64): `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', 但在5.5中应该是text: `comment`... -
CouchDB
在 2010年06月30日 上发表 | 3 条评论这篇文章纯粹是为了记录这个新名词,转自百度百科 CouchDB简介: CouchDB是用Erlang开发的面向文档的数据库系统,最近 刚刚发布了0.7版本,这也是第一次公开发布的版本。CouchDB不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的 index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储 系统。 CouchDB的特点: 一、CouchDB是分布式的数据库,他可以把存储系统分布到n台物理的节点上面,并且很好的 协调和同步节点之间的数据读写一致性。这当然也得以于Erlang无与伦比的并发特性才能做到。对于基于web的大规模应用文档应用,然的分布式可以让它 不必像传统的关系数据库那样分库拆表,在应用代码层进行大量的改动。 二、CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的 index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。 三、CouchDB支持REST API,可以让用户使用JavaScript来 操作CouchDB数据库,也可以用JavaScript编写查询语句,我们可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系 统会是多么的简单和方便 其实CouchDB只是Erlang应用的冰山一角,在最近几年,基于Erlang的应用也得 到的蓬勃的发展,特别是在基于web的大规模,分布式应用领域,几乎都是Erlang的优势项目。 -
mysql “group by ”与”order by”的研究
在 2010年06月11日 上发表 | 没有评论下面文章中研究的问题是大家经常会遇到的,尤其是做BBS、CMS一类的项目。文章分析的非常透彻,分享之。原文 这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况 这种需求,我想很多人都遇到过。下面是我模拟我的内容表 CREATE TABLE `test` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `category_id` INT(10) NOT NULL, `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY... -
服务器从APACHE更换为NGINX 记
在 2010年04月26日 上发表 | 没有评论据网上大牛们说,nginx性能比apache好,我又经不住诱惑,把服务器从apache更换为nginx了,参考了N多文章。因为网上能找到的文章都是他们自己安装的记录,根本不会考虑别人会出现的各种情况,就像我要安装nginx,是从APACHE更换过来,这类更新服务器软件的文章就少。总之,还算顺利,仅花了一个小时就搞定了,现在主要架构是ubuntu+nginx+php+fastcgi+mysql,性能方面还没测试(从目测和心理作用上,感觉是快了点),目前发现的主要一个问题就是php5-cgi进程过多,还不知道从哪里控制。过后再研究吧。