文章列表
 
您正在查看 "200706" 发表的文章

2007-06-22 22:45
今天在window上配置apache服务器端口的时候,发现80端口给一个莫名的服务占用了,通过一些命名居然没有查出来,百度了一下,发现这个文章还不错,记录下:

每一项服务都对应相应的端口,比如众如周知的WWW服务的端口是80,smtp是25,ftp是21,win2000安装中默认的都是这些服务开启的。对于个人用户来说确实没有必要,关掉端口也就是关闭无用的服务。 “控制面板”的“管理工具”中的“服务”中来配置。
1、关闭7.9等等端口:关闭Simple TCP/IP Service,支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。
2、关闭80口:关掉WWW服务。在“服务”中显示名称为"World Wide Web Publishing Service",通过 Internet 信息服务的管理单元提供 Web 连接和管理。
3、关掉25端口:关闭Simple Mail Transport Protocol (SMTP)服务,它提供的功能是跨网传送电子邮件。
4、关掉21端口:关闭FTP Publishing Service,它提供的服务是通过 Internet 信息服务的管理单元提供 FTP 连接和管理。
5、关掉23端口:关闭Telnet服务,它允许远程用户登录到系统并且使用命令行运行控制台程序。
6、还有一个很重要的就是关闭server服务,此服务提供 RPC 支持、文件、打印以及命名管道共享。关掉它就关掉了win2k的默认共享,比如ipc$、c$、admin$等等,此服务关闭不影响您的共他操作。
7、 还有一个就是139端口,139端口是NetBIOS Session端口,用来文件和打印共享,注意的是运行samba的unix机器也开放了139端 口,功能一样。以前流光2000用来判断对方主机类型不太准确,估计就是139端口开放既认为是NT机,现在好了。 关闭139口听方法是在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WINS 设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。 对于个人用户来说,可以在各项服务属性设置中设为“禁用”,以免下次重启服务也重新启动,端口也开放了。
每一项服务都对应相应的端口,比如众如周知的WWW服务的端口是80,smtp是25,ftp是21,win2000安装中默认的都是这些服务开启的。对于个人用户来说确实没有必要,关掉端口也就是关闭无用的服务。
“控制面板”的“管理工具”中的“服务”中来配置。
1、关闭7.9等等端口:关闭Simple TCP/IP Service,支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。
2、关闭80口:关掉WWW服务。在“服务”中显示名称为"World Wide Web Publishing Service",通过 Internet 信息服务的管理单元提供 Web 连接和管理。
3、关掉25端口:关闭Simple Mail Transport Protocol (SMTP)服务,它提供的功能是跨网传送电子邮件。
4、关掉21端口:关闭FTP Publishing Service,它提供的服务是通过 Internet 信息服务的管理单元提供 FTP 连接和管理。
5、关掉23端口:关闭Telnet服务,它允许远程用户登录到系统并且使用命令行运行控制台程序。
6、还有一个很重要的就是关闭server服务,此服务提供 RPC 支持、文件、打印以及命名管道共享。关掉它就关掉了win2k的默认共享,比如ipc$、c$、admin$等等,此服务关闭不影响您的共他操作。
7、 还有一个就是139端口,139端口是NetBIOS Session端口,用来文件和打印共享,注意的是运行samba的unix机器也开放了139端 口,功能一样。以前流光2000用来判断对方主机类型不太准确,估计就是139端口开放既认为是NT机,现在好了。
关闭139口听方法是在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WINS设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。
对于个人用户来说,可以在各项服务属性设置中设为“禁用”,以免下次重启服务也重新启动,端口也开放了。

