Apache 中 KeepAlive 配置的合理使用

在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP ,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP ,可以提高用户访问速度。

那么我们考虑3种情况:
1。用户浏览一个网页时,除了网页本身外,还引用了多个 . 文件,多个 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript. 文件,一个图片文件。
3。 用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive

下面我来分析一下原因。

在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?

先看看理论分析。
(更多…)

标签Tags:,

AJAX的各种控件和类库

Ajax控件和类库现在真的太多了,不知不觉中增加了Ajax的神秘性和复杂性,看到版内很多人为此费解和伤神,决定发此贴谈谈本人对Ajax的观点,希望能让大家对Ajax有一个本质的认识。

  观点一:Ajax和服务器端技术毫不相关

  严格的说,与传统web开发相比,Ajax是完完全全的客户端技术。由于很多控件封装了客户端和服务器端的通信过程,因此很多问题也因通信而起。事实上,不论何种Ajax技术,服务器端都是返回的一个纯文本流,再由客户端来处理这个文本。这段文本可以是xml格式,也可以是一个Html片段,也可以是一段JavaScript脚本,或者仅是一个字符串。服务器端仅仅是作为一个数据接口,客户端使用XMLHttpRequest对象来请求这个页面,服务器端在页面内写入结果文本,这个过程和普通的web开发没有任何区别。所不同的只是,客户端在异步获取结果后,不是直接显示在页面,而是由客户端的Javascript脚本处理后再显示在页面。至于各种控件所谓的能返回DataSet对象,Date对象,或者其他的数据类型,都是封装了这个处理过程的结果。

  观点二:DOM模型是Ajax最本质的技术

  之所以没有把XMLHttpRequest列为最本质的技术,因为本人觉得它实在是太简单了,它只是可以让浏览器在后台请求一个页面,并将其内容交给JavaScript处理。真正的核心应该是:DOM模型,即文档对象模型。在DOM模型里,Html标记都被认为是一个对象,例如:div对象,table对象等等。DOM模型就规定了这些对象所具有的属性、方法和事件。通过这些性质,可以对一个已经显示于浏览器的页面进行内容的修改,例如增加节点、修改节点位置,删除节点等等。而不仅仅是一个innerHTML属性这么简单,虽然这是一个很有用的属性。

  观点三:在使用Ajax控件前理解它们的实现

  使用Ajax控件的确可以提高效率,但如果你空中楼阁般使用控件,那就得不偿失了。从一个控件换到另外一个控件又会有一个漫长的学习曲线。所以应该从底层了解其,况且Ajax实在不是什么高深的技术。其实任何东西的最底层其实都是简单的,但如果封装了这些底层的东西,事情会变得复杂和难以理解。以Asp.net为例,它的定制特性可以使得只要在方法前加上[ajax method]类似这样的标志就可以称为一个异步方法,相信这使得Asp.net的Ajax开发显得更加“高效”或者是“神秘”,而更多的事情则被封装了。同样记住一条,任何对服务器端的请求仅仅是返回纯文本,我们不一定要依赖于封装好的处理过程,而完全可以自己来实现。

  观点四:学好JavaScript

  在大多数人看来,JavaScript总不是那么一种正规的语言,随便copy一段就碰巧能运行,学过c之类的人,一看也能看懂,而且在浏览器中常常有脚本错误提示,所以潜意识觉得总不能付之以大任。事实上,要学好Ajax,这就完全是一种错误的看法。javascript作为一种脚本语言,其语法的确不是很严格,但并不妨碍其完成诸多复杂的任务,没有JavaScript,就没有Ajax。所以本人强烈建议,学Ajax前,一定要好好研究一番JavaScript,一般来讲,如果能顺利看懂prototype框架的代码(如:prototype-1.3.1.js),你的JavaScript水平就基本过关了。同时对DOM模型也可以算有一个基本的了解。

  观点五:Ajax点缀:

  用JavaScript控制CSS其实很简单,基本上每个DOM对象都有一个style对象,只要把css属性里的”-”去掉,并让随后的字母变为大写就可以作为属性使用了,例如:element.style.backgroundColor=”#f00″;在css是:选择符 {background-color:#f00}

  一口气说这么多,希望对大家有点用处。

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , ,

