Welcome to IcyRiver'blog

Thursday, August 31, 2006

使用mod_deflate减轻网络流量

主流的浏览器都支持gzip解压缩,这样可以大大减轻网络流量。所以今天试图配置Apache的mod-gzip 模块,想提高网站速度。但是发现该模块只能用在Apache1.3下,似乎Apache2已经不支持mod-gzip模块了。而且, mod_gzip 压缩文件后创建的临时文件是放到磁盘上的,这也会给磁盘 IO 带来严重的问题.。


Apache2使用的压缩模块名为mod_deflate,该模块压缩操作都在内存中进行,放在apache的modules目录下。只要稍加修改httpd.conf配置文件就可以使用了,我的配置过程如下:


1。增加   LoadModule deflate_module modules/mod_deflate.so,
      去掉   LoadModule headers_module modules/mod_headers.so前面的#。


2。 增加 
                 DeflateFilterNote ratio
                 LogFormat ‘”%h %l %u %t %r” %>s %b (%{ratio}n) “%{User-agent}i”‘ deflate
                 CustomLog logs/deflate.log deflate
       在      CustomLog logs/access.log common 前增加 #。


3。在虚拟主机配置块中加入以下代码:


<Location “/”>
 SetOutputFilter DEFLATE
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch ^Mozilla/4\.0[678] no-gzip
 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
 Header append Vary User-Agent env=!dont-vary
</Location>


mod_deflate


上图是我的Apache服务器压缩文件的情况,由于上面的配置语句  SetEnvIfNoCase Request_URI

\.(?:gif|jpe?g|png)$ no-gzip dont-vary

声明不压缩图片,所有只有文本文件,如php、css、js被压缩。一个8.3k的style.css文件被压缩到了2.2k,明显减少了网络的流量。


察看Apache的日志文件,找到被压缩的style.css文件对应的日志:
“127.0.0.1 - - [31/Aug/2006:21:29:42 +0800] GET /…giraffe2/style.css?.yslowt=1157030982594 HTTP/1.1″ 200 2209 (26) “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6″


红色数字部分对应着上面的日志配置语句 %b (%{ratio}n) ,表示该文件被压缩后的大小–2.2k和压缩的比率–26% 。

Monday, August 21, 2006

抛弃Editplus,开始使用GVim

习惯了使用Vim后,回到Windows使用Editplus,就发现Vim的强大和快捷。幸好有个Windos版本的Vim--GVim。这里是官方网站下载地址:http://www.vim.org/download.php 以及帮助文档中文版:http://vimcdoc.sourceforge.net/

安装都很容易,一路Next就可以了。我在安装中文帮助时发现,第一次自动启动时可以使用中文的,但退出后又还原为英文了。搜索了一下,解决办法是:把vim安装目录下的\vimfiles\doc\tags-cn另存为tags。

通过定制vim的配置文件.vimrc (Windows 下是 _vimrc),用户可以拥有适合自己风格的vim。在Linux 中.vimrc文件在 $HOME 目录下;在Windows中_vimrc文件在%HOME%目录下,%HOME%目录一般是C:\Documents and Settings\your_name\。下面是我的_vimrc文件内容:


vimrc

Thursday, August 17, 2006

推荐一个很强的firefox插件greasemonkey

最近发现了一个很强的firefox插件--Greasemonkey(到这里下载greasemonkey并安装)。有趣的是,该插件本身并不能做什么有用的事,安装它之后,firefox几乎没有任何变动。但是Greasemonkey本身也是基于插件机制的,也就是说,你可以在Greasemonkey上安装插件。Greasemonkey插件也叫用户脚本(user script),用javascript编写,现在的Greasemonkey 脚本库 包含了上百个用户脚本。

当你打开某个网页的时候,Greasemonkey会把用户脚本插入到该网页中,并执行脚本中的javescript代码,实现用户想要执行的动作。通过用户脚本,用户可以定制网页的行为,改变网页原有的功能。例如,sina 使用了一些 IE only 的代码来防止下载,所以sina 视频用Firefox浏览器无法看观看。如果使用一个 Greasemonkey 用户脚本,把sina网页中限制性的代码先解密,再修改为正确代码进行播放,就可以在firefox下正常观看 sina 视频。

可以到我的box网络硬盘下载
Greasemonkey 脚本插件sinavideo-0.1.5.user.js,保存到本地,用firefox打开。如果已经安装Greasemonkey 插件的话,就会在屏幕的右上角出现一个install的按钮,点击它安装sinavideo用户脚本。然后请点击此连接到新浪网查看效果。

下面几个是网友发现的几个有用的greasemonkey扩展
sina news ad remover 、bulter 、fix winzheng downloads。有兴趣的可以玩一玩。

基于web的个人桌面

又一次让我眼前一亮的web2.0网络服务是一个完全基于web 的个人桌面goowy(名字挺像google)。这个web桌面目前提供的服务有邮件收发、文件存储、聊天工具(支持msn、gtalk、icq等)、游戏、音乐播放器、RSS订阅。。。这些酷酷的应用程序都是用javascript脚本编写的。

用户可以在这个web桌面上做很多原来在windows操作系统上做的事情,如果再继续发展下去的话,有一天我们就可以不用操作系统和硬盘了,任何一个终端设备,如手机、工作站都可以享受到类似操作系统的服务。 说不定Google那天会看上它呢。下面是几个截图:

RSS订阅,看新闻,查询天气,支持blog聚合,搜索:

goowy-5

支持多种聊天工具msn、icq等:

goowy-4

邮件收发:

goowy-2

还有一大堆游戏:

goowy-3

Goowy的硬盘功能是通过box来实现的,允许用户上传、下载文件、创建文件夹等。box提供的免费网络存储服务在速度、服务质量上基本可以满足用户的需求,而且用户在使用goowy桌面时不必到box网站就可以管理自己的网络硬盘。