我们一般采用一些功能强大的反黑软件和防火墙来保证我们的系统安全,但是有些用户不具备上述条件。怎么办呢?下面就介绍一种简易的办法——通过限制端口来帮助大家防止非法入侵。
  非法入侵的方式
  简单说来,非法入侵的方式可粗略分为4种:
  1、扫描端口,通过已知的系统Bug攻入主机。
  2、种植木马,利用木马开辟的后门进入主机。
  3、采用数据溢出的手段,迫使主机提供后门进入主机。
  4、利用某些软件设计的漏洞,直接或间接控制主机。
  非法入侵的主要方式是前两种,尤其是利用一些流行的黑客工具,通过第一种方式攻击主机的情况最多、也最普遍;而对后两种方式来说,只有一些手段高超的黑客才利用,波及面并不广泛,而且只要这两种问题一出现,软件服务商很快就会提供补丁,及时修复系统。
  因此,如果能限制前两种非法入侵方式,就能有效防止利用黑客工具的非法入侵。而且前两种非法入侵方式有一个共同点,就是通过端口进入主机。
   端口就像一所房子(服务器)的几个门一样,不同的门通向不同的房间(服务器提供的不同服务)。我们常用的FTP默认端口为21,而WWW网页一般默认端 口是80。但是有些马虎的网络管理员常常打开一些容易被侵入的端口服务,比如139等;还有一些木马程序,比如冰河、BO、广外等都是自动开辟一个您不察 觉的端口。那么,只要我们把自己用不到的端口全部封锁起来,不就杜绝了这两种非法入侵吗?
  限制端口的方法
  对于个人用户来说,您可以限制所有的端口,因为您根本不必让您的机器对外提供任何服务;而对于对外提供网络服务的服务器,我们需把必须利用的端口(比如WWW端口80、FTP端口21、邮件服务端口25、110等)开放,其他的端口则全部关闭。
  这里,对于采用Windows 2000或者Windows XP的用户来说,不需要安装任何其他软件,可以利用“TCP/IP筛选”功能限制服务器的端口。具体设置如下:
  1、右键点击“网上邻居”,选择“属性”,然后双击“本地连接”(如果是拨号上网用户,选择“我的连接”图标),弹出“本地连接状态”对话框。
  2、点击[属性]按钮,弹出“本地连接属性”,选择“此连接使用下列项目”中的“Internet协议(TCP/IP)”,然后点击[属性]按钮。
  3、在弹出的“Internet协议(TCP/IP)”对话框中点击[高级]按钮。在弹出的“高级TCP/IP设置”中,选择“选项”标签,选中“TCP/IP筛选”,然后点击[属性]按钮。
  4、在弹出的“TCP/IP筛选”对话框里选择“启用TCP/IP筛选”的复选框,然后把左边“TCP端口”上的“只允许”选上(请见附图)。
  这样,您就可以来自己添加或删除您的TCP或UDP或IP的各种端口了。
  添加或者删除完毕,重新启动机器以后,您的服务器就被保护起来了。
如果只上网浏览的话,可以不添加任何端口。但是要利用一些网络联络工具,比如OICQ的话,就要把“4000”这个端口打开,同理,如果发现某个常用的网络工具不能起作用的时候,请搞清它在您主机所开的端口,然后在“TCP/IP筛选”中添加端口即可
 
2007-06-22 22:25
1、 新浪

新浪采用了ChinaCache做的CDN系统,ChinaCache在全国分布了四十多个点,同时采用基于动态DNS分配的全球服务器负载均衡技术。

从新浪的站点结构可以看出:

> www.sina.com.cn

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: libra.sina.com.cn

Addresses: 61.135.152.71, 61.135.152.72, 61.135.152.73, 61.135.152.74 61.135.152.75, 61.135.152.76, 61.135.153.181, 61.135.153.182, 61.135.53.183, 61.135.153.184, 61.135.152.65, 61.135.152.66, 61.135.152.67, 61.135.12.68, 61.135.152.69, 61.135.152.70

Aliases: www.sina.com.cn, jupiter.sina.com.cn

在北京地区ChinaCache将www.sina.com.cn的网址解析到libra.sina.com.cn,然后 libra.sina.com.cn做了DNS负载均衡,将libra.sina.com.cn解析到61.135.152.71等16个ip上,这16 个ip分布在北京的多台前台缓存服务器上,使用squid做前台缓存。如果是在其它地区访问www.sina.com.cn可能解析到本地相应的服务器, 例如pavo.sina.com.cn,然后pavo又对应了很多做了squid的ip。这样就实现了在不同地区访问自动转到最近的服务器访问,达到加快 访问速度的效果。

我们再看一个新浪其它频道是指到哪里的:

> news.sina.com.cn

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: libra.sina.com.cn

Addresses: 61.135.152.65, 61.135.152.66, 61.135.152.67, 61.135.152.68 61.135.152.69, 61.135.152.70, 61.135.152.71, 61.135.152.72, 61.135.152.73 61.135.153.178, 61.135.153.179, 61.135.153.180, 61.135.153.181, 61.135.153.182 61.135.153.183, 61.135.153.184

Aliases: news.sina.com.cn, jupiter.sina.com.cn

可以看出,各个频道的前台缓存集群与www.sina.com.cn的前台缓存集群是相同的。

  2、搜狐

Sohu与新浪的原理差不多,下面是nslookup的结果:

> www.sohu.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: pagegrp1.sohu.com