使用Ajax时的十个常犯的错误

上个月我发现许多Web2.0网站大量运用了ajax,但是其中有些很奇怪,因为他们的速度比起前慢了,并且有时候不起作用(在移动设备上),我总结了十条用Ajax的错误(平台无关)

1、 不要通过把整个页面都放在UpdatePanel中更新整个页面。在你运行网页时需要节省时间,不要更新那些可以用javascript and DHTML (DOM)的部分。

2、 要始终记得有这么几种访问者,他们不能用JavaScript或者用的版本比较老的浏览器或者他们对JavaScript支持不好,比如说移动设备。如果这些都不支持,你的访问者能看到什么?

3、 在客户端浏览器缓存相同的请求或者在we服务器端执行缓存。最好的例子是自动完成个下拉菜单,他们的填充在任何时刻都是相同的,一个有错误写法的自动完成的写法可以减慢你的Web服务器(数据库服务器),因为那样会有比起以前用IsPostBack更多地请求。想一下不停的按F5刷新你的网页的情形。如果你有层叠的下拉菜单你就会结算更多地请求。

4、 在你运用CSS或JavaScript时,不要运行,并发的或者运行很长时间的Ajax请求,一般的浏览器只能有两个并发的http连接(我知道可以给变这个,但是默认的还是设为两个)。如果在读取图片的时候由很多Ajax请求的话,速度会变得很慢。

5、 什么时候都用异步调用的方法发送XMLHttpRequest.。如果你要用同步的方法也是没有请问题的,你的浏览器不会因为网络问题或是连接速度慢而冻结的

6、 试着让你的web应用使用一个很慢的网络连接,再尝试用快的TCP/IP连接

7、 你的web应用是作为桌面程序的替代品?你注意观察过一般浏览器在运行你的Web应用一小时,两小时或者几天时内存的使用。不是所有人都有你那样好的机器。

8、 检查在你返回XMLHttpRequest时你的http请求状态代码(status code),那会有一些常见的网络错误像是不可获得的DNS,Http Server error 500 ,你曾经检查过状态代码(status code),它可以告诉你浏览器在一个为连接的模式

9、 试着禁止XMLHttpRequest object!用IE7你能用native object代替ActiveX object,但是你也可以禁止native object。

10、检查你AJAX requests的安全性!你简单的打开了你的数据访问层吗?充分运用FormsAuthentication和PrincipalPermissions。是不是任何人都可以建立一个请求(不只是点击一个链接)?

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

CSS 中的太极拳口诀

在做网站过程中,常常要修改网站模板,而模板受css控制。如果在用CSS设计布局时遇到BUG,请认真阅读以下内容,非常容易记忆的,不知道哪位高人把CSS BUG编成了*****了!看看好不好记住呢?
一、IE边框若显若无,须注意,定是高度设置已忘记;
二、浮动产生有缘故,若要父层包含住,紧跟浮动要清除,容器自然显其中;
三、三像素文本慢移不必慌,高度设置帮你忙;
四、兼容各个浏览须注意,默认设置行高可能是*****;
五、独立清除浮动须铭记,行高设无,高设零,设计效果兼浏览;
六、学布局须思路,路随布局原理自然直,轻松驾驭html,流水布局少hack,代码清爽,兼容好,友好引擎喜欢迎。
七、所有标签皆有源,只是默认各不同,span是无极,无极生两仪—内联和块级,img较特殊,但也遵法理,其他只是改造各不同,一个*号全归原,层叠样式理须多练习,万物皆规律。
八、图片链接排版须小心,图片链接文字链接若对齐,padding和vertical-align:middle要设定,虽差微细倒无妨。
九、IE浮动双边距,请用display:inline拘。
十、列表横向排版,列表代码须紧靠,空隙自消须铭记。

标签Tags:, , , , , , , , , , , , ,

图片轮换类,IE7、OP、FF、Chrome测试通过