goowy-1

Tuesday, August 08, 2006

迁移wordpress过程

之前在我的机器上安装了wordpress,blog都是存在本地数据库。前几天用ttthree的帐号在dreamhost上申请了一个虚拟主机,下面说朔我的迁移过程。

在迁移之前,当然要在dreamhost上设置好domain、mysql数据库。dreamhost有web、ssh、webftp、ftp多种访问方法,我觉得通过ssh是最方便的。

1。在shell下使用mysqldump备份wordpress数据库,生成一个sql文件; 或者使用phpMyAdmin的export功能也可以产生这样一个sql文件。从这里下载mysql数据库文档察看关于mysqldump的用法。   注意,因为dreamhost默认的编码是utf8,所以备份的数据库编码最好是utf8,否则后面会有乱码问题。我最初用wordpress的时候,数据库是latin1编码,后来发现了乱码,就及时把编码改成了utf8。

2。在dreamhost上创建数据库并设置好用户名和密码,用phpMyAdmin的import功能把刚才备份的sql文件导入到数据库中。

3。用ssh登录后用scp命令把原来的wordpress所有的php文件传输到我的/icyriver.net目录下。
        scp  -r  *  icyriver@icyriver.net:/home/icyriver/icyriver.net/
如果没有ssh或者ftp工具,可以用dreamhost上的webftp把所有的文件打包并上传,而且上传的zip文件会自己解压缩,不用一个一个添加了,真是为用户着想,赞一个。

4。在wp-config.php中设置正确的数据库用户名和密码.

5。修改一些link URL。比如我的blog服务器原来是在localhost上,所以还要到http://icyriver.net/wp-admin/options-general.php,把WordPress address (URI)和Blog address (URI)设置成http://icyriver.net.否则页面上的文字、css和图片链接还是localhost。

访问http://icyriver.net,ok。就是这么简单。

Thursday, August 03, 2006

Yahoo首页改版

yahoo首页今天凌晨改版,新首页增加了web2.0的一些特性,提升了用户体验和友好度。新首页不但继承了yahoo一贯的风格,亲切清新,而且版面设计和sohu,sina比起来简洁了许多,至少没有什么广告,眼球上清静了许多。

新首页由于采用了ajax技术,必定会给yahoo的网站流量上带来一些损失,但是和给用户带来的方便相比,是相当值得的。在web2.0横行的今天,门户网站也许应该考虑在PV和用户体验之间做出一点权衡。


yahoo web2.0

PHP header函数用法 Tips

1。PHP header() 函数

网上很多资料这样写:php的函数header()可以向浏览器发送Status标头,如 header("Status: 404 Not Found")。

但是我发现实际上浏览器返回的响应却是:

HTTP/1.x 200 OK
Date: Thu, 03 Aug 2006 07:49:11 GMT
Server: Apache/2.0.55 (Win32) PHP/5.0.5
X-Powered-By: PHP/5.0.5
Status: 404 Not Found
Content-Length: 0
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: text/html

查了一些资料,正确的写法是:
header("http/1.1 404 Not Found");

第一部分为HTTP协议的版本(HTTP-Version);第二部分为状态代码(Status);第三部分为原因短语(Reason-Phrase)。

若要想让浏览器不是从 Proxy 或 cache 中取得页面,可以使用下列的标头

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

具体含义下面解释。

2。禁止页面在IE中缓存

http响应消息头部设置:

CacheControl = no-cache
Pragma=no-cache
Expires = -1

Expires是个好东东,如果服务器上的网页经常变化,就把它设置为-1,表示立即过期。如果一个网页每天凌晨1点更新,可以把
Expires设置为第二天的凌晨1点。

当HTTP1.1服务器指定
CacheControl = no-cache时,浏览器就不会缓存该网页。

旧式 HTTP 1.0 服务器不能使用 Cache-Control 标题。所以为了向后兼容 HTTP 1.0 服务器,IE使用Pragma:no-cache 标题对 HTTP 提供特殊支持。如果客户端通过安全连接 (https://) 与服务器通讯,且服务器在响应中返回 Pragma:no-cache 标题,则 Internet Explorer 不会缓存此响应。注意:Pragma:no-cache 仅当在安全连接中使用时才防止缓存,如果在非安全页中使用,处理方式与 Expires:-1 相同,该页将被缓存,但被标记为立即过期。

http-equiv meta标记:

在html页面中可以用http-equiv meta来标记指定的http消息头部。老版本的IE可能不支持html meta标记,所以最好使用http消息头部来禁用缓存。

3。隐藏文件的位置


html标签 就可以实现普通文件下载。如果为了保密文件,就不能把文件链接告诉别人,可以用header函数实现文件下载。

header("Content-type: audio/mpeg");
header("Content-Disposition: attachment; filename=filenale");
header("Content-Description: PHP3 Generated Data");


4。header函数前输入内容

一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些函数需要在输出流中增加消息头部信息。如果在header()执行之前有echo等语句,当后面遇到header()时,就会报出 “Warning: Cannot modify header information - headers already sent by ....”错误。就是说在这些函数的前面不能有任何文字、空行、回车等,而且最好在header()函数后加上exit()函数。例如下面的错误写法,在两个php代码段之间有一个空行:

//some code here
?>
//这里应该是一个空行
header("http/1.1 403 Forbidden");
exit();
?>

原 因是:PHP脚本开始执行 时,它可以同时发送http消息头部(标题)信息和主体信息. http消息头部(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中. 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题).但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header.而后继续发送主体数据.从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。

解决办法:

修 改php.ini打开缓存(output_buffering),或者在程序中使用缓存函数ob_start(),ob_end_flush()等。原理 是:output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4.0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止 时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。