Addresses: 61.135.132.172, 61.135.132.173, 61.135.132.176, 61.135.133.109 61.135.145.47, 61.135.150.65, 61.135.150.67, 61.135.150.69, 61.135.150.74 61.135.150.75, 61.135.150.113, 61.135.150.145, 61.135.131.73, 61.135.131.91 61.135.131.180, 61.135.131.182, 61.135.131.183, 61.135.132.65, 61.135.

132.80

Aliases: www.sohu.com

只不过libra.sina.com.cn换成了pagegrp1.sohu.com

我们再来看一下sohu的频道:

> news.sohu.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: pagegrp1.sohu.com

Addresses: 61.135.145.47, 61.135.150.65, 61.135.150.67, 61.135.150.69 61.135.150.74, 61.135.150.75, 61.135.150.113, 61.135.150.145, 61.135.131.73 61.135.131.91, 61.135.131.180, 61.135.131.182, 61.135.131.183, 61.135.132.65 61.135.132.80, 61.135.132.172, 61.135.132.173, 61.135.132.176, 61.135.133.109

Aliases: news.sohu.com

同新浪相同,用的是同样的服务器群,这可能是因为他们用的都是ChinaCache的服务吧,不过sohu的名字起的有点土,pagegrp1,没有libra,pavo好听,这名字听起来有点像法语,比较浪漫。

  3、网易

网易似乎没用ChinaCache的服务,下面是nslookup结果:

> www.163.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: www.163.com

Addresses: 202.106.168.103, 202.106.168.104, 202.106.168.109, 202.106.168.121 202.108.36.153, 202.108.36.155, 202.108.36.156, 202.108.36.167, 202.108.36.172 202.108.36.196

直接在www.163.com 这个域名上做了DNS负载均衡。这样的话就要求服务器必须放的非常靠近主节点,才能保证各地的用户访问的速度。

但163不同的频道是放在不同的缓存集群上的,这与sina,sohu有些不同,等于sina,sohu是按照地区划分服务器集群,而网易按照频道划分服务器集群。

> 163.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: 163.com

Addresses: 202.108.36.205, 202.108.36.206, 202.108.36.207, 202.108.36.201 202.108.36.202, 202.108.36.203, 202.108.36.204

显然,这和www.163.com不是一个集群,我们再来试一个:

> sports.163.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: channel.cache.163.com

Addresses: 202.108.36.136, 202.108.36.208, 202.108.36.209, 202.108.36.210 202.108.36.211, 202.108.36.212, 202.108.36.213

Aliases: sports.163.com

可以看出,和上面的集群也是不同的。

    4、百度

百度的前台服务器就不是很多了:

> www.baidu.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: www.baidu.com

Addresses: 202.108.250.249, 202.108.249.134

> baidu.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: baidu.com

Address: 202.108.250.228

> mp3.baidu.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: mp3.baidu.com

Address: 202.108.249.131

只有www.baidu.com做了两台服务器的集群,频道都用了一台服务器做前台

    5、一搜

> yisou.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: yisou.com

Addresses: 202.165.102.114, 202.43.217.14, 202.43.217.15, 202.43.217.16 202.43.217.17, 202.165.102.111, 202.165.102.112, 202.165.102.113

> www.yisou.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: www.yisou.com

Addresses: 202.43.217.17, 202.165.102.111, 202.165.102.112, 202.165.102.113 202.165.102.114, 202.43.217.14, 202.43.217.15, 202.43.217.16

> mp3.yisou.com

Server: UnKnown

Address: 192.168.1.254

Non-authoritative answer:

Name: www.yisou.com

Addresses: 202.165.102.113, 202.165.102.114, 202.43.217.14, 202.43.217.15 202.43.217.16, 202.43.217.17, 202.165.102.111, 22.165.102.112

Aliases: mp3.yisou.com

前台做了8台服务器的缓存集群,www.yisou.com和 yisou.com以及mp3.yisou.com是用的同一个集群。

通过前面的分析我们可以得到一个结论:sina和sohu使用了CDN与GSBL与DNS负载均衡技术,每个地区一组前台服务器群,网易,百度使用了DNS负载均衡技术,每个频道一组前台服务器,一搜使用了DNS负载技术,所有频道共用一组前台服务器集群。

 
2007-06-22 14:36
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。 在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本 投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。

针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。

负载均衡技术主要应用