<html>
<head><>新闻图片轮换类</>
<script type=”text/”>
var fs = new FadeSlideClass();
fs.Width = 430;
fs.Height = 250;
fs.AddImage(“http://www.5bay.cn/Test/Image/001.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/002.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/003.jpg“, “//g.cn”, “去Google”);
fs.AddImage(“http://www.5bay.cn/Test/Image/004.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/005.jpg“, “#”, “新闻标题”);
fs.RenderTo(“divStage”);

/* 以下代码构造轮换类 */
function FadeSlideClass()
{
this.Width = 450;
this.Height = 300;
this.BorderColor = “#ddd”;
this.CurrentColor = “green”;
this.Delay = 5000;
var divContainer = document.createElement(“div”);
var divImage = document.createElement(“div”);
var ulList = document.createElement(“ul”);
var me = this;
var arrImg = new Array;
this.Tag = divContainer;
this.AddImage = function(strImageUrl, strLink, strTitle)
{
   arrImg.push(arguments);
}
this.RenderTo = function(container)
{
   if(typeof container == “string”) container = document.getElementById(container) || container;
   if(typeof container == “string”) return setTimeout(function(){ me.RenderTo(container); }, 100);
   if(!arrImg.length) throw new Error(“尚未添加图片。”);
   var cssFloat = typeof ulList.style.cssFloat == “string” ? “cssFloat” : “styleFloat”;
   divContainer.style.width = this.Width + “px”;
   divContainer.style.height = this.Height + “px”;
   divImage.style.width = Math.round(this.Width * (arrImg.length – 1) / arrImg.length) + “px”;
   divImage.style.height = this.Height + “px”;
   divImage.style[cssFloat] = “left”;
   ulList.style.width = (this.Width – parseInt(divImage.style.width)) + “px”;
   ulList.style.height = this.Height + “px”;
   ulList.style.margin = “0px”;
   ulList.style.padding = “0px”;
   ulList.style[cssFloat] = “left”;
   divContainer.style.overflow = “hidden”;
   divImage.style.overflow = “hidden”;
   ulList.onmouseover = function(){ clearTimeout(me.Handler) };
   ulList.onmouseout = function(){ AutoPlay(); };
   InitImage(2);
   InitList(arrImg.length);
   container.appendChild(divContainer);
   divContainer.appendChild(divImage);
   divContainer.appendChild(ulList);
   LiMouseOver.call(ulList.firstChild);
   AutoPlay();
   this.AddImage = function(){ throw new Error(“该方法已过时。”); }
}
this.Display = function(imgThumb)
{
   var img = divImage.lastChild.lastChild;
   var opa = new OpacityClass(img);
   opa.Set(20);
   img.src = imgThumb.src;
   img.parentNode.href = imgThumb.parentNode.href;
   img.parentNode.title = imgThumb.parentNode.title;
   clearInterval(ulList.Handler);
   ulList.Handler = setInterval(function(){
    if(opa.Add(5) >= 100)
    {
     divImage.firstChild.lastChild.src = img.src;
     clearInterval(ulList.Handler);
    }
   }, 25);
}
function LiMouseOver()
{
   if(this == ulList.oldLi) return;
   if(ulList.oldLi) ulList.oldLi.style.borderColor = me.BorderColor;
   this.style.borderColor = me.CurrentColor;
   ulList.oldLi = this;
   me.Display(this.firstChild.firstChild);
}
function InitImage(count)
{
   if(–count) arguments.callee(count);
   var a = document.createElement(“a”);
   a.target = “_blank”;
   divImage.appendChild(a).style.position = “absolute”;
   var img = new Image;
   img.width = parseInt(divImage.style.width);
   img.height = me.Height;
   img.border = 0;
   if(!a.appendChild(img).filters) img.style.opacity = 1;
   else img.style.filter = “alpha(opacity=100)”;
}
function InitList(count)
{
   if(–count) InitList(count);
   var isIeNoDtd = document.compatMode != “1Compat” && /msie/i.test(navigator.userAgent);
   var data = arrImg[count];
   var thumbWidth = parseInt(ulList.style.width);
   var thumbHeight = Math.round(me.Height / arrImg.length);
   var li = document.createElement(“li”);
   li.style.overflow = “hidden”;
   li.style.width = (isIeNoDtd ? thumbWidth : thumbWidth – 4) + “px”;
   li.style.height = (isIeNoDtd ? thumbHeight : thumbHeight – 4) + “px”;
   li.style.borderWidth = “2px”;
   li.style.borderStyle = “solid”;
   li.style.borderColor = me.BorderColor;
   var a = document.createElement(“a”);
   a.target = “_target”;
   a.href = data[1];
   a.title = data[2];
   var img = new Image;
   img.border = 0;
   img.width = thumbWidth;
   img.height = thumbHeight;
   img.src = data[0];
   img.style.verticalAlign = “top”;
   img.style.margin = “-2px”;
   a.appendChild(img);
   li.appendChild(a);
   li.style.listStyle = “none”;
   li.onmouseover = LiMouseOver;
   ulList.appendChild(li);
}
function AutoPlay()
{
   me.Handler = setTimeout(function()
   {
    LiMouseOver.call(ulList.oldLi.nextSibling || ulList.firstChild);
    AutoPlay();
   }, me.Delay);
}
function OpacityClass(tag)
{
   var isFilter = !!tag.filters;
   var obj = isFilter ? tag.filters.alpha : tag.style;
   this.Set = function(value)
   {
    obj.opacity = isFilter ? value : value / 100;
    return this;
   }
   this.Add = function(value)
   {
    var opa = isFilter ? obj.opacity : obj.opacity * 100;
    opa += value;
    if(opa > 100) opa = 100;
    obj.opacity = isFilter ? opa : opa / 100;
    return this;
   }
   this.valueOf = function()
   {
    return isFilter ? obj.opacity : obj.opacity * 100;
   }
}
}
</script>
</head>
<body>
<div id=”divStage”></div>
</body>
</html>

标签Tags:, , , , , , , , , , , , , , , ,

nginx的rewrite规则

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全) (更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , , ,

nginx 通过user-agent判断手机终端

user-agent 收集:

http://www.developershome.com//detection/detection.?page=userAgentHeader

http://search.cpan.org/~cmanley/Mobile-UserAgent-1.05/lib/Mobile/UserAgent.pm

http://www.zytrax.com/tech//mobile_ids.

http://en.wikipedia.org/wiki/List_of_user_agents_for_mobile_phones

nginx

location = / {

root /var/www/;
if ($http_user_agent ~* “Nokia”) { rewrite . /index.html break; }

if ($http_user_agent ~* “Mobile”) { rewrite . /index.html break; }

if ($http_user_agent ~* “SAMSUNG”) { rewrite . /index.html break; } }

if ($http_user_agent ~* “SonyEricsson”) { rewrite . /index.html break; }
if ($http_user_agent ~* “MOT”) { rewrite . /index.html break; } }
if ($http_user_agent ~* “BlackBerry”) { rewrite . /index.html break; }
if ($http_user_agent ~* “LG”) { rewrite . /index.html break; } }
if ($http_user_agent ~* “HTC”) { rewrite . /index.html break; }