1、 DNS负载均衡最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不 同的客户访问不同的服务器,达到负载均衡的目的。DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。
2、代理服务器负载均衡 使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式显然可以提升静态网页的访问速度。然而,也可以考虑这样一种技术,使用代理服务器将请求均匀转发给多台服务器,从而达到负载均衡的目的。
3、地址转换网关负载均衡 支持负载均衡的地址转换网关,可以将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。
4、协议内部支持负载均衡 除了这三种负载均衡方式之外,有的协议内部支持与负载均衡相关的功能,例如HTTP协议中的重定向能力等,HTTP运行于TCP连接的最高层。
5、 NAT负载均衡 NAT(Network Address Translation 网络地址转换)简单地说就是将一个IP地址转换为另一个IP地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP地址间进行转换。适用于解决Internet IP地址紧张、不想让网络外部知道内部网络结构等的场合下。
6、反向代理负载均衡普通代理 方式是代理内部网络用户访问internet上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet上服务器的连接请求发 送给代理服务器处理。反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的 方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。
7、混合型负载均衡在有些大型网络,由于多个服务器群内硬件设 备、各自的规模、提供的服务等的差异,我们可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整 体向外界提供服务(即把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。我们将这种方式称之为混合型负载均衡。此种方式有时也用于单台均衡设 备的性能不能满足大量连接请求的情况下。
 
2007-06-22 14:10

Tips

  • 针对 Innodb 表,尽量不执行 SELECT COUNT(*) 语句,因为 Innodb 表没有类似 MyISAM 那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢。
  • 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁。
  • 善用 EXPLAIN 来帮助你分析查询优化情况
  • 如果需要对一个较大的且并发读写较多的数据表做 GROUP BY 等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善。
  • 查询时如果有 ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度
  • 如 果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到。例如: 索引 `idx_`(col1, col2, col3),那么查询 SELECT ... FROM ... WHERE col1=1 AND col2=2; 使用索引,而查询 ... WHERE col2=2 AND col3=3; 或 ...WHERE col1=1 AND col3=3; 则不使用索引。
  • WHERE 中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤。
  • 两个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了。
  • 大部分情况下,字符类型的字段索引值需要一部分,例如 CREATE INDEX char_idx ON tbl1 ( name(10) );
  • 尽 量使用最合适的数据类型,能使用 ENUM 就不使用 TINYINT ,能使用 SMALLINT 就不使用 MEDIUMINT。这样能节省存储空间,增加数据存储量,提高搜索速度。不要担心这 样会对省级产生很大的影响,因为加入从 TINYINT 类型改变为 INT 的话,并不会改变原来的数据。
  • 如果知道某个表总是频繁使用的话,可以把它放到 hot_cache 中,用以下方法:
    SET GLOBAL hot_cache。key_buffer_size=128*1024;
    CACHE INDEX `xxx` IN hot_cache;
  • 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能。
  • 执 行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率。如: WHERE `create_time` > UNIX_TIMESTAMP(NOW()); 这样的查询。可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句。
  • 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引。如 `name` LIKE 'yejr%';。
  • 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高。
  • 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗。
  • 定期的在 MyISAM 表上执行 OPTIMIZE TABLE,这能整理随便,提高索引效率。
  • 如果你主要按 col1,col2, ...顺序检索记录,请在对表大量更改后执行 ALTER TABLE ... ORDER BY col1, col2, ... 语句,这可以获得更好的性能。
  • 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT)。
  • 对于记录总数超过 500 万的单表,就应该赶紧考虑分表了。分表策略有多种,比如按 ID 号段,或者按时间切分,等等。
  • 创建数据表时尽量指定字段不能为 NULL,并且有默认值。
  • 使用 LOAD DATA,而不是使用大批量的 INSERT 语句来导入数据。
  • 使数据表名和字段名尽可能的短,例如在 user 表中使用字段名 name,而不是 user_name。
  • 用 DELAY_KEY_WRITE = 1 选项让 MyISAM 更快地更新索引,因为在表关闭之前它们不刷新到硬盘上。缺点是如果服务器如果突然被杀掉了,重启之后就必须运行 myisamchk 修复索引才行。
  • 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载。

启动参数优化

修改 my.cnf (或者my.ini),加入/修改以下几行

#设定缓存的连接数,节省连接时的开销
back_log = 64

#禁用文件系统外部锁
external-locking = 0

#禁用 BDB,如果你确实不需要的话,innodb 也是如此
skip-bdb

#索引缓冲,如果是专用的数据库服务器,可以设置高达服务器内存的一半
#如果不是专用的,还是设置得低一点
key_buffer = 512M

#缓存数据表数量,如果内存较大,可以设置稍微高一点,否则还是设置低一点
#设置这个参数可以参见系统状态中的 open_tables(表示当前打开的数据表总数)
#和 opened_tables(表示所有打开的数据表总数)
table_cache = 128

#禁用 dns 解析,如果你的授权信息中采用 dns 授权方式了,就不能启用该选项
skip-name-resolve

#记录慢查询和没有使用索引的查询,便于帮助分析问题所在
long_query_time = 1
log-slow-queries = /usr/local/mysql/data/slow。log
log-queries-not-using-indexes

其 他参数诸如 sort_buffer_size,net_buffer_length,read_buffer_size, read_rnd_buffer_size,myisam_sort_buffer_size, thread_cache_size,query_cache_size,max_binlog_cache_size 等请查询MySQL手册,然后做出合适的调整。

 
2007-06-22 14:09
一些有用的链接:

怎样提高系统性能

给你的web应用加一个cache
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=19952&tstart=0

项目中用到OSCache来实现jsp页面缓存功能的杂谈
http://www.jdon.com/jivejdon/thread/24711.html

性能来说,主要采用下面几个技术: 1、静态文件技术; 2、双缓存帖子列表技术;

CSDN关于性能讨论: http://chat.csdn.net/chathistory/ViewStatements.aspx?TopicId=89

基于反相代理的Web缓存加速——可缓存的CMS系统设计 http://www.chedong.com/tech/cache.html

说说大型高并发高负载网站的系统架构   http://www.toplee.com/blog/wp-trackback.php?p=71

建立站点:   http://www.sohotx.com/mzk/index.php/1007/ArticleList/105.html

 
2007-06-22 14:02

InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。

在 技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。

http://www.innodb.com/上可以找到 InnoDB 最新的信息。InnoDB 手册的最新版本总是被放置在那里,并且在那里可以得到 InnoDB 的商业许可(order commercial licenses)以及支持。

InnoDB 现在(2001年十月)在一些大的需高性能的数据库站点上被使用。著名的 Internet 新闻站点 Slashdot.org 就是使用的 InnoDB。 Mytrix, Inc. 在 InnoDB 表上存储了超过 1 TB 的数据,而且另外的一个站点在 InnoDB 表上处理着平均每秒 800 次的插入/更新的负载。

在 MySQL 的源代码中,从 3.23.34a 开始包含 InnoDB 表引擎,并在 MySQL -Max 的二进制版本中激活。

为了使用 InnoDB 表引擎,必须在‘my.cnf’‘my.ini’文件中详细指定 InnoDB 的启动配置。最小的修改方法就是在 [mysqld] 区中加入下面一行:

 innodb_data_file_path=ibdata:30M 

但是为了得到最好的性能推荐详细指定配置选项,查看 2 InnoDB Startup Options

InnoDB 以 GNU GPL 版本 2 的许可发布(1991年六月)。

1.1 MySQL/InnoDB 发布版本间的差别

  • MySQL-Max-3.23: 这是一个稳定版本,被推荐为产品使用。
  • MySQL-4.0: 这是一个开发版本,与 MySQL 3.23 相比它包含了一些新特性,比如多表删除(multi-table delete)、查询结果缓冲(cached query results)和 SSL 通信。4.0 版与 3.23 版中的 InnoDB 表引擎是一致的。4.0.1 的稳定性可被归类为 beta。
  • MySQL-4.0 embedded server library: You can link this into your application. The benefits are easier deployment for your application, better performance, and easier use. The stability of the embedded library is classified as alpha, but it should be gamma within a few months.
 
2007-06-22 13:30
转载:俊麟 Michael’s blog (http://www.toplee.com/blog/?p=71)
Trackback Url :
http://www.toplee.com/blog/wp-trackback.php?p=71

        我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构 升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下。


一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对 系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的 技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所 能比拟的。

  大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。

  上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

1、HTML静态化
其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也 是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站 点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权 限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

  除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时 的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。目前很多博客也都实现了静态化,我 使用的这个Blog程序WordPress还没有静态化,所以如果面对高负载访问,www.toplee.com一定不能承受

  同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现, 比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以 考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

  在进行html静态化的时候可以使用一种折中的方法,就是前端使用动态实现,在一定的策略下进行定时静态化和定时判断调用,这个能实现很多灵活性的操作,我开发的台球网站故人居(www.8zone.cn)就是使用了这样的方法,我通过设定一些html静态化的时间间隔来对动态网站内容进行缓存,达到分担大部分的压力到静态页面上,可以应用于中小型网站的架构上。故人居网站的地址:http://www.8zone.cn,顺便提一下,有喜欢台球的朋友多多支持我这个免费网站:)

2、图片服务器分离
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大 型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因 为图片问题而崩溃。

  在应用服务器和图片服务器上,可以进行不同的配置优化,比如Apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。

  我的台球网站故人居8zone.cn也使用了图片服务器架构上的分离,目前是仅仅是架构上分离,物理上没有分离,由于没有钱买更多的服务器:),大家可以看到故人居上的图片连接都是类似img.9tmd.com或者img1.9tmd.com的URL。

  另外,在处理静态页面或者图片、js等访问方面,可以考虑使用lighttpd代替Apache,它提供了更轻量级和更高效的处理能力。