if ($http_user_agent ~* “J2ME”) { rewrite . /index.html break; }
if ($http_user_agent ~* “Opera Mini”) { rewrite . /index.html break; } }
index index.html;
}

标签Tags:, , , , , , ,

《高性能网站建设指南》读书笔记

规则1,减少HTTP请求

这是最重要的原则,如果14条规则里只能选一条,那就是它了。可以通过多种方法减少HTTP请求,例如合并图片,合并JS和CSS等等。这一点薄荷网有很多改进的余地,首先应该把现在的JS合并了。

规则2,使用内容发布网络

内容发布网络就是CDN了,但是CDN似乎挺贵的,目前还不适合薄荷网,不过可以考虑自己弄一个网通的静态资源服务器解决有中国特色的可恶的南北互通问题。

规则3,添加Expires头

这个没什么好说的,是个建网站的人都应该知道。目前薄荷网图片,css,,flash过期时间设置了3年,可以说是永久了,:) Expires有个麻烦的地方是内容更新问题,Ruby on Rails这方面处理的非常棒,它是在文件名后面自动带了

资源文件的timestamp,完美解决。 (更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , ,

过滤HTML代码的函数包括过滤CSS和JS

(更多…)

标签Tags:, , , ,

5款纯div+css制作的弹出菜单(标准且无js)

只列出css代码,具体代码看演示。

一、最基本的:二级dropdown弹出菜单

不好描述先看演示:http://www.macrolong.com/blog/attachment/__menus/basic_dd.htm

(更多…)

标签Tags:, , , ,