3、数据库集群和库表散列
大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。

  在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。

  上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列 是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个 页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性sohu的论坛就是采用 了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置 便能让系统随时增加一台低成本的数据库进来补充系统性能。

4、缓存
      缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。

  架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块,也可以使用外加的Squid进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。

  网站程序开发方面的缓存,Linux上提供的Memcached是常用的缓存方案,不少web编程语言都提供memcache访问接口,php、perl、c和java都有,可以在web开发中使用,可以实时或者Cron的把数据、对象等内容进行缓存,策略非常灵活。一些大型社区使用了这样的架构。

  另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块和eAccelerator加速和Cache模块,还要知名的Apc、XCache(国人开发的,支持!)php缓存模块,Java就更多了,.net不是很熟悉,相信也肯定有。

5、镜像
镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和 EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现 成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

6、负载均衡
   负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。

  负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。另外有关初级的负载均衡DNS轮循和较专业的CDN架构就不多说了。

6.1 硬件四层交换
         第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就 象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要 复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共 同决定。

  在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。

6.2 软件四层交换
       大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。

  软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满 足多种应用需求,这对于分布式的系统来说必不可少。

  一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。

总结:
对于大型网站来说,前面提到的每个方法可能都会被同时使用到,Michael这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会, 有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大,希望大家一起讨论,达到抛砖引玉之效。

 
2007-06-22 13:20
使用PHP编程的最大好处是学习这种编程语言非常容易以及其丰富的库。即使对需要使用的函数不是十分了解,我们也能够猜测出如何完成一个特定的任务。

尽管PHP非常简单易学,但我们仍然需要花费一点时间来学习PHP的一些编程技巧,尤其是与性能和内存占用相关的技巧。在PHP中,有许多小技巧能够使我 们减少内存的占用,并提高应用程序的性能。在本篇文章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。

通过在程序中设置计时的程序,并反复执行这些代码,我们可以获得有关程序执行速度的一组数据,这些数据可以可以用来发现程序中的瓶颈,以及如何进行优化,提高应用程序的性能。

也许读者曾经听说过PEAR库吧。我们将使用PEAR库创建在分析时需要使用的例子,这也是对现有的代码进行分析的最简单的方法,它使我们无需使用商用产品就能对代码进行分析。

我们要使用的库的名字是PEAR::Benchmark,它对于对代码进行分析和性能测试非常有用。这个库提供一个名字为 Benchmark_Timer()的类,能够记录一个函数调用和下一个函数调用之间的时间。在对代码的性能进行测试时,我们可以得到一个详细的脚本执行 结果,它非常简单,如下所示:

include_once("Benchmark/Timer.php");
$bench = new Benchmark_Timer;

$bench-> start();
$bench-> setMarker('Start of the script');

// 现在处于睡眠状态几分钟
sleep(5);

$bench-> stop();

// 从计时器中获得分析信息
print_r($bench-> getProfiling());
?>


上面代码执行后的输出如下所示:


Array
(
[0] =>   Array
(
[name] =>   Start
[time] =>   1013214253.05751200
[diff] =>   -
[total] =>   0
)

[1] =>   Array
(
[name] =>   Start of the script
[time] =>   1013214253.05761100
[diff] =>   9.8943710327148E-05
[total] =>   9.8943710327148E-05
)

[2] =>   Array
(
[name] =>   Stop
[time] =>   1013214258.04920700
[diff] =>   4.9915959835052
[total] =>   4.9916949272156
)

)





上面的数字似乎是一组杂乱无章的数字,但如果程序的规模更大,这些数字就十分地有用了。

也许广大读者也能猜测到,数组的第一个表目是实际调用Benchmark_Timer()类的方法,例如

$bench-> start()、$bench-> setMarker()和$bench-> stop(),与这些表目有关的数字是相当简单的,现在我们来仔细地研究这些数字:

[0] =>   Array

(

[name] =>   Start

[time] =>   1013214253.05751200

[diff] =>   -

[total] =>   0

)

time表目指的是何时对Benchmark_Timer()的start()方法调用的UNIX的timestamp,diff表目表示这次调用和上次 调用之间的时间间隔,由于这里没有上一次,因此显示出了一个破折号,total表目指的是自测试开始到这一特定的调用之前代码运行的总的时间。下面我们来 看看下一个数组的输出:

[1] =>   Array

(

[name] =>   Start of the script

[time] =>   1013214253.05761100

[diff] =>   9.8943710327148E-05

[total] =>   9.8943710327148E-05

)

从上面的数字我们可以看出,在调用$bench-> start()之后,程序运行了9.8943710327148E-05秒(也就是

0.0000989秒)后开始调用$bench-> setMarker(....)。

一次真实的性能测试经历

尽管上面的例子不错,但在对于决定如何优化你的站点代码设计方面,它真的不能算是一个好例子。下面我将用我自己作为网站技术人员的一段亲身经历来说明如何解决性能方面存在的问题。

我并不大理解网站使用的代码,因为它是根据特殊的需求,历经多年开发而成的━━其中的一个模块包括网站转换代码,另一个模块记录网站的使用情况,其他的模块也各有各的作用。我和网站的主要开发者都意识到网站的代码需要优化,但又不清楚问题出在哪儿。

为了尽快地完成任务,我开始研究网站的主要脚本代码,并在全部脚本代码以及其包含文件中添加了一些

$bench-> setMarker()命令,然后分析$bench-> getProfiling()的输出,并对得到的结果大吃一惊,原来问题出在一个与获得特定语言名字(例如en代表english)的转换代码的函数调用 中,该函数在每个页面上都会被使用数百次。每次调用该函数时,脚本代码都会对一个MySQL数据库进行查询,从一个数据库表中获得真正的语言名字。

于是我们这一类的信息创建了一个缓冲系统。经过短短2天时间的工作,我们使系统的性能得到了很大的提高,第一周内页面的浏览量也因此而增加了40%。当然了,这只是一个有关分析代码能够提高互联网应用或互联网网站性能的例子。

性能测试函数调用

在分析一个脚本或网页(以及其包含文件)时,尽管Benchmark_Timer()特别有用,但它并不科学,因为要获得分析的数据我们必须多次加载脚本,而且它也不是针对某个类或函数调用的。

PEAR::Benchmark库中的另一个被称作Benchmark_Iterator的类能够很好地解决这一个问题,它能够针对特定的函数或类的方 法,显示其分析信息。它的用途是能够能够从测试中获得一致的结果,因为我们知道,如果运行一段脚本一次,其运行时间为10秒,并不意味着它每次的运行时间 总是10秒。

In any case, let's see some examples:

// 连接数据库的代码
include_once("DB.php");
$dsn = array(
'phptype' =>   'mysql',
'hostspec' =>   'localhost',
'database' =>   'database_name',
'username' =>   'user_name',
'password' =>   'password'
);
$dbh = DB::connect($dsn);

function getCreatedDate($id)
{
global $dbh;

> $stmt = "SELECT created_date FROM users WHERE id=$id";
// 在这里使用PEAR::DB
$created_date = $dbh-> getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else {
return $created_date;
}
}

include_once 'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate;

// 运行getDate函数10次
$bench-> run(10, 'getCreatedDate', 1);

// 打印分析信息
print_r($bench-> get());
?>




运行上面的代码能够产生与下面相似的结果:


Array
(
[1] =>   0.055413007736206
[2] =>   0.0012860298156738
[3] =>   0.0010279417037964
[4] =>   0.00093603134155273
[5] =>   0.00094103813171387
[6] =>   0.00092899799346924
[7] =>   0.0010659694671631
[8] =>   0.00096404552459717
[9] =>   0.0010690689086914
[10] =>   0.00093603134155273
[mean] =>   0.0064568161964417
[iterations] =>   10
)



上面的这些数字很好理解,mean条目表示getCreatedDate()函数10次运行的平均时间。在进行实际测试时,应该至少运行1000次,但这个例子得出的结果已经足够说明问题了。

结束语

希望广大读者能够通过本篇文章掌握如何迅速地对PHP代码进行分析的基本方法。在这里我还还要提醒广大读者的是,对代码进行分析不是一件简单的事儿,因为 我们必须掌握大量的有关该种语言的特性。在代码中添加计时用的代码有助于找出运行速度缓慢的函数,利用多次重复的方法使我们能够发现对代码进行正确优化的 方法。
 
2007-06-22 13:15
转载自discuz官方论坛,是内部交流版的精华帖。

采用 PEAR 来缓冲 PHP 程序

PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。

PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。

就像 Perl 有 CPAN, TeX 有 CTAN,PHP 也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On Repository)。

本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。


PEAR 的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。

下面是 PEAR 缓冲当前所包含的容器,以及各自的参数:

file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。

cache_dir -- 这是容器存储文件的目录。

filename_prefix -- 缓冲文件的前缀,例如:"cache_"。

shm -- shm 容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。

shm_key -- 共享内存使用的键值。

shm_perm -- 使用共享内存数据段的权限。

shm_size -- 分配共享内存的大小。

sem_key -- 信号灯的键值。

sem_perm -- 信号灯的权限。

db -- PEAR 的数据库抽象层。

dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。

cache_table -- 表的名字。

phplib -- phplib 容器使用数据库抽象层存储缓冲。

db_class

db_file

db_path

local_file

local_path

ext/dbx -- PHP 的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。

module

host

db

username

password

cache_table

persistent

使用 PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。

PEAR Cache 的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP 的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做
function_cache 的目录。


Cache_Function 类的构造器可以有三个可选的参数:

$container :缓冲容器的名字。

$container_options :缓冲容器的数组参数。

$expires:缓冲对象过期的时间(秒数)。

普通的函数调用采用 Cache_Function 类的 call() 方法时,就能触发缓冲。调用 call() 很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子:

例 1: 缓冲函数和方法的调用

// 调用 PEAR Cache 的函数缓冲。

<?php
require_once 'Cache/Function.php';

// 定义一些类和函数。

class foo {
function bar($test) {
echo "foo::bar($test)<br>";
}
}

class bar {
function foobar($object) {
echo '$'.$object.'->foobar('.$object.')
';
}
}

$bar = new bar;

function foobar() {
echo 'foobar()';
}

// 取得 Cache_Function 对象

$cache = new Cache_Function();

// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。
$cache->call('foo::bar', 'test');

// $bar->foobar()
$cache->call('bar->foobar', 'bar');

$cache->call('foobar');
?>



下面我们采用 Cache_Output 来把输出作缓冲:

例子 2: 缓冲脚本的输出

// 加载 PEAR Cache 的输出缓冲

<?php
require_once 'Cache/Output.php';

$cache = new Cache_Output('file', array('cache_dir' => '.') );

// 计算要缓冲页面的标记,我们假定页面的缓冲取决于
// URL, HTTP GET 和 POST 变量以及 cookies。

$cache_id = $cache->generateID(array('url' => $REQUEST_URI, 'post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );

// 查询缓冲

if ($content = $cache->start($cache_id)) {

// 缓冲命中
echo $content;
die();
}

// 缓冲丢失

// -- 在这里插入内容产生代码 --

// 把页面存入缓冲
echo $cache->end();
?>

利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。

越来越多的站点在采用 GZIP 压缩 HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。

Cache_OutputCompression 扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。
 
2007-06-22 13:12
转载自discuz官方论坛,是内部交流版的精华帖。

有关压缩[转三]


来自Remote Communications的免费Apache模块mod_gzip就具有为支持这类内容编码的浏览器压缩静态Web内容的能力。对于绝大多数静态 Web内容,mod_gzip都非常有效。mod_gzip可以方便地编译到Apache里面,也可以作为DSO使用。据Remote communications公司说,mod_gzip也能够压缩来自mod_php、mod_perl等的动态内容。我试了一次又一次,但看来还是不 行。我看了许多关于mod_gzip的论坛和文章,看来到了mod_gzip的下一个版本(可能是1.3.14.6f)这个问题有望得到解决。在此之前, 我们可以在网站的静态部分使用mod_gzip。

然而有时我们确实需要压缩动态内容,所以必须找找其他办法。有一种办法是使用class.gzip_encode.php,这是一个可以用来压缩页面内容 的PHP类,具体方法是在PHP脚本的开头和末尾调用该类的某些函数。如果要在网站级实现这个方案,可以从php.ini文件的auto_prepend 以及auto_append指令调用这些函数。这种方法虽然有效,但它无疑为高负载的网站带来了更多的开销。关于如何使用这个类的详细说明,请参见它的源 代码。它的源代码说明相当完善,作者告诉了你所有你必须知道的事情。

PHP 4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用ob_gzhandler时要在php.ini中加入的内容如下:

output_handler = ob_gzhandler ;


这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:

php_value output_handler ob_gzhandler


或者是从PHP代码调用,如下所示:

ob_start("ob_gzhandler");


采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你应该禁止压缩JPEG和GIF图形。一般地,对于所 有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
 
   
 
 
文章存档
 
     
 
最新文章评论
  

你好,我的毕业设计也是这方面的,第一次接触这些,很想向你学习学习啊,能加一下QQ
 

请问内个sudo chown ender:ender php是神马意思呢?
 

不错! 朋友,有时间可以看看免费开源的、跨平台的、易操作的kangle反向代理服务器软
 

你好 我想请教个问题 memcached-client.php 中 run_command 的用法 因为一定要用memc
 

不错,很准备、全面,收藏QQ了。
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu