﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PHP博客-Programming Life</title><link>http://www.phpweblog.net/killjin/</link><description>相信不能相信的，完成不能完成的。矛盾，就象征进步。</description><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 08:48:07 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 08:48:07 GMT</pubDate><ttl>60</ttl><item><title>删除完全重复和部分关键字段重复的记录</title><link>http://www.phpweblog.net/killjin/archive/2008/08/09/5552.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 08 Aug 2008 19:33:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/08/09/5552.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5552.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/08/09/5552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5552.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5552.html</trackback:ping><description><![CDATA[<p>重复记录分为两种，第一种是完全重复的记录，也就是所有字段均重复的记录，第二种是部分关键字段重复的记录，例如Name字段重复，而其它字段不一定重复或都重复。 </p>
<p>1、第一种重复很容易解决，不同数据库环境下方法相似： </p>
<p>Mysql </p>
<p>create table tmp select distinct * from tableName; </p>
<p>drop table tableName; </p>
<p>create table tableName select * from tmp; </p>
<p>drop table tmp; </p>
<p><br>SQL Server </p>
<p>select distinct * into #Tmp from tableName; </p>
<p>drop table tableName; </p>
<p>select * into tableName from #Tmp; </p>
<p>drop table #Tmp; </p>
<p><br>Oracle </p>
<p>create table tmp as select distinct * from tableName; </p>
<p>drop table tableName; </p>
<p>create table tableName as select * from tmp; </p>
<p>drop table tmp; </p>
<p><br>发生这种重复的原因是由于表设计不周而产生的，增加唯一索引列就可以解决此问题。 </p>
<p>&nbsp;</p>
<p>2、此类重复问题通常要求保留重复记录中的第一条记录，操作方法如下。 假设有重复的字段为Name,Address，要求得到这两个字段唯一的结果集 </p>
<p>Mysql </p>
<p>alter table tableName add autoID int auto_increment not null; </p>
<p>create table tmp select min(autoID) as autoID from tableName group by Name,Address; </p>
<p>create table tmp2 select tableName.* from tableName,tmp where tableName.autoID = tmp.autoID; </p>
<p>drop table tableName; </p>
<p>rename table tmp2 to tableName; </p>
<p><br>SQL Server </p>
<p>select identity(int,1,1) as autoID, * into #Tmp from tableName; </p>
<p>select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,Address; </p>
<p>drop table tableName; </p>
<p>select * into tableName from #Tmp where autoID in(select autoID from #Tmp2); </p>
<p>drop table #Tmp; </p>
<p>drop table #Tmp2; </p>
<p>Oracle </p>
<p>DELETE FROM tableName t1 WHERE t1.ROWID &gt; (SELECT MIN(t2.ROWID) FROM tableName t2 WHERE t2.Name = t1.Name and t2.Address = t1.Address); </p>
<p>说明： </p>
<p>1. MySQL和SQL Server中最后一个select得到了Name，Address不重复的结果集（多了一个autoID字段，在大家实际写时可以写在select子句中省去此列） </p>
<p>2. 因为MySQL和SQL Server没有提供rowid机制，所以需要通过一个autoID列来实现行的唯一性，而利用Oracle的rowid处理就方便多了。而且使用ROWID是最高效的删除重复记录方法。 <br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/5552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-08-09 03:33 <a href="http://www.phpweblog.net/killjin/archive/2008/08/09/5552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 提示 Ctrl+D,修复文件系统!</title><link>http://www.phpweblog.net/killjin/archive/2008/06/29/5248.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 29 Jun 2008 07:25:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/06/29/5248.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5248.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/06/29/5248.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5248.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5248.html</trackback:ping><description><![CDATA[fsck-y -F ufs<br>实际用 fsck-y -F 修复好了！<br>文件系统不一致导致启动不了，fsck -y /&nbsp;&nbsp; 单独修复某分区，也可以。
<img src ="http://www.phpweblog.net/killjin/aggbug/5248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-06-29 15:25 <a href="http://www.phpweblog.net/killjin/archive/2008/06/29/5248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux系统locale的设定</title><link>http://www.phpweblog.net/killjin/archive/2008/03/27/3058.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 26 Mar 2008 19:40:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/27/3058.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/3058.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/27/3058.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/3058.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/3058.html</trackback:ping><description><![CDATA[<p>locale 是国际化与本土化过程中的一个非常重要的概念，个人认为，对于中文用户来说，通常会涉及到的国际化或者本土化，大致包含三个方面：看中文，写中文，与 window中文系统的兼容和通信。从实际经验上看来，locale的设定与看中文关系不大，但是与写中文，及window分区的挂载方式有很密切的关系。本人认为就像一个纯英文的Windows能够浏览中文，日文或者意大利文网页一样，你不需要设定locale就可以看中文。那么，为什么要设定 locale呢？什么时候会用到locale呢？</p>
<p><br>一、为什么要设定locale<br>正如前面我所讲的，设定locale与你能否浏览中文的网页没有直接的关系，即便你把locale设置成 en_US.ISO-8859-1这样一个标准的英文locale你照样可以浏览中文的网页，只要你的系统里面有相应的字符集（这个都不一定需要）和合适的字体（如simsun），浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后，浏览器会判断相应的编码的字符集，根据网页采用的字符集，去字体库里面找合适的字体，然后由文字渲染工具把相应的文字在屏幕上显示出来。</p>
<p>在下文本人会偶尔把字符集比喻成密码本，个人觉得对于一些东西比较容易理解，假如你不习惯的话，把全文copy到任何文本编辑器，用字符集替换密码本即可。</p>
<p>那有时候网页显示乱码或者都是方框是怎么回事呢？个人认为，显示乱码是因为设定的字符集不对(或者没有相应的字符集)，例如网页是用UTF-8 编码的，你非要用GB2312去看，而系统根据GB2312去找字体，然后在屏幕上显示，当然是一堆的乱码，也就是说你用一个错误的密码本去翻译发给你的电报，当然内容那叫一个乱；至于有些时候浏览的网页能显示一部分汉字，但有很多的地方是方框，能够显示汉字说明浏览器已经正确的判断出了网页的编码，并在字体库里面找到了相应的文字，但是并不是每个字体库都包含某个字符集全部的字体的缘故，有些时候会显示不完全，找一个比较全的支持较多字符集的字体就可以了。</p>
<p><br>既然我能够浏览中文网页，那为什么我还要设定locale呢？</p>
<p>其实你有没有想过这么一个问题，为什么gentoo官方论坛上中文论坛的网页是用UTF-8编码的（虽然大家一直强烈建议用GB2312编码），但是新浪网就是用GB2312编码的呢？而Xorg的官方网页竟然是ISO-8859-15编码的，我没有设定这个locale怎么一样的能浏览呢？这个问题就像是你有所有的密码本，不论某个网站是用什么字符集编码的，你都可以用你手里的密码本把他们翻译过来，但问题是虽然你能浏览中文网页，但是在整个操作系统里面流动的还是英文字符。所以，就像你能听懂英语，也能听懂中文。<br>最根本的问题是：你不可以写中文。</p>
<p>当你决定要写什么东西的时候，首先要决定的一件事情是用那种语言，对于计算机来说就是你要是用哪一种字符集，你就必须告诉你的linux系统，你想用那一本密码本去写你想要写的东西。知道为什么需要用GB2312字符集去浏览新浪了吧，因为新浪的网页是用GB2312写的。</p>
<p>为了让你的Linux能够输入中文，就需要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE )，例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢？这个问题稍后详述，现在只需要知道，这是locale的表达方式就可以了。</p>
<p>二、到底什么是locale？<br>locale这个单词中文翻译成地区或者地域，其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言，所在国家或者地区，以及当地的文化传统所定义的一个软件运行时的语言环境。</p>
<p>这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类，通常包括用户所使用的语言符号及其分类(LC_CTYPE)，数字 (LC_NUMERIC)，比较和排序习惯(LC_COLLATE)，时间显示格式(LC_TIME)，货币单位(LC_MONETARY)，信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)，姓名书写方式(LC_NAME)，地址书写方式(LC_ADDRESS)，电话号码书写方式 (LC_TELEPHONE)，度量衡表达方式(LC_MEASUREMENT)，默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。</p>
<p>所以说，locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的，这些locale定义文件放在/usr/share/i18n/locales目录下面，例如en_US, zh_CN and <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;">de_DE@euro</a>都是locale的定义文件，这些文件都是用文本格式书写的，你可以用写字板打开，看看里边的内容，当然出了有限的注释以外，大部分东西可能你都看不懂，因为是用的Unicode的字符索引方式。</p>
<p>对于<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;">de_DE@euro</a>的一点说明，@后边是修正项，也就是说你可以看到两个德国的locale：<br><a>/usr/share/i18n/locales/de_DE@euro</a><br>/usr/share/i18n/locales/de_DE<br>打开这两个locale定义，你就会知道它们的差别在于<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;">de_DE@euro</a>使用的是欧洲的排序、比较和缩进习惯，而de_DE用的是德国的标准习惯。</p>
<p>上面我们说到了zh_CN.GB18030的前半部分，后半部分是什么呢？大部分Linux用户都知道是系统采用的字符集。</p>
<p>三、什么是字符集？<br>字符集就是字符，尤其是非英语字符在系统内的编码方式，也就是通常所说的内码，所有的字符集都放在 /usr/share/i18n/charmaps，所有的字符集也都是用Unicode编号索引的。Unicode用统一的编号来索引目前已知的全部的符号。而字符集则是这些符号的编码方式，或者说是在网络传输，计算机内部通信的时候，对于不同字符的表达方式，Unicode是一个静态的概念，字符集是一个动态的概念，是每一个字符传递或传输的具体形式。就像Unicode编号U59D0是代表姐姐的&#8220;姐&#8221;字，但是具体的这个字是用两个字节表示，三个字节，还是四个字节表示，是字符集的问题。例如：UTF-8字符集就是目前流行的对字符的编码方式，UTF-8用一个字节表示常用的拉丁字母，用两个字节表示常用的符号，包括常用的中文字符，用三个表示不常用的字符，用四个字节表示其他的古灵精怪的字符。而GB2312字符集就是用两个字节表示所有的字符。需要提到一点的是Unicode除了用编号索引全部字符以外，本身是用四个字节存储全部字符，这一点在谈到挂载windows分区的时候是非常重要的一个概念。所以说你也可以把Unicode看作是一种字符集（我不知道它和UTF-32的关系，反正UTF-32就是用四个字节表示所有的字符的），但是这样表述符号是非常浪费资源的，因为在计算机世界绝大部分时候用到的是一个字节就可以搞定的26个字母而已。所以才会有UTF-8，UTF-16等等，要不然大同世界多好，省了这许多麻烦。</p>
<p><br>四、zh_CN.GB2312到底是在说什么？<br>Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 所以说呢，locale总是和一定的字符集相联系的。下面举几个例子：</p>
<p>1、我说中文，身处中华人民共和国，使用国标2312字符集来表达字符。<br>zh_CN.GB2312＝中文_中华人民共和国＋国标2312字符集。</p>
<p>2、我说中文，身处中华人民共和国，使用国标18030字符集来表达字符。<br>zh_CN.GB18030＝中文_中华人民共和国＋国标18030字符集。</p>
<p>3、我说中文，身处中华人民共和国台湾省，使用国标Big5字符集来表达字符。<br>zh_TW.BIG5=中文_台湾.大五码字符集</p>
<p>4、我说英文，身处大不列颠，使用ISO-8859-1字符集来表达字符。<br>en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集</p>
<p>5、我说德语，身处德国，使用UTF-8字符集，习惯了欧洲风格。<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#46;&#85;&#84;&#70;&#45;&#56;&#64;&#101;&#117;&#114;&#111;">de_DE.UTF-8@euro</a>＝德语_德国.UTF-8字符集@按照欧洲习惯加以修正</p>
<p>注意不是<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;&#46;&#85;&#84;&#70;&#45;&#56;">de_DE@euro.UTF-8</a>，所以完全的locale表达方式是<br>[语言[_地域][.字符集] [@修正值]</p>
<p>生成的locale放在/usr/lib/locale/目录中，并且每个locale都对应一个文件夹，也就是说创建了<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;&#46;&#85;&#84;&#70;&#45;&#56;">de_DE@euro.UTF-8</a> locale之后，就生成<a>/usr/lib/locale/de_DE@euro.UTF-8/</a>目录，里面是具体的每个locale的内容。</p>
<p>五、怎样去自定义locale<br>在gentoo生成locale还是很容易的，首先要在USE里面加入userlocales支持，然后编辑locales.build文件，这个文件用来指示glibc生成locale文件。<br>很多人不明白每一个条目是什么意思。 其实根据上面的说明现在应该很明确了。</p>
<p>File: /etc/locales.build<br>en_US/ISO-8859-1<br>en_US.UTF-8/UTF-8</p>
<p>zh_CN/GB18030<br>zh_CN.GBK/GBK<br>zh_CN.GB2312/GB2312<br>zh_CN.UTF-8/UTF-8</p>
<p>上面是我的locales.build文件，依次的说明是这样的：</p>
<p>en_US/ISO-8859-1：生成名为en_US的locale，采用ISO-8859-1字符集，并且把这个locale作为英文_美国locale类的默认值，其实它和en_US.ISO-8859-1/ISO-8859-1没有任何区别。</p>
<p>en_US.UTF-8/UTF-8：生成名为en_US.UTF-8的locale，采用UTF-8字符集。</p>
<p>zh_CN/GB18030：生成名为zh_CN的locale，采用GB18030字符集，并且把这个locale作为中文_中国locale类的默认值，其实它和zh_CN.GB18030/GB18030没有任何区别。</p>
<p>zh_CN.GBK/GBK：生成名为zh_CN.GBK的locale，采用GBK字符集。<br>zh_CN.GB2312/GB2312：生成名为zh_CN.GB2312的locale，采用GB2312字符集。<br>zh_CN.UTF-8/UTF-8：生成名为zh_CN.UTF-8的locale，采用UTF-8字符集。</p>
<p>关于默认locale，默认locale可以简写成en_US或者zh_CN的形式，只是为了表达简单而已没有特别的意义。</p>
<p>Gentoo在locale定义的时候掩盖了一些东西，也就是locale的生成工具：localedef。<br>在编译完glibc之后你可以用这个localedef 再补充一些locale，就会更加理解locale了。具体的可以看 localedef 的manpage。</p>
<p>$localedef -f 字符集 -i locale定义文件 生成的locale的名称<br>例如<br>$localedef -f UTF-8 -i zh_CN zh_CN.UTF-8</p>
<p>上面的定义方法和在locales.build中设定zh_CN.UTF-8/UTF-8的结果是一样一样的。</p>
<p><br>六、locale的五脏六腑</p>
<p>刚刚生成了几个locale，但是为了让它们生效，必须告诉Linux系统使用那(几)个locale。这就需要对locale的内部机制有一点点的了解。在前面我已经提到过，locale把按照所涉及到的文化传统的各个方面分成12个大类，这12个大类分别是：<br>1、语言符号及其分类(LC_CTYPE)<br>2、数字(LC_NUMERIC)<br>3、比较和排序习惯(LC_COLLATE)<br>4、时间显示格式(LC_TIME)<br>5、货币单位(LC_MONETARY)<br>6、信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)<br>7、姓名书写方式(LC_NAME)<br>8、地址书写方式(LC_ADDRESS)<br>9、电话号码书写方式(LC_TELEPHONE)<br>10、度量衡表达方式(LC_MEASUREMENT)<br>11、默认纸张尺寸大小(LC_PAPER)<br>12、对locale自身包含信息的概述(LC_IDENTIFICATION)。</p>
<p>其中，与中文输入关系最密切的就是 LC_CTYPE， LC_CTYPE 规定了系统内有效的字符以及这些字符的分类，诸如什么是大写字母，小写字母，大小写转换，标点符号、可打印字符和其他的字符属性等方面。而locale定义zh_CN中最最重要的一项就是定义了汉字(Class &#8220;hanzi&#8221;)这一个大类，当然也是用Unicode描述的，这就让中文字符在Linux系统中成为合法的有效字符，而且不论它们是用什么字符集编码的。</p>
<p>LC_CTYPE<br>% This is a copy of the "i18n" LC_CTYPE with the following modifications: - Additional classes: hanzi</p>
<p>copy "i18n"</p>
<p>class "hanzi"; /<br>% &lt;U3400&gt;..&lt;U4DBF&gt;;/<br>&lt;U4E00&gt;..&lt;U9FA5&gt;;/<br>&lt;UF92C&gt;;&lt;UF979&gt;;&lt;UF995&gt;;&lt;UF9E7&gt;;&lt;UF9F1&gt;;&lt;UFA0C&gt;;&lt;UFA0D&gt;;&lt;UFA0E&gt;;/<br>&lt;UFA0F&gt;;&lt;UFA11&gt;;&lt;UFA13&gt;;&lt;UFA14&gt;;&lt;UFA18&gt;;&lt;UFA1F&gt;;&lt;UFA20&gt;;&lt;UFA21&gt;;/<br>&lt;UFA23&gt;;&lt;UFA24&gt;;&lt;UFA27&gt;;&lt;UFA28&gt;;&lt;UFA29&gt;<br>END LC_CTYPE</p>
<p>在en_US的locale定义中，并没有定义汉字，所以汉字不是有效字符。所以如果要输入中文必须使用支持中文的locale，也就是zh_XX，如zh_CN，zh_TW，zh_HK等等。</p>
<p>另外非常重要的一点就是这些分类是彼此独立的，也就是说LC_CTYPE，LC_COLLATE和 LC_MESSAGES等等分类彼此之间是独立的，可以根据用户的需要设定成不同的值。这一点对很多用户是有利的，甚至是必须的。例如，我就需要一个能够输入中文的英文环境，所以我可以把LC_CTYPE设定成zh_CN.GB18030，而其他所有的项都是en_US.UTF-8。</p>
<p><br>七、怎样设定locale呢？</p>
<p>设定locale就是设定12大类的locale分类属性，即 12个LC_*。除了这12个变量可以设定以外，为了简便起见，还有两个变量：LC_ALL和LANG。它们之间有一个优先级的关系：<br>LC_ALL&gt;LC_*&gt;LANG<br>可以这么说，LC_ALL是最上级设定或者强制设定，而LANG是默认设定值。<br>1、如果你设定了LC_ALL＝zh_CN.UTF-8，那么不管LC_*和LANG设定成什么值，它们都会被强制服从LC_ALL的设定，成为 zh_CN.UTF-8。<br>2、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*=en_US.UTF-8，并且没有设定LC_ALL的话，那么系统的locale设定以LC_*=en_US.UTF-8。<br>3、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*，和LC_ALL均未设定的话，系统会将LC_*设定成默认值，也就是LANG的值 zh_CN.UTF-8 。<br>4、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_CTYPE=en_US.UTF-8，其他的LC_*，和LC_ALL均未设定的话，那么系统的locale设定将是：LC_CTYPE=en_US.UTF-8，其余的 LC_COLLATE，LC_MESSAGES等等均会采用默认值，也就是LANG的值，也就是LC_COLLATE＝LC_MESSAGES＝&#8230;&#8230;＝ LC_PAPER＝LANG＝zh_CN.UTF-8。</p>
<p>所以，locale是这样设定的：<br>1、如果你需要一个纯中文的系统的话，设定LC_ALL= zh_CN.XXXX，或者LANG= zh_CN.XXXX都可以，当然你可以两个都设定，但正如上面所讲，LC_ALL的值将覆盖所有其他的locale设定，不要作无用功。<br>2、如果你只想要一个可以输入中文的环境，而保持菜单、标题，系统信息等等为英文界面，那么只需要设定LC_CTYPE＝zh_CN.XXXX，LANG= en_US.XXXX就可以了。这样LC_CTYPE＝zh_CN.XXXX，而LC_COLLATE＝LC_MESSAGES＝&#8230;&#8230;＝ LC_PAPER＝LANG＝en_US.XXXX。<br>3、假如你高兴的话，可以把12个LC_*一一设定成你需要的值，打造一个古灵精怪的系统：<br>LC_CTYPE＝zh_CN.GBK/GBK(使用中文编码内码GBK字符集)；<br>LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统)<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#76;&#67;&#95;&#77;&#69;&#65;&#83;&#85;&#82;&#69;&#77;&#69;&#78;&#61;&#100;&#101;&#95;&#68;&#69;&#64;&#101;&#117;&#114;&#111;&#46;&#73;&#83;&#79;&#45;&#56;&#56;&#53;&#57;&#45;&#49;&#53;">LC_MEASUREMEN=de_DE@euro.ISO-8859-15</a>(德国的度量衡使用ISO-8859-15字符集)<br>罗马的地址书写方式，美国的纸张设定&#8230;&#8230;。估计没人这么干吧。<br>4、假如你什么也不做的话，也就是LC_ALL，LANG和LC_*均不指定特定值的话，系统将采用POSIX作为lcoale，也就是C locale.</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/3058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-27 03:40 <a href="http://www.phpweblog.net/killjin/archive/2008/03/27/3058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>人生致命的8个经典问题</title><link>http://www.phpweblog.net/killjin/archive/2008/03/19/3000.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 19 Mar 2008 10:01:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/19/3000.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/3000.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/19/3000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/3000.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/3000.html</trackback:ping><description><![CDATA[<p><font face=Verdana>问题一：如果你家附近有一家餐厅，东西又贵又难吃，桌上还爬着蟑螂，你会因为它很近很方便，就一而再、再而三地光临吗？</font></p>
<p><font face=Verdana>回答：你一定会说，这是什么烂问题，谁那么笨，花钱买罪受</font></p>
<font face=Verdana>
<p><br>可同样的情况换个场合，自己或许就做类似的蠢事。</p>
<p><br>不少男女都曾经抱怨过他们的情人或配偶品性不端，三心二意，不负责任。明知在一起没什么好的结果，怨恨已经比爱还多，却&#8220;不知道为什么&#8221;还要和他搅和下去，分不了手。说穿了，只是为了不甘，为了习惯，这不也和光临餐厅一样？</p>
<p><br>——做人，为什么要过于执著？！</p>
<p><br>问题二：如果你不小心丢掉100块钱，只知道它好像丢在某个你走过的地方，你会花200块钱的车费去把那100块找回来吗？</p>
<p><br>回答：一个超级愚蠢的问题。</p>
<p><br>可是，相似的事情却在人生中不断发生。做错了一件事，明知自己有问题，却怎么也不肯认错，反而花加倍的时间来找借口，让别人对自己的印象大打折扣。被人骂了一句话，却花了无数时间难过。道理相同，为一件事情发火，不惜损人不利已，不惜血本，不惜时间，只为报复，不也一样无聊</p>
<p><br>失去一个人的感情，明知一切已无法挽回，却还是那么伤心，而且一伤心就是好几年，还要借酒浇愁，形销骨立。其实这样一点用也没有，只是损失更多。</p>
<p><br>——做人，干吗为难自己？！</p>
<p><br>问题三：你会因为打开报纸发现每天都有车祸，就不敢出门吗？</p>
<p><br>回答：这是个什么烂问题？当然不会，那叫因噎废食。</p>
<p><br>然而，有不少人却曾说：现在的离婚率那么高，让我都不敢谈恋爱了。说得还挺理所当然。也有不少女人看到有关的诸多报道，就对自己的另一半忧心忡忡，这不也是类似的反应？所谓乐观，就是得相信：虽然道路多艰险，我还是那个会平安过马路的人，只要我小心一点，不必害怕过马路。</p>
<p><br>——做人，先要相信自己</p>
<p><br>问题四：你相信每个人随便都可以成功立业吗？</p>
<p><br>回答：当然不会相信。</p>
<p><br>但据观察，有人总是在听完成功人士绞尽脑汁的建议，比如说，多读书，多练习之后，问了另一个问题？那不是很难？</p>
<p><br>我们都想在3分钟内学好英文，在5分钟内解决所有难题，难道成功是那么容易的吗？改变当然是难的。成功只因不怕困难，所以才能出类拔萃。</p>
<p><br>有一次坐在出租车上，听见司机看到自己前后都是高档车，兀自感叹：&#8220;唉，为什么别人那么有钱，我的钱这么难赚？&#8221;</p>
<p><br>我心血来潮，问他：&#8220;你认为世上有什么钱是好赚的？&#8221;他答不出来，过了半晌才说：好像都是别人的钱比较好赚。</p>
<p><br>其实任何一个成功者都是艰辛取得。我们实在不该抱怨命运。</p>
<p><br>——做人，依*自己！</p>
<p><br>问题五：你认为完全没有打过篮球的人，可以当很好的篮球教练吗？</p>
<p><br>回答：当然不可能，外行不可能领导内行。</p>
<p><br>可是，有许多人，对某个行业完全不了解，只听到那个行业好赚钱，就马上开起业来了。</p>
<p><br>我看过对穿着没有任何口味、或根本不在乎穿着的人，梦想却是开间服装店；不知道电脑怎么开机的人，却想在网上聊天，结果道听途说，却不反省自己是否专业能力不足，只抱怨时不我与</p>
<p><br>——做人，量力而行。</p>
<p><br>问题六：相似但不相同的问题：你是否认为，篮球教练不上篮球场，闭着眼睛也可以主导一场完美的胜利？</p>
<p><br>回答：有病啊，当然是不可能的。</p>
<p><br>可是却有不少朋友，自己没有时间打理，却拼命投资去开咖啡馆，开餐厅，开自己根本不懂的公司，火烧屁股一样急着把辛苦积攒的积蓄花掉，去当一个稀里糊涂的投资人。亏的总是比赚的多，却觉得自己是因为运气不好，而不是想法出了问题。</p>
<p><br>——做人，记得反省自己。</p>
<p><br>问题七：你宁可永远后悔，也不愿意试一试自己能否转败为胜</p>
<p>解答：恐怕没有人会说：&#8220;对，我就是这样的孬种。&#8221;</p>
<p><br>然而，我们却常常在不该打退堂鼓时拼命打退堂鼓，为了恐惧失败而不敢尝试成功。</p>
<p><br>以关颖珊赢得2000年世界花样滑冰冠军时的精彩表现为例：她一心想赢得第一名，然而在最后一场比赛前，她的总积分只排名第三，在最后的自选曲项目上，她选择了突破，而不是少出错。在4分钟的长曲中，结合了最高难度的三周跳，并且还大胆地连跳了两次。她也可能会败得很难看，但是，她毕竟成功了。</p>
<p><br>她说：&#8220;因为我不想等到失败，才后悔自己还有潜力没发挥。&#8221;</p>
<p><br>一个中国伟人曾说：胜利的希望和有利情况的恢复，往往产生于再坚持一下的努力之中。</p>
<p><br>——做人，何妨放手一搏</p>
<p><br>问题八：你的时间无限，长生不老，所以最想做的事，应该无限延期？</p>
<p><br>回答：不，傻瓜才会这样认为。</p>
<p><br>然而我们却常说，等我老了，要去环游世界；等我退休，就要去做想做的事情；等孩子长大了，我就可以&#8230;&#8230;</p>
<p><br>我们都以为自己有无限的时间与精力。其实我们可以一步一步实现理想，不必在等待中徒耗生命。如果现在就能一步一步努力接近，我们就不会活了半生，却出现自己最不想看到的结局。</p>
</font>
<img src ="http://www.phpweblog.net/killjin/aggbug/3000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-19 18:01 <a href="http://www.phpweblog.net/killjin/archive/2008/03/19/3000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>放弃与得到</title><link>http://www.phpweblog.net/killjin/archive/2008/03/19/2998.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 19 Mar 2008 07:12:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/19/2998.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2998.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/19/2998.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2998.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2998.html</trackback:ping><description><![CDATA[<p>你开着一辆车。 <br>在一个暴风雨的晚上。 <br>你经过一个车站。 <br>有三个人正在焦急的等公共汽车。 　 <br>一个是快要临死的老人，他需要马上去医院。 <br>一个是医生，他曾救过你的命，你做梦都想报答他。 <br>还有一个女人/男人，她/他是你做梦都想嫁/娶的人，也许错过就没有了。 <br>但你的车只能在坐下一个人，你会如何选择？ <br>我不知道这是不是一个对你性格的测试, 因为每一个回答都有他自己的原因。 <br>老人快要死了，你首先应该先救他。 <br>你也想让那个医生上车，因为他救过你，这是个好机会报答他。 <br>还有就是你的梦中情人。错过了这个机会。你可能永远不能遇到一个让<br>你这么心动的人了。 <br>　　<br>在200个应征者中，只有一个人被雇佣了，他并没有解释他的理由，他只是说了以下的话</p>
<p><br>&#8220;给医生车钥匙，让他带着老人去医院，而我则留下来陪我的梦中情人一起等公车!" <br>　　　 <br>每个人我认识的人都认为以上的回答是最好的，但没有一个人（包括我在内）一开始都没想到。 <br>　　 <br>是否是因为我们从未想过要放弃我们手中已经拥有的优势（车钥匙）? 有时，如果我们能放弃一些我们的固执，狭隘，和一些优势的话，我们可能会得到更多 </p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-19 15:12 <a href="http://www.phpweblog.net/killjin/archive/2008/03/19/2998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>世界上所有人的心事</title><link>http://www.phpweblog.net/killjin/archive/2008/03/19/2997.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 19 Mar 2008 07:09:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/19/2997.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2997.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/19/2997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2997.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2997.html</trackback:ping><description><![CDATA[<p>人啊，都不讲实话： </p>
<p>说股票是毒品，都在玩； <br>说金钱是罪恶，都在捞； <br>说美女是祸水，都想要； <br>说高处不胜寒，都在爬； <br>说烟酒伤身体，就不戒； <br>说天堂最美好，都不去!!! <br>当今社会，穷吃肉，富吃虾，领导干部吃王八； <br>男想高，女想瘦， <br>狗穿衣裳人露肉； <br>过去把第一次留给丈夫 <br>现在把第一胎留给丈夫； <br>乡下早晨鸡叫人， <br>城里晚上人叫鸡； <br>旧社会戏子卖艺不卖身， <br>新社会演员卖身不卖艺 </p>
<p>工资真的要涨了 <br>心里更加爱党了 <br>能给孩子奖赏了 <br>见到老婆敢嚷了 <br>敢尝海鲜鹅掌了 <br>闲时能逛商场了 <br>遇见美女心痒了 <br>结果物价又涨了<br>一切都TM白想了</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-19 15:09 <a href="http://www.phpweblog.net/killjin/archive/2008/03/19/2997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSI</title><link>http://www.phpweblog.net/killjin/archive/2008/03/04/2882.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 03 Mar 2008 21:11:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/04/2882.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2882.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/04/2882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2882.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2882.html</trackback:ping><description><![CDATA[直译服务器端包含(Server&nbsp;Side&nbsp;Includes)，由字面上看由WEB在服务器提供的一种功能，并且是在服务器端进行的。一般说来，要完成较复杂的任务（如：聊天室／留言本等），必须设计专门的CGI或ASP程序；但是如果只是想给网页加上简单的功能(如：显示一篇文档，web服务器环境变量，关于该文档的更新日期／大小等)，则只要SSI就可以完成了。SSI则是直接由服务器解释执行的，须要WEB服务器软件支持SSI。<br>而且，由于直接在服务器端执行SSI，产生相应HTML代码；所以对客户端没有限制，不会产生因为不同浏览器而产生不同的观看效果。<br>SSI有什么用?<br>目前，主要有以下几种用用途：<br>1、&nbsp;显示服务器端环境变量&lt;#echo&gt;<br>2、&nbsp;将文本内容直接插入到文档中&lt;#include&gt;<br>3、&nbsp;显示WEB文档相关信息&lt;#flastmod&nbsp;#fsize&gt;&nbsp;(如文件制作日期/大小等)<br>4、&nbsp;直接执行服务器上的各种程序&lt;#exec&gt;(如CGI或其他可执行程序)<br>5、&nbsp;设置SSI信息显示格式&lt;#config&gt;(如文件制作日期/大小显示方式)<br>高级SSI&lt;XSSI&gt;可设置变量使用if条件语句。<br>使用SSI很容易吧？<br>SSI是为WEB服务器提供的一套命令，这些命令只要直接嵌入到HTML文档的注释内容之中即可。如：<br>&lt;!--#include&nbsp;file="info.htm"--&gt;<br>就是一条SSI指令，其作用是将"info.htm"的内容拷贝到当前的页面中，当访问者来浏览时，会看到其它HTML文档一样显示info.htm其中的内容。<br>其它的SSI指令使用形式基本同刚才的举例差不多，可见SSI使用只是插入一点代码而已，使用形式非常简单。<br>当然，如果WEB服务器不支持SSI，它就会只不过将它当作注释信息，直接跳过其中的内容；浏览器也会忽略这些信息。<br>如何在我的WEB服务器上配置SSI功能？<br>在一些WEB服务器上（如IIS&nbsp;4.0/SAMBAR&nbsp;4.2），包含&nbsp;#include&nbsp;指令的文件必须使用已被映射到&nbsp;SSI&nbsp;解释程序的扩展名；否则，Web&nbsp;服务器将不会处理该SSI指令；默认情况下，扩展名&nbsp;.stm、.shtm&nbsp;和&nbsp;.shtml&nbsp;被映射到解释程序（Ssinc.dll）。<br>Apache则是根据你的设置情况而定，修改srm.conf如：<br>AddType&nbsp;text/x-server-parsed-html&nbsp;.shtml<br>将只对.shtml扩展名的文件解析SSI指令<br>AddType&nbsp;text/x-server-parsed-html&nbsp;.html<br>将对所有HTML文档解析SSI指令<br>Netscape&nbsp;WEB服务器直接使用Administration&nbsp;Server(管理服务器)可打开SSI功能。<br>Website使用Server&nbsp;Admin程序中的Mapping标签，扩展名添加内容类型为：wwwserver/html-ssi<br>Cern服务器不支持SSI，可用SSI诈骗法，到<br>[url]http://sw.cse.bris.ac.uk/WebTools/fakessi.html[/url]<br>上下载一个PERL脚本，即可使你的CERN服务器使用一些SSI指令。（不支持exec指令。）<br>二、SSI指令使用详解<br>1.#echo&nbsp;示范<br>作用：<br>将环境变量插入到页面中。<br>语法：<br>&lt;!--#echo&nbsp;var=&#8221;变量名称&#8221;--&gt;<br>示例：<br>本文档名称：&lt;!--#echo&nbsp;var=&#8221;DOCUMENT_NAME&#8221;--&gt;<br>现在时间：&lt;!--#echo&nbsp;var=&#8221;DATE_LOCAL&#8221;--&gt;<br>你的IP地址是：&lt;!--#echo&nbsp;var=&#8221;REMOTE_ADDR&#8221;--&gt;<br>可在SSI中使用的变量：&nbsp;1．只有SSI中能使用的变量。2．标准CGI变量3．某些服务器支持的变量<br>①下面是在标准SSI支持的变量：<br>&gt;&gt;&nbsp;变量名称<br>作用<br>示例<br>1<br>DOCUMENT_NAME<br>当前文档名<br>echo.html<br>2<br>DOCUMENT_URL<br>或DOCUMENT_URI<br>当前文档相对URL<br>/ssi/echo.html<br>3<br>QUERY_STRING_UNESCAPED<br>或QUERY_STRING<br>所发送的查询字符串<br>sample<br>4<br>DATE_LOCAL<br>服务器中当前日期<br>Sun,&nbsp;23&nbsp;May&nbsp;1999&nbsp;21:54:30<br>5<br>DATE_GMT<br>以格林威冶时间设置的服务器时间<br>Sun,&nbsp;23&nbsp;May&nbsp;1999&nbsp;13:54:30<br>6<br>LAST_MODIFIED<br>当前文档最后修改时间<br>23-May-1999&nbsp;PST<br>&gt;&gt;<br>②标准的CGI变量<br>WEB上关于CGI环境变量测试的示例：<br>LINUX下Apache：http://hoyi.zb169.net/cgi-bin/hiecho.cgi?sample<br>Freebsd下Apache:&nbsp;[url]http://hoyi.onlineexpress.net/cgi-bin/hiecho.cgi?sample[/url]<br>&gt;&gt;&nbsp;CGI环境变量名称<br>作用<br>示例<br>1<br>AUTH_TYPE<br>用户所使用的身份验证类型<br>&gt;&gt;&nbsp;<br>2<br>CONTENT_LENGTH<br>服务器输出文本长度<br>0<br>3<br>HTTP_ACCEPT<br>客户机可接受的MIME类型<br>application/vnd.ms-excel,&nbsp;application/msword,&nbsp;*/*<br>4<br>HTTP_USER_AGENT<br>客户机浏览器配置状况<br>Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;4.01;&nbsp;Windows&nbsp;98)<br>5<br>GATEWARY_INTERFACE<br>服务器所使用的&nbsp;CGI&nbsp;规范的修正版<br>CGI/1.1<br>6<br>PATH_INFO<br>客户端给出附加路径信息<br>&gt;&gt;&nbsp;<br>7<br>PATH_TRANSLATED<br>PATH_INFO&nbsp;的值，但带有扩展为某个目录规范的虚拟路径<br>/v/spool/webadm/html<br>8<br>QUERY_STRING<br>在引用该脚本的&nbsp;URL&nbsp;中跟在问号&nbsp;(?)&nbsp;后面的信息<br>Sample<br>9<br>REMOTE_ADDR<br>客户机IP地址<br>202.103.27.103<br>10<br>REMOTE_HOST<br>客户机名称<br>&gt;&gt;&nbsp;<br>11<br>REQUEST_METHOD<br>HTTP请求方法<br>GET<br>12<br>SCRIPT_NAME<br>当前脚本名称<br>/cgi-main/cgiwrap/hoyi/hiecho.cgi<br>13<br>SERVER_NAME<br>服务器名称或IP地址<br>hoyi.zb169.net<br>14<br>SERVER_PORT<br>服务器接请求的TCP/IP端口<br>80<br>15<br>SERVER_PROTOCOL<br>与请求有关的信息检索协议的名称与版本，通常为&nbsp;HTTP/1.0<br>HTTP/1.1<br>16<br>SERVER_SOFTWARE<br>响应请求的&nbsp;Web&nbsp;服务器软件的名称和版本<br>Apache/1.3.6&nbsp;(Unix)<br>&gt;&gt;2、#include&nbsp;示范<br>作用：<br>将文本文件的内容直接插入到文档页面中。<br>语法：<br>&lt;!--#include&nbsp;file=&#8221;文件名称&#8221;--&gt;<br>&lt;!--#include&nbsp;virtual=&#8221;文件名称&#8221;--&gt;<br>file&nbsp;文件且桓鱿喽月肪叮寐肪断喽杂谑褂?nbsp;#include&nbsp;指令的文档所在的目录。被包含文件可以在同一级目录或其子目录中，但不能在上一级目录中。如表示当前目录下的的nav_head.htm文档，则为file=&#8221;nav_head.htm&#8221;。<br>virtual&nbsp;文件名是&nbsp;Web&nbsp;站点上的虚拟目录的完整路径。如表示相对于服务器文档根目录下hoyi目录下的nav_head.htm文件；则为file=&#8221;/hoyi/nav_head.htm&#8221;<br>参数：<br>file&nbsp;指定包含文件相对于本文档的位置<br>virtual&nbsp;指定相对于服务器文档根目录的位置<br>注意：<br>1、文件名称必须带有扩展名。<br>2、被包含的文件可以具有任何文件扩展名，我觉得直接使用htm扩展名最方便，微软公司推荐使用&nbsp;.inc&nbsp;扩展名（这就看你的爱好了）。<br>示例：<br>&lt;!--#include&nbsp;file=&#8221;nav_head.htm&#8221;--&gt;将头文件插入到当前页面<br>&lt;!--#include&nbsp;file=&#8221;nav_foot.htm&#8221;--&gt;将尾文件插入到当前页面<br>3.&nbsp;#flastmod&nbsp;和#fsize&nbsp;示范<br>作用：<br>#flastmod&nbsp;文件最近更新日期<br>#fsize&nbsp;文件的长度<br>语法：<br>&lt;!--#flastmod&nbsp;file=&#8221;文件名称&#8221;--&gt;<br>&lt;!--#fsize&nbsp;file=&#8221;文件名称&#8221;--&gt;<br>参数：<br>file&nbsp;指定包含文件相对于本文档的位置&nbsp;如&nbsp;info.txt&nbsp;表示当前目录下的的info.txt文档<br>virtual&nbsp;指定相对于服务器文档根目录的位置&nbsp;如&nbsp;/hoyi/info.txt&nbsp;表示<br>注意：<br>文件名称必须带有扩展名。<br>&gt;&gt;<br>&gt;&gt;<br>示例：<br>&lt;!--#flastmod&nbsp;file=&#8221;news.htm&#8221;--&gt;<br>将当前目录下news.htm文件的最近更新日期插插入到当前页面<br>&lt;!--#fsize&nbsp;file=&#8221;news.htm&#8221;--&gt;<br>将当前目录下news.htm的文件大小入到当前页面<br>4.#exec&nbsp;示范<br>作用：<br>将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入，这取决于使用的参数是cmd还是cgi。<br>语法：<br>语法：<br>&lt;!--#exec&nbsp;cmd=&#8221;文件名称&#8221;--&gt;<br>&lt;!--#exec&nbsp;cgi=&#8221;文件名称&#8221;--&gt;<br>参数：<br>cmd&nbsp;常规应用程序<br>cgi&nbsp;CGI脚本程序<br>示例：<br>&lt;!--#exec&nbsp;cmd=&#8221;cat&nbsp;/etc/passwd&#8221;--&gt;将会显示密码文件<br>&lt;!--#exec&nbsp;cmd=&#8221;dir&nbsp;/b&#8221;--&gt;将会显示当前目录下文件列表<br>&gt;&gt;<br>&lt;!--#exec&nbsp;cgi=&#8221;/cgi-bin/gb.cgi&#8221;--&gt;将会执行CGI程序gb.cgi。<br>&lt;!--#exec&nbsp;cgi=&#8221;/cgi-bin/access_log.cgi&#8221;--&gt;将会执行CGI程序access_log.cgi。<br>注意：<br>从上面的示例可以看出，这个指令相当方便，但是也存在安全问题。<br>禁止方法：<br>．Apache，将access.conf中的&#8221;Options&nbsp;Includes&nbsp;ExecCGI&#8221;这行代码删除；<br>．在IIS中，要禁用&nbsp;#exec&nbsp;命令，可修改&nbsp;SSIExecDisable&nbsp;元数据库；<br>5.#config<br>作用：<br>指定返回给客户端浏览器的错误信息、日期和文件大小的格式。<br>
<h4>[转载]什么是SSI</h4>
<br>语法：<br>&lt;!--#config&nbsp;errmsg=&#8221;自定义错误信息&#8221;--&gt;<br>&lt;!--#config&nbsp;sizefmt=&#8221;显示单位&#8221;--&gt;<br>&lt;!--#config&nbsp;timefmt=&#8221;显示格式&#8221;--&gt;<br>参数：<br>errmsg&nbsp;自定义SSI执行错误信息，可以为任何你喜欢的方式。<br>sizefmt&nbsp;文件大小显示方式，默认为字节方式(&#8220;bytes&#8221;)可以改为千字节方式(&#8220;abbrev&#8221;)<br>timefmt&nbsp;时间显示方式，最灵活的配置属性。<br>代码<br>示例<br>作用<br>代码<br>示例<br>作用<br>%a<br>Mon<br>缩写的星期几<br>%m<br>05<br>月份数<br>%A<br>Monday<br>星期几<br>%M<br>55<br>分<br>%b<br>%h<br>Aug<br>缩写的月份名<br>%p<br>AM<br>上、下午(AM或PM)<br>%r<br>10:20:20&nbsp;AM<br>12小制时间<br>%B<br>Auguest<br>月份名<br>%s<br>40<br>秒<br>%d<br>01<br>当月第几天<br>%T<br>20:20:30<br>24小制时间<br>%D<br>05/28/99<br>数字日期<br>%U<br>%W<br>21<br>一年中的星期<br>%e<br>1<br>当月第几天，前面不放0<br>%w<br>2<br>从星期天至今天数<br>%H<br>20<br>小时(24小时制)<br>%y<br>99<br>2位数格式的年号<br>%I<br>08<br>小时(12小时制)<br>%Y<br>1999<br>4位数表示的年号<br>%j<br>320<br>一年中的天数<br>%z<br>PDT<br>时区位置<br>&gt;&gt;<br>示例：<br>显示一个不存在文件的大小<br>&lt;!--#config&nbsp;errmsg=&#8221;服务器执行错误，请联系管理员&nbsp;[email]yiho@126.com[/email]，谢谢?gt;&gt;?-&gt;<br>&lt;!--#fsize&nbsp;file=&#8221;不存在的文件.htm&#8221;--&gt;<br>以千字节方式显示文件大小<br>&lt;!--#config&nbsp;sizefmt=&#8221;abbrev&#8221;--&gt;<br>&lt;!--#fsizefile=&#8221;news.htm&#8221;--&gt;<br>以特定的时间格式显示时间<br>&lt;!--#config&nbsp;timefmt=&#8221;%Y年/%m月%d日&nbsp;星期%W&nbsp;北京时间%H:%M:%s，%Y年已过去了%j天&nbsp;今天是%Y年的第%U个星期&#8221;--&gt;<br>&lt;!--#echo&nbsp;var=&#8221;DATE_LOCAL&#8221;--&gt;<br>显示今天是星期几,几月,时区<br>&lt;!--#config&nbsp;timefmt=&#8221;今天%A,&nbsp;%B&nbsp;,服务器时区是&nbsp;%z，是&#8221;--&gt;<br>&lt;!--#echo&nbsp;var=&#8221;DATE_LOCAL&#8221;--&gt;<br>★&nbsp;163镜像&nbsp;<br>★&nbsp;回&nbsp;全易主页&nbsp;<br>★&nbsp;全易CGI软件&nbsp;<br>■&nbsp;加入邮件列表&nbsp;<br>■&nbsp;全易网上商店&nbsp;◆&nbsp;<br>◆&nbsp;虚拟域名系统&nbsp;<br>◆&nbsp;域名注册系统&nbsp;<br>◆&nbsp;在线定单处理&nbsp;<br>◆&nbsp;会员管理系统&nbsp;<br>◆&nbsp;邮件列表管家&nbsp;<br>◆&nbsp;全易数据库&nbsp;<br>◆&nbsp;免费提醒(插件)&nbsp;<br>◆&nbsp;免费贺卡(插件)&nbsp;<br>■&nbsp;产品支持&nbsp;<br>■&nbsp;订购产品<br>■&nbsp;意见反馈&nbsp;<br>■&nbsp;友情链结&nbsp;<br>◆&nbsp;网络安全&nbsp;<br>◆&nbsp;SSI全攻略&nbsp;<br>■&nbsp;最新免费主机&nbsp;<br>■&nbsp;联系我们&nbsp;<br>合作网站<br>◆&nbsp;消费导航站按此&gt;&gt;<br>很容易赢的&nbsp;Iwin<br>◆玩呗，按此&gt;&gt;<br>◆&nbsp;Iwin我得奖<br>◆&nbsp;加入有2美元&nbsp;<br>加入全易邮件列表&nbsp;<br>邮件:&nbsp;<br>姓名:&nbsp;<br>称呼:先生小姐&nbsp;<br>&gt;&gt;<br>6.XSSI<br>XSSI（Extended&nbsp;SSI）是一组高级SSI指令，内置于Apache&nbsp;1.2或更高版本的mod-include模块之中。<br>其中可利用的的指令有：<br>#printenv<br>#set<br>#if<br>#printenv<br>作用：<br>显示当前存在于WEB服务器环境中的所有环境变量。<br>语法：&lt;!--#printenv--&gt;<br>参数：无<br>示例：<br>&lt;!--#printenv--&gt;<br>#set<br>作用：可给变量赋值，以用于后面的if语句。<br>语法：&lt;!--#set&nbsp;var=&#8221;变量名&#8221;value=&#8221;变量值&#8221;--&gt;<br>参数：无<br>示例：<br>&lt;!--#set&nbsp;var=&#8221;color&#8221;value=&#8221;红色&#8221;--&gt;<br>#if<br>作用：<br>创建可以改变数据的页面，这些数据根据使用if语句时计算的要求予以显示。<br>语法：<br>&lt;!--#if&nbsp;expr=&#8221;$变量名=\&#8221;变量值A\&#8221;&#8221;--&gt;<br>显示内容<br>&lt;!--#elif&nbsp;expr=&#8221;$变量名=\&#8221;变量值B\&#8221;&#8221;--&gt;<br>显示内容<br>&lt;!--#else--&gt;<br>显示内容<br>&lt;!--#endif&#8221;--&gt;<br>参数：<br>关于XSSI的条件表达式<br>表达式<br>作用<br>(string)<br>如果string存在，就返回真<br>string1=string2<br>如果两个字符串相等，就返回真<br>string1!=string2<br>如果两个字符串不等，就返回真<br>string1&lt;string2<br>如果string1小于string2，就返回真<br>string1&lt;=string2<br>如果string1小于等于string2，就返回真<br>string1&gt;string2<br>如果string1大于string2，就返回真<br>string1&gt;=string2<br>如果string1大于等于string2，就返回真<br>!string<br>！为&#8221;非&#8221;操作符；若string存在，就返回真<br>(string1)&amp;&amp;(string2)<br>&amp;&amp;为&#8221;与&#8221;操作符；string1、string2都存在，就返回真<br>(string1)!!(string2)<br>!!&nbsp;为&#8221;或&#8221;操作符；string1、string2有一个存在，就返回真<br>示例：<br>&lt;!--#if&nbsp;expr=&#8221;$SERVER_NAME=\&#8221;hoyi.zb169.net\&#8221;&#8221;--&gt;<br>欢迎光临好易CGI工厂在淄博热线的分站[url]http://hoyi.zb169.net[/url]。<br>&lt;!--#elif&nbsp;expr=&#8221;$SERVER_NAME=\&#8221;linux.cqi.com.cn\&#8221;&#8221;&nbsp;--&gt;<br>欢迎光临好易CGI工厂在太阳城的分站[url]http://linux.cqi.com.cn/~hoyi[/url]。<br>&lt;!--#else--&gt;<br>欢迎光临好易CGI工厂！<br>&lt;!--#endif&#8221;--&gt;<br>注意：<br>用于前面指令中的反斜杠，是用来代换内部的引号，以便它们不会被解释为结束表达式。不可省略。 
<img src ="http://www.phpweblog.net/killjin/aggbug/2882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-04 05:11 <a href="http://www.phpweblog.net/killjin/archive/2008/03/04/2882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNIX常用命令</title><link>http://www.phpweblog.net/killjin/archive/2008/03/04/2881.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 03 Mar 2008 21:10:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/04/2881.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2881.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/04/2881.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2881.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2881.html</trackback:ping><description><![CDATA[UNIX常用命令：
<p>下述命令参考包含94个UNIX最常用的快速总结。<br>apropos<br>用途：apropos查找使用说明的名称。<br>举例：apropos print(等价于man -k prink)。<br>arch<br>用途：arch获得机器体系结构的描述信息。<br>举例：arch。下面是arch输出的结果： sun4<br>将这个命令与uname进行比较。<br>ash<br>用途：ash是外壳，只用于某些系统。<br>举例：ash。这个命令启动ash外壳的一个实例。<br>at<br>用途：at用于确定命令执行的时刻。<br>举例：at 9:00am December 31。<br>awk<br>用途：awk是一种模式扫描和执行语言。<br>举例：awk\'{print $1}\'file.txt。这个命令执行后将打印出file.txt的第一个区域。<br>bash<br>用途：bash是GNU Bourne-Again外壳。<br>举例：bash[options]。这个命令启动bash外壳，它是一个增强的和sh兼容的外壳。bash的提示符为$。<br>biff<br>用途：biff通知你是否收到了邮件。<br>举例：biffy。这个命令叫biff通知你新邮件什么时候到达（注意，要想让biff工作，你必须同时运行 sendmail)。<br>cancel<br>用途：cancel取消挂起的打印作业。<br>举例：cancel23。这个命令取消23号打印作业。<br>cal<br>用途：cal显示无格式文本日历。<br>举例：cal。以下是命令执行后输出的列表： August 1998</p>
<p><br>cat<br>用途：cat将文件连接在一起并显示这些文件中的内容。<br>举例：cat myfile.txt。这个命令执行后显示myfile.txt中的内容。<br>cc<br>用途：cc是用于许多系统的C编译器。<br>举例：cc myfile.c -o myfile。这个命令执行后对myfile.c源文件进行编译并输出一个名为myfile的可执行文件。<br>cd<br>用途：cd用来改变当前目录。<br>举例：cd/usr/bin。这个命令执行后将当前目录更改为/usr/bin。<br>chfn<br>用途：chfn用来改变finger信息。<br>举例：chfn(系统将会提示你进行更改）。<br>chgrp<br>用途：chgrp用来改变文件的组所有权。<br>举例：chgrp users/home/bwagner/*。这个命令执行后是"users"组的每一个人都可以访问我的文件。 （bwagner代表你的用户名）<br>chmod<br>用途：chmod用来改变指定文件的权限。<br>举例：chmod=r myfile.txt。这个命令执行后将myfile.txt的权限更改为只读。<br>chown<br>用途：chown用来改变文件的所有权。<br>举例：chown bwagner myfile.txt。这个命令执行后将myfile.txt的权限授予我。<br>clear<br>用途：clear用来清除屏幕。<br>举例：clear。<br>comm<br>用途：comm逐行比较两个文件。<br>举例：comm myfile.txt yourfile.txt。这个命令执行后将myfile.txt和yourfile.txt两个文件进行比较。<br>compress<br>用途：compress用来压缩文件，在压缩后给文件以.z的扩展名。将这个命令和gzip比较一下。<br>举例：compress myfile.txt。这个命令执行后将myfile.txt进行压缩并给它起一个.z的扩展名。最后得到的文件名是myfile.txt.z。<br>cp<br>用途：cp用来复制文件。<br>举例：cp myfile.txt yourfile.txt。这个命令执行后将myfile.txt的内容复制到一个名叫yourfile.txt的文件中去。<br>csh<br>用途：csh是C外壳。<br>举例：csh。这个命令执行后启动C外壳。当你启动了csh后，可以判断出运行环境已改变了，因为系统提示符已从$变为%。<br>cu<br>用途：cu使用标准的拨出线路呼叫另一个系统。<br>举例：cu 5555555。这个命令执行后使用电话号码5555555呼叫另外一个系统。<br>cut<br>用途：cut用来删除文件中的列或行。<br>举例：cut -c2 myfile.txt。这个命令执行后将删除myfile.txt文件中的第2列（与cut相对的命令是paste）。<br>date<br>用途：date用来得到日期和时间。<br>举例：date。以下是date命令执行后输出的列表：<br>Wed Aug 5 19:10:42 PDT 1998<br>df<br>用途：报告磁盘中可以使用的自由空间。<br>举例：df。以下是该命令执行后输出的列表：<br>diff<br>用途：diff用来比较两个文件并报告这两个文件的不同之处。<br>举例：diff myfile.txt yourfile.txt。这个命令执行后比较myfile.txt和yourfile.txt两个文件。diff将显示这两个文件中所有的不同行。将这个命令和comm和uniq命令进行比较。<br>dir<br>用途：dir用来列出某些平台上的目录内容。<br>举例：dir(dir的功能和ls完全相同，但是它所带的选项更少。dir并不适合于所有的UNIX系统）。<br>du<br>用途：du报告磁盘的使用情况。<br>举例：du。以下是du命令执行后输出的列表。<br>echo<br>用途：echo用来显示指定的文本内容。<br>举例：echo"This is my workstation."。这个命令执行后将在屏幕上打印出下列信息：<br>This is my workstation。<br>ed<br>用途：ed是一个简单的no-frill的文本编辑器。<br>举例：ed。<br>egrep<br>用途：egrep用来查找文件中符合一定要求的模式。当该命令找到指定的模式时，它将会在屏幕上打印出相应的行。<br>举例：egrep"I am bored"myfile.txt。这个命令执行后将查找myfile.txt文件中的I am bored字符串。<br>elm<br>用途：elm是一个流行的邮件客户程序。<br>举例：elm。这个命令将启动elm邮件阅读器。<br>file<br>用途：file用来报告指定文件中的数据类型。<br>举例：file * 。以下是file命令执行后输出的列表：<br>find<br>用途：find用来查找目录中的文件。<br>举例：find.-name*gif。这个命令执行后查找位于我的主目录中或主目录以下带有.gif扩展名的所有文件。以下是find执行后输出的列表：<br>finger<br>用途：finger用来报告用户信息。<br>举例：finger bwagner。这个命令执行后将列出和我有关的当前可用的所有信息。<br>用途：fsck用来检查和修改文件系统。<br>举例：fsck/dev/dsk/cot1d0s0。fsck是一个存在潜在威胁的命令。在使用该命令前应阅读和它有关的使用说明。<br>ftp<br>用途：ftp用来在主机之间传送文件。<br>举例：ftp traderights.pacificnet.net。这个命令执行后将本机连接到traderights.pacificnet.net上。ftp带有非常多的选项和标志。查找该命令的使用说明可获得更进一步的信息。<br>g<br>用途：g++是GNU项目C编译器。<br>举例：g++ myfile.c -o myfile。这个命令执行后将对用C++编写的程序进行编译并输出名叫myfile的可执行文件。<br>gawk<br>用途：gawk是awk的GNU免费版。<br>举例：awk\'{print $1}\'file.txt。这个命令执行后将打印出file.txt文件的第一个区域。<br>gcc<br>用途：gcc是GNU项目C和C++编译器。<br>举例：gcc myfile.c -o myfile。这个命令执行后对myfile.c源文件进行编译并输出名叫myfile的可执行文件。<br>grep<br>用途：grep用来查找符合某种模式的文本行并打印出所有相应的文本行。<br>举例：grep ecoli hamburger.txt。这个命令执行后查找hamburger.txt文件中的单词ecoli。<br>gunzip<br>用途：gunzip用来压缩或解压缩文件（通常是那些带有.gz扩展名的文件）。<br>举例：gunzip myfile.txt.gz。这个命令执行后将解压缩myfile.txt文件。<br>gzip<br>用途：gzip用来压缩或解压缩文件。<br>举例：gzip myfile.txt。这个命令执行时对myfile.txt进行压缩，产生一个名叫myfile.txt.gz的压缩文件。该压缩文件可以使用gzip或gunzip进行解压缩（将这个命令和gunzip进行比较）。<br>halt<br>用途：halt终止系统的运行。<br>举例：halt。<br>head<br>用途：head在默认的情况下输出任何文件的头10行。<br>举例：head myfile.txt。在这个命令执行后将在屏幕上显示myfile.txt的头10行。<br>hostname<br>用途：hostname用来打印出机器的主机名。<br>举例：hostname。<br>ispell<br>用途：ispell是一个在Linux上使用的交互式拼写检查程序。<br>举例：ispell myfile.txt。这个命令将启动ispell环境并检查myfile.txt文件是否存在拼写错误。<br>kill<br>用途：kill用来终止某个进程。<br>举例：kill 529。这个命令执行后将终止第529号进程。<br>ksh<br>用途：ksh是Korn外壳。<br>举例：ksh。这个命令将启动Korn外壳。<br>last<br>用途：last用来报告某个用户已登录的日期和时间。<br>举例：last bwagner|head -3。这个命令执行后将输出我最近的三次登录时间。ln<br>用途：ln用来在文件之间建立链接。<br>举例：ln myfile.txt another-file.txt。这个命令执行后将在myfile.txt中建立和another-file.txt之间的链接。一旦存在这种链接，对其中某个文件的修改都会导致对另外一个文件的修改。<br>lp<br>用途：lp用来将文件发送到打印机。<br>举例：lp myfile.txt。这个命令执行后将myfile.txt发送到打印机。<br>lpr<br>用途：lpr用来将作业发送到打印机（lpr是lp的Berkeley等价命令）。<br>举例：lpr myfile.txt。这个命令执行后将myfile.txt发送到打印机。<br>lprm<br>用途：lprm用来从打印机队列中删除作业。<br>举例：lprm 23。这个命令执行后将从打印机列表中删除第23号作业。<br>lpstat<br>用途：lpstat用来报告挂起的打印作业状态。<br>举例：lpstat。<br>ls<br>用途：ls用来列出目录内容。<br>举例：ls/home/bwagner。这个命令执行后将列出/home/bwagner目录中的内容。ls的典型命令行开关包括 -a(列出所有文件，包括隐藏文件）和-l(用长格式列出所有目录内容）。<br>mail<br>用途：mail允许用户发送和接收邮件。<br>举例：cat myfile.txt|mail bwagner。这个命令执行后将myfile.txt中的内容邮寄给我（也可以交互式使用mail,只要发送mail命令就行了)。<br>man<br>用途：man是UNIX参考手册的接口。这些手册通常称为使用说明(man pages)。<br>举例：man mail。这个命令执行后将启动mail使用说明。<br>mkdir<br>用途：mkdir用来创建指定的目录。<br>举例：mkdir bozo-mail。这个命令执行后将创建一个名叫bozo-mail的目录。<br>more<br>用途：more用来在屏幕上一次显示一屏文件的内容。<br>举例：more myfile.txt。这个命令执行后将显示myfile.txt中的内容，一次显示一屏。这样使得阅读内容超过40行的文件很轻松。<br>mount<br>用途：mount安装和卸载文件系统。<br>举例：mount/dev/fd0/mnt/floppy。这个命令执行后将第一个软盘驱动器安装在/mnt/floop目录中。<br>mv<br>用途：mv用来移动文件。<br>举例：mv myfile.txt/usr。这个命令执行后将myfile.txt移动到目录/usr。<br>nroff<br>用途：nroff将文本文件格式化为行式打印机或终端屏幕所需要的形式。<br>举例：nroff myfile.txt。这个命令执行后将产生一个清楚的、格式优美的输出结果。<br>passwd<br>用途：passwd用来更改用户密码。<br>举例：passwd(系统会提示用户进行更改）。<br>paste<br>用途：paste用来合并文件行或输出。<br>举例：who|awk\'{print $1}\'|paste--。这个命令执行后获得当前用户ID并将它们按行列格式打印。两个-符号指定列的形式。<br>perl<br>用途：perl(Practical Extraction and Report Language，实际抽取和报告语言）是一种功能强大的文本扫描语言。<br>举例：perl-e\'print"Hello Word\\n";\'。这个命令执行后将显示如下信息：<br>Hello Word<br>perl能用于编写复杂的程序。但是，这些程序一般不能在命令行键入。相反，它们存储在perl脚本文件中（包含许多perl命令的文本文件）。<br>pico<br>用途：pico是一个免费的文本编辑器，在某些UNIX版本中可以得到（特别是Linux)。<br>举例：pico myfile.txt。这个命令启动pico来编辑myfile.txt。<br>pine<br>用途：pine是一个可以免费获得的电子邮件和USENET软件包（许多UNIX系统也包括它，但是Pine最常见于Linux系统中）。<br>举例：pine。这个命令启动pine电子邮件阅读器。<br>ping<br>用途：ping用来检查其他主机是否运行并且状态良好。<br>举例：ping 207.171.0.111。以下是Sparc上的ping执行后输出的列表：<br>207.171.0.111 is alive<br>对于其他系统，ping执行后输出的情况会不一样。 printenv<br>用途：printenv用来打印当前的所有环境变量。<br>举例：printenv。以下是printenv命令执行后输出的列表：<br>ps<br>用途：ps用来报告当前进程的状态。<br>举例：ps-a。这个命令执行后将打印出当前所有的进程。以下是输出的列表：<br>用途：pwd用来显示当前的目录名。<br>举例：pwd。这个命令执行后将打印出当前目录名。<br>rcp<br>用途：rcp用来从远程主机中复制文件。<br>举例：rcp tigger:/home/poo/files.txt files.poo.txt。这个命令执行后将从主机"tigger"中复制文件file.txt并在本机中给该文件改名为files.poo.txt。<br>rlogin<br>用途：rlogin代表remote login(远程登录）。rlogin用来在与用户ID信息一致的网络上进行自动登录。<br>举例：rlogin tigger。这个命令启动本机和"tigger"主机之间的一次远程对话。<br>rm<br>用途：rm用来删除指定空目录。<br>举例：rm myfile.txt。这个命令执行后将删除myfile.txt。<br>rmdir<br>用途：rmdir用来删除空目录。<br>举例：rmdir/mydirectory。这个命令执行后将删除/mydirectory。<br>sh<br>用途：sh是UNIX外壳。<br>举例：sh。这个命令将启动UNIX外壳。<br>sort<br>用途：sort将文本文件逐行分类。<br>举例：sort myfile.txt。这个命令将myfile.txt中的内容分类。<br>stty<br>用途：stty显示或更改终端设置。<br>举例：stty[options]。stty带有100万个选项。<br>tail<br>用途：tail在默认情况下显示指定文件的最后10行。<br>举例：tail myfile.txt。这个命令执行后，屏幕上将显示myfile.txt的最后10行。你也可以指定显示的行数，比如tail-50 myfile.txt执行后，将会在屏幕上打印出文本的最后50行。<br>talk<br>用途：talk允许你和另一个用户进行聊天。<br>举例：talk bwagner。这个命令邀请我进行聊天。<br>telnet<br>用途：telnet允许你和其他主机进行远程会话。<br>举例：telnet 202.194.14.236。这个命令将启动本机连接到202.194.14.236。<br>traceroute<br>用途：traceroute跟踪分组从节点A（你的机器）传送节点B（某个远程主机）所经过的路径。这个命令通常用来确定网络中是否存在故障。<br>举例：traceroute mcp.com。以下是traceroute执行后输出的列表：<br>用途：tty显示当前终端名。<br>uname<br>用途：uname用来获得系统信息，包括体系结构、操作系统和处理器类型。<br>举例：uname-a。以下是uname执行后输出的实例：<br>SunOS wagjag 5.6 generic sun4u sparc SUNW,Ultra-1<br>uniq<br>用途：uniq查找指定文件中的重复行并将它们删除。<br>举例：uniq myfile.txt。<br>uptime<br>用途：uptime报告系统到现在为止运行了多长时间。<br>举例：uptime。以下是该命令执行后输出的实例：<br>9:31pm up 4 day(s),20:36,14 users,load average:0.00,0.01,0.02<br>vi<br>用途：vi是文本编辑器。<br>举例：vi myfile.txt。这个命令启动vi来编辑myfile.txt。<br>wall<br>用途：wall向所有的终端发送指定消息。<br>举例：wall work sucks!!。这个命令执行后将在所有终端上打印出以下消息：<br>work sucks!!<br>wc<br>用途：wc计算并显示指定文件中的字节数、字数和行数。<br>举例：wc myfile.txt。这个命令执行后显示myfile.txt的统计信息。<br>whatis<br>用途：whatis显示关于指定命令的简要描述。<br>举例：whatis whatis。这个命令执行后显示whatis的使用说明描述信息。以下是输出的列表：<br>whatis(1) -display manual page descriptions<br>Whereis<br>用途：whereis用于确定文件的位置。<br>举例：whereis traceroute。这个命令执行后查找traceroute文件。<br>who<br>用途：who显示目前已登录用户的统计信息。<br>whoami<br>用途：whoami显示你的当前用户ID。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-04 05:10 <a href="http://www.phpweblog.net/killjin/archive/2008/03/04/2881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讓Lifetype支援embed語法 </title><link>http://www.phpweblog.net/killjin/archive/2008/03/02/2868.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 02 Mar 2008 14:03:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/02/2868.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2868.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/02/2868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2868.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2868.html</trackback:ping><description><![CDATA[<p>今天在測試影片崁入部落格文章的功能,發現要直接撥放學校的ftp server的影片檔時,<br>卻發現一直出問題,原來這是因為Lifetype1.1版後,TinyMce預設不支援"embed"這<br>個語法....難怪阿隆一直試驗就是出不來<br><br>好險從中縣教網部落格找到答案了&nbsp;</p>
<p>所以每當阿隆插入embed語法的時候就是會被吃掉,就是因為Tinymce認為embed是不合法的參數,因此若要<br>使用embed這語法，就必須修改tiny_mce-plog.js這檔案。這個檔案的位置在blog資料夾中的js下的tinymce中,只要在「extended_valid_elements」裡加上<br><br>embed[type|height|width|autostart|src|wmode|FALSE|TRUE]"<br><br>請留意最後的" 千萬別忘記或是消除(阿隆一時大意沒注意到,時間都浪費掉了)....<br>例如原本是<br>span[class|align|style]",<br>修改為<br>span[class|align|style],embed[type|height|width|autostart|src|wmode|FALSE|TRUE]",<br><br>這樣一來就可以用html編輯器來使用embed的語法囉!!</p>
<p>老師可以使用下列阿隆整理過後的語法來試試看喔!</p>
<p>&lt;embed src="檔案位址" width="寬度" height="高度" EnableContextMenu=false&gt;</p>
<p>EnableContextMenu=false的功用是防止其他人從你影片上按右鍵得到你影片的<br>資訊、位置,但是阿隆只能說效果不太好,至於原因阿隆就不多說了,但至少比沒有做好</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-02 22:03 <a href="http://www.phpweblog.net/killjin/archive/2008/03/02/2868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于yum连接repository时间过长的解决方法～</title><link>http://www.phpweblog.net/killjin/archive/2008/03/01/2858.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sat, 01 Mar 2008 04:36:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/03/01/2858.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2858.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/03/01/2858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2858.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2858.html</trackback:ping><description><![CDATA[修改yum.repos.d文件夹下的repo文件，＃掉mirrorlist即可～<br>这样主要是不让其自动进行镜像搜索，加快索引速度～ <br><br><br>yum clean all 备用
<img src ="http://www.phpweblog.net/killjin/aggbug/2858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-03-01 12:36 <a href="http://www.phpweblog.net/killjin/archive/2008/03/01/2858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fstab格式</title><link>http://www.phpweblog.net/killjin/archive/2008/02/22/2820.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 22 Feb 2008 13:58:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/02/22/2820.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2820.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/02/22/2820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2820.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2820.html</trackback:ping><description><![CDATA[<p>linux /etc/fstab的内容主要包括六项：</p>
<p>例如下面两行：<br>LABEL=/&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; ext3&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1<br>/dev/sda2&nbsp;&nbsp;&nbsp; /mnt/D/&nbsp;&nbsp;&nbsp; vfat&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0</p>
<p><br>第一列：设备名或者设备卷标名 (/dev/sda10 或者 LABEL=/)<br>第二列: 设备挂载目录 (例如上面的 "/" 或者 "/mnt/D/")<br>第三列: 设备文件系统 (例如上面的 "ext3" 或者 "vfat")<br>第四列：挂载参数 (看帮助 man 8 mount)<br>对于已经挂载好的设备，例如上面的/dev/sda2，现在要改变挂载参数，这时可以不用卸载该设备，<br>而可以使用下面的命令（没有挂载的设备，remount 这个参数无效）<br>&nbsp;&nbsp;&nbsp; #mount /mnt/D/ -o remount,ro&nbsp; （改defaults为ro）<br>&nbsp;&nbsp;&nbsp; 为了安全起见，可以指明其他挂载参数，例如：<br>&nbsp;&nbsp;&nbsp; noexec (不允许可执行文件可执行，但千万不要把根分区挂为noexec，那就无法使用系统了，连mount 命令都无法使用了，这时只有重新做系统了！)<br>&nbsp;&nbsp;&nbsp; nodev (不允许挂载设备文件)<br>&nbsp;&nbsp;&nbsp; nosuid,nosgid(不允许有 suid 和 sgid 属性)<br>&nbsp;&nbsp;&nbsp; nouser(不允许普通用户挂载)<br>第五列：指明是否要备份 (0 为不备份，1 为要备份, 一般根分区要备份)<br>第六列：指明自检顺序 (0 为不自检，1 或者 2 为要自检, 如果是根分区要设为1，其他分区只能是2)</p>
<p>我的 Red Hat Enterprise Linux AS 4 /etc/fstab 举例：<br>-------------------------- file begin ------------------------------------------------------<br># This file is edited by fstab-sync - see 'man fstab-sync' for details<br>/dev/hda1&nbsp;&nbsp; /boot&nbsp;&nbsp; ext3&nbsp;&nbsp;&nbsp; defaults 1&nbsp; 2<br>/dev/hda2&nbsp;&nbsp; /data&nbsp;&nbsp; ext3&nbsp;&nbsp;&nbsp; defaults 1&nbsp; 2<br>/dev/hda3&nbsp;&nbsp; /&nbsp;&nbsp; ext3&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 1<br>/dev/hda5&nbsp;&nbsp; /oracle ext3&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 2<br>/dev/hda6&nbsp;&nbsp; /home&nbsp;&nbsp; ext3&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 2<br>/dev/hda7&nbsp;&nbsp; swap&nbsp;&nbsp;&nbsp; swap&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br>none&nbsp;&nbsp;&nbsp; /dev/pts&nbsp;&nbsp;&nbsp; devpts&nbsp; gid=5,mode=620&nbsp; 0&nbsp;&nbsp; 0<br>none&nbsp;&nbsp;&nbsp; /dev/shm&nbsp;&nbsp;&nbsp; tmpfs&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br>none&nbsp;&nbsp;&nbsp; /proc&nbsp;&nbsp; proc&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 0<br>/dev/hdc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /media/cdrom1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto&nbsp;&nbsp;&nbsp; pamconsole,exec,noauto,managed 0 0<br>-------------------------- file&nbsp;&nbsp; end -------------------------------------------------------</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-02-22 21:58 <a href="http://www.phpweblog.net/killjin/archive/2008/02/22/2820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随笔：2008年1月31号有感</title><link>http://www.phpweblog.net/killjin/archive/2008/01/31/2758.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 30 Jan 2008 20:46:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/31/2758.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2758.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/31/2758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2758.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2758.html</trackback:ping><description><![CDATA[<p>曾经我们相恋、拥抱，一起走过风风雨雨，如今我们成了最熟悉的陌生人。<br><br>爱情，是过眼云烟，爱情，天生就注定没有天长地久。我们都曾彼此犯下了太多的过错，有些过错已经无法泯灭，无法原谅，&#8220;不是每个对不起，都能换来一句没关系&#8221;。<br><br>这年的冬天，比往常来的更严寒更冰冷，而济南却没有下几场雪，相邻的省份都在下，而且下的十分大，无数同胞与天灾对抗着，看到那么多的事故，那么多的祖国同胞在寒冬不能取暖、用电，心里的不安不由转换成了同情，也许我的同情是错误的，曾经让我自豪的祖国，关键时刻，你还可以挺身而出吗？<br><br>在陌生的城市里，有着无数陌生的面容，浮躁与不安占据着我的内心，而更多的是独孤，也许，孤独是我一生的伴侣，是我最好的朋友，让我学会了安静与忍耐。我也时常仰望天空，&#8220;人，本身就该是一个人吗？&#8221;。<br><br>时间在流逝，一天又一天，我坐在同一个地方，完成着同样的事，透过五光十色的荧光屏，感受着外面精彩缤纷的世界，感受着它的千变万化、人文事事，我努力的挣脱现状，去开辟人生的新大陆，蓦然回首，却发现依然站在原地，迷失了自我，无声丢失了前进的方向。<br><br>有人说，&#8220;人活着是为了偏离起点，寻找各自的终点。&#8221;，而我宁愿看不到终点，那样可以让我走的更远，无论还有多少时间，无论多少挫折相伴，我都会一直高昂的走下去。<br><br>过年了，曾经关心过我、安慰过我，曾经带给我快乐和感动，一起欢笑一堂一起患难与共的亲人和朋友们，祝你们身体健康，丰衣足食，顺顺利利、安安稳稳、开开心心直到永远。<br><br>远方的你，还好吗？<br><br><br><br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-31 04:46 <a href="http://www.phpweblog.net/killjin/archive/2008/01/31/2758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux cp命令</title><link>http://www.phpweblog.net/killjin/archive/2008/01/26/2731.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 25 Jan 2008 18:08:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/26/2731.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2731.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/26/2731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2731.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2731.html</trackback:ping><description><![CDATA[<p>cp命令 <br>该命令的功能是将给出的文件或目录拷贝到另一文件或目录中，同MSDOS下的copy命令一样，功能十分强大。 </p>
<p>语法： cp [选项] 源文件或目录 目标文件或目录 </p>
<p>说明：该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。</p>
<p>该命令的各选项含义如下：</p>
<p>- a 该选项通常在拷贝目录时使用。它保留链接、文件属性，并递归地拷贝目录，其作用等于dpR选项的组合。</p>
<p>- d 拷贝时保留链接。</p>
<p>- f 删除已经存在的目标文件而不提示。</p>
<p>- i 和f选项相反，在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖，是交互式拷贝。 </p>
<p>- p 此时cp除复制源文件的内容外，还将把其修改时间和访问权限也复制到新文件中。 </p>
<p>- r 若给出的源文件是一目录文件，此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。</p>
<p>- l 不作拷贝，只是链接文件。 </p>
<p>　　需要说明的是，为防止用户在不经意的情况下用cp命令破坏另一个文件，如用户指定的目标文件名已存在，用cp命令拷贝文件后，这个文件就会被新源文件覆盖，因此，建议用户在使用cp命令拷贝文件时，最好使用i选项。</p>
<p>mv命令</p>
<p>用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MSDOS下的ren和move的组合。</p>
<p>语法：mv [选项] 源文件或目录 目标文件或目录 </p>
<p>说明：视mv命令中第二个参数类型的不同（是目标文件还是目标目录），mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时，mv命令完成文件重命名，此时，源文件只能有一个（也可以是源目录名），它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时，源文件或目录参数可以有多个，mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时，mv先拷贝，再将原有文件删除，而链至该文件的链接也将丢失。</p>
<p>命令中各选项的含义为：</p>
<p>- I 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖，此时系统询问是否重写，要求用户回答y或n，这样可以避免误覆盖文件。</p>
<p>- f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示，指定此选项后，i选项将不再起作用。</p>
<p>如果所给目标文件（不是目录）已存在，此时该文件的内容将被新文件覆盖。为防止用户用mv命令破坏另一个文件，使用mv命令移动文件时，最好使用i选项。 </p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-26 02:08 <a href="http://www.phpweblog.net/killjin/archive/2008/01/26/2731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面插入 FLASH</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2702.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 07:52:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2702.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2702.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2702.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2702.html</trackback:ping><description><![CDATA[&lt;embed src="http://www.xxx.com" width="766" height="194" type="application/x-shockwave-flash" quality="high" wmode="transparent" /&gt; <br><br>不知道规范不规范。
<img src ="http://www.phpweblog.net/killjin/aggbug/2702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 15:52 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用tracert查看网络状况</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 07:08:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2701.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2701.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2701.html</trackback:ping><description><![CDATA[<p>TRACERT是一种TCP/IP实用工具(源于&#8220;Trace Route&#8221;)，在DOS和UNIX系统下都有此命令。它将您的计算机与目标服务器间传输一个包的路径情况报告给您。其最简单的使用方法为&#8220;TRACERT地址&#8221;，地址为目标服务器的域名或IP地址。(与PING命令类似，在DOS提示符下键入&#8220;TRACERT&#8221;并按回车键，可查看此命令的选项开关和参数使用方法)。您可看到如下类似结果： </p>
<p>C:&gt;tracert 61.152.157.67</p>
<p>Tracing route to 61.152.157.67 over a maximum of 30 hops: </p>
<p>1 78 ms 61 ms 62 ms 202.103.9.2</p>
<p>2 64 ms 71 ms 64 ms 202.97.19.5</p>
<p>3 71 ms 65 ms 65 ms 206.125.197.65</p>
<p>4 69 ms 73 ms 68 ms 209.3.188.181</p>
<p>5 69 ms 69 ms 67 ms 204.245.69.74</p>
<p>6 73 ms 78 ms 70 ms 204.245.69.94</p>
<p>7 74 ms 76 ms 76 ms 209.3.153.74 </p>
<p>8 82 ms 81 ms 84 ms 199.45.39.45</p>
<p>Trace complete. </p>
<p>从以上结果可看出到达目标经过了8个节点并且包传输的很快(低于100ms)。第一列显示了节点数，第一列最后一行为到达最终目标所经过的节点总数(在我们的例子中到达最终节点，61.152.157.67，共经过了8个节点)。其后的三列为各节点的响应周期。如果在其中出现星号则表示超时(着就是说在限定包存活周期内目标没有响应)，不过在我们的例子中没有这种情况出现。在各列中如果都小于100ms则可认为是不错的状态。在后面的两列显示了路途中的路由器和IP地址。 </p>
<p><br>故障探测 </p>
<p>有时TRACERT的报告会显示出无法到达一个目标服务器的问题所在。例如，下面TRACERT的报告显示出一个循环错误。 </p>
<p>8 98 ms 89 ms 90 ms 204.245.69.98</p>
<p>9 91 ms 90 ms 92 ms 204.245.69.97</p>
<p>10 94 ms 96 ms 95 ms 204.245.69.98</p>
<p>11 98 ms 98 ms 103 ms 204.245.69.97</p>
<p>12 101 ms 101 ms 100 ms 204.245.69.98</p>
<p>13 106 ms 102 ms 104 ms 204.245.69.97</p>
<p>这个结果显示出两个路由器将包来回来去的相互发送。这使包无法到达目标服务器。这种循环显示会一直到到达TRACERT默认的最大节点数量限制(30个)才停止。 </p>
<p>您可很容易的通过PING或TRACERT程序得到测试结果。而且您可以把有问题的测试结果发给您的ISP。要保存结果可通过命令&#8220;PING地址&gt;文件名&#8221;或&#8220;TRACERT地址&gt;文件名&#8221;形成一个文本文件。 </p>
<p>当然，在很多情况下您对网络的缓慢或问题无能为力，不过这些工具至少能使您知道引起网络速度下降的原因，督促相关部门修复或调整。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 15:08 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈Apache的优化</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2698.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 06:11:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2698.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2698.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2698.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2698.html</trackback:ping><description><![CDATA[<p>今天说说Apache的优化。为什么要优化？因为服务器资源不够用。资源有很多方面，但根据木桶理论，只要有一种资源不够用，整个服务器的性能就会受到影响（所谓瓶颈）。</p>
<p><strong>服务器资源</strong></p>
<p>那么服务器的资源包括哪些？对于网站来说主要是<strong>CPU</strong>、<strong>TCP连接数</strong>这两者。 CPU表现在任务数上，在Linux下使用<strong>平均负载</strong>(loadavg)来衡量。可通过以下命令来查看--------------------------------------------</p>
<p>该文件显示了系统当前的平均负载和进程状况。</p>
<pre>0.20 0.18 0.12 1/80 11206</pre>
<p>前三列分别为前1分钟、5分钟、15分钟内的平均负载。第四列为正在执行的进程数和系统的总进程数。第五列为上次执行的进程id。<br>----------------------------------------</p>
<pre>cat /proc/loadavg</pre>
<p>对于单CPU的服务器，loadavg高于1，表明任务队列出现了等待，CPU忙不过来了。超过2以上就会明显感到性能降低了。</p>
<p>TCP连接数可通过以下命令查看：</p>
<pre>netstat -ant | grep :80 | wc -l </pre>
<p>如果要实时监控服务器资源，可参考<a href="http://www.opennms.org/" rel=nofollow>OpenNMS</a>项目。</p>
<p><span style="COLOR: blue">注1：内存不算，低廉的价格使得网站服务器很少有因为内存不够而down掉的。</span><br><span style="COLOR: blue">注2：CPU%是瞬时的CPU使用率，通常无法反映出整体负载。</span><br></p>
<!-- end Pukiwiki generated code--><span id=more-425></span><!-- begin Pukiwiki generated code-->
<p><strong>Apache配置命令</strong></p>
<p>Apache在资源方面的配置命令主要有以下几条。</p>
<div class=ie5>
<table class=style_table cellSpacing=1 border=0>
    <tbody>
        <tr>
            <td class=style_td>KeepAlive</td>
            <td class=style_td>是否允许持续连接</td>
        </tr>
        <tr>
            <td class=style_td>MaxKeepAliveRequests</td>
            <td class=style_td>允许的持续连接的最大数</td>
        </tr>
        <tr>
            <td class=style_td>KeepAliveTimeout</td>
            <td class=style_td>持续连接在没有请求多少秒后切断</td>
        </tr>
        <tr>
            <td class=style_td>StartServers</td>
            <td class=style_td>最初启动时启动多少个服务器进程</td>
        </tr>
        <tr>
            <td class=style_td>MinSpareServers</td>
            <td class=style_td>空闲服务器进程的最小数</td>
        </tr>
        <tr>
            <td class=style_td>MaxSpareServers</td>
            <td class=style_td>空闲服务器进程的最大数</td>
        </tr>
        <tr>
            <td class=style_td>MaxRequestsPerChild</td>
            <td class=style_td>每个子进程处理的最大请求数</td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>KeepAlive</strong></p>
<p>前三个KeepAlive相关的指令用来设置持续连接。通常都是每个HTTP请求对应一个TCP连接，但对于一个包含许多图片的网页来说，客户端会在瞬间发出多个HTTP请求，此时多次建立TCP连接会大大降低响应速度。此时通过持续连接，可以允许用户在一个TCP连接中发出多个HTTP请求，减少TCP连接建立次数，提高响应速度。</p>
<p>这种情况下，应当通过access_log统计出连续HTTP请求出现的次数、间隔时间、访问量，以确定 MaxKeepAliveRequests 和 KeepAliveTimeout 的值。 KeepAliveTimeout 太小发挥不了持续连接的作用；太大了，持续连接迟迟不断，浪费TCP连接数不说，更糟糕的是系统中的 httpd 进程数目会因此不断增加，使得系统负载升高，甚至会导致服务器失去响应。</p>
<p>但是在处理动态网页请求时，由于用户很少会瞬间请求多个动态网页（一般都是打开页面之后阅读好半天才点下一页），此时打开KeepAlive无异于浪费TCP连接数。</p>
<p>结论就是，放动态网页的就 KeepAlive Off 以提高吞吐量，放静态内容如图片、js代码等就 KeepAlive On 以减少TCP连接建立次数。</p>
<p>但一个Apache只能有一种 KeepAlive 设置，怎么办？很简单，弄两台服务器，一个专门放脚本，一个专门放图片。</p>
<p><strong>服务器进程数</strong></p>
<p>再说说下面的 StartServers、MinSpareServers、MaxSpareServers。 StartServers基本不用修改，因为Apache会自动调节子进程数。 MinSpareServers和MaxSpareServers是空闲子进程数目，何为空闲子进程？假设某一时刻系统中共有30个httpd进程，其中一个是父进程，20个在处理请求，那么空闲子进程数就是9个。</p>
<p>空闲进程少了，大量的突发请求会使服务器疲于进程创建，降低效率；而太多反而会增加系统进程数，增大系统负载。</p>
<p>实际上，默认值已足够处理一般的突发请求，所以除非是流量特别特别巨大的网站，否则不要修改这些设置。</p>
<p><span style="COLOR: blue">就算流量特别特别大，也是通过负载平衡系统来降低每台服务器的访问量，不会修改这几个值。</span></p>
<p><strong>MaxRequestsPerChild</strong></p>
<p>这个值设置子进程在处理多少个请求之后自动结束。这个选项是用来防止进程由于内存泄漏等使用内存过多。一般默认值即可。</p>
<p><strong>总结</strong></p>
<p>说来说去其实最重要的还是 KeepAlive 的设置，而性能调节也就是调整 KeepAlive、KeepAliveTimeout 值。</p>
<!-- end Pukiwiki generated code-->
<img src ="http://www.phpweblog.net/killjin/aggbug/2698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 14:11 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache连接数设置</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2697.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 06:07:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2697.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2697.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2697.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2697.html</trackback:ping><description><![CDATA[　prefork几乎还是目前的唯一MPM,我在下面主要还是讨论它的工作原理和相关指令调整。查看缺省生成的httpd.conf配置文件，会发现里面包含如下的配置段： <br><br>&lt;IfModule prefork.c&gt;<br>StartServers 5<br>MinSpareServers 5<br>MaxSpareServers 10<br>MaxClients 150<br>MaxRequestsPerChild 0<br>&lt;/IfModule&gt;<br><br>　　prefork的工作原理是这样的：控制进程在最初建立StartServers个子进程后, 为了满足MinSpareServers设置的需要，创建一个进程，等待一秒钟，继续创建第二个，等待一秒钟，继而创建四个，如此按指数级增加创建的进程数，最多达到每秒32个，直到满足MinSpareServers设置的值为止，这也就是预派生(prefork)的由来。这种模式可以使得不必在请求到来时再产生新的进程，从而减小了系统开销以增加性能。<br><br>　　MaxSpareServers 设置了最大的空闲进程数，如果空闲进程数大于这个值，Apache会自动kill某些多余进程。这个值一般不要设的过大，但如果设的比MinSpareServers小，Apache会自动把它调整为MinSpareServers+1。如果站点负载较大的话，可考虑同时加大MinSpareServers和MaxSpareServers。<br><br>　　MaxRequestsPerChild设置的是每个子进程可以处理的请求数。每个子进程在处理了MaxRequestsPerChild个请求后将自动销毁。0意味着无限，即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求，但如果设成非零值也有两点重要的好处：<br><br>1． 可防止意外的内存卸漏；<br>2． 在服务器负载下降的时侯会自动减少子进程数。<br><br>　　因此，可根据服务器的负载来调整这个值，如果非零的话，笔者认为10000左右是比较合适的。事实上这个值对Apache的性能影响不是很大。<br><br>　　MaxClients 是这些指令中最为重要的一个，它设定的就是Apache可以同时处理的请求，这是对Apache性能影响最大的参数.在我个人看来，缺省的150是远远不够的，如果请求总数已达到这个值(可通过ps &#8211;ef|grep httpd|wc &#8211;l来确认)，那么下面的请求就要排队，直到某个已处理请求完毕。这就是为什么系统资源还剩下很多，而http访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值,虽然理论上这个值越大，可以处理的请求就越多，但Apache默认的限制是不能大于256。如果把这个值设为大于256那么Apache将无法起动。事实上，256对于负载稍重的站点也是很不够的。在Apache1.3中这是个硬限制，如果要加大这个值，必须在configure前手工修改源代码树下的src/include/httpd.h,查找256，会发现#define HARD_SERVER_LIMIT 256这行，把256改为你要增大的值如4000，然后重新编译Apache即可。我想这个方法稍有些经验的Apache系统管理员都知道，不过我相信在Apache2.0中知道如何加大这个值的人就不会太多了。<br><br>　　在Apache2.0中新加入了ServerLimit指令，使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段。 <br><br>&lt;IfModule prefork.c&gt;<br>StartServers 10<br>MinSpareServers 10<br>MaxSpareServers 15<br>ServerLimit 2000<br>MaxClients 1500<br>MaxRequestsPerChild 10000<br>&lt;/IfModule&gt;<br><br>　　BTW: ServerLimit的最大值是20000，这对于大多数站点是足够了，但如果你一定要再加大的话，那么这个值位于源代码树下的server/mpm/prefork/prefork.c中。里面的<br><br>#define DEFAULT_SERVER_LIMIT 256<br>#define MAX_SERVER_LIMIT 20000<br><br>这两行就对应着MaxClients和ServerLimit的限制值。但我相信很少有人可以用到20000的并发连接数。<br>
<img src ="http://www.phpweblog.net/killjin/aggbug/2697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 14:07 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看Apache并发请求数及其TCP连接状态</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2696.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 06:06:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2696.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2696.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2696.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2696.html</trackback:ping><description><![CDATA[这两天搭建了一组Apache服务器，每台服务器4G内存，采用的是prefork模式，一开始设置的连接数太少了，需要较长的时间去响应用户的请求，后来修改了一下Apache 2.0.59的配置文件httpd.conf：<br>
<div class=quote>
<div class=quote-title>引用</div>
<div class=quote-content># prefork MPM<br># StartServers: number of server processes to start<br># MinSpareServers: minimum number of server processes which are kept spare<br># MaxSpareServers: maximum number of server processes which are kept spare<br># MaxClients: maximum number of server processes allowed to start<br># MaxRequestsPerChild: maximum number of requests a server process serves<br><ifmodule prefork.c><br>StartServers &nbsp; &nbsp; &nbsp; &nbsp; 10<br>MinSpareServers &nbsp; &nbsp; &nbsp;10<br>MaxSpareServers &nbsp; &nbsp; &nbsp;15<br>ServerLimit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2000<br>MaxClients &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2000<br>MaxRequestsPerChild &nbsp;10000<br></ifmodule></div>
</div>
<br>
<hr>
<br>　　查看httpd进程数（即prefork模式下Apache能够处理的并发请求数）：<br>　　Linux命令：<br>
<div class=quote>
<div class=quote-title>引用</div>
<div class=quote-content>ps -ef | grep httpd | wc -l</div>
</div>
<br>　　返回结果示例：<br>　　1388<br>　　表示Apache能够处理1388个并发请求，这个值Apache可根据负载情况自动调整，我这组服务器中每台的峰值曾达到过2002。<br>
<hr>
<br>　　查看Apache的并发请求数及其TCP连接状态：<br>　　Linux命令：<br>
<div class=quote>
<div class=quote-title>引用</div>
<div class=quote-content>netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'</div>
</div>
<br>　　（这条语句是从
<script language=JavaScript>word1 = "新";word2 = "浪";word3 = "互动社";word4 = "区事";word5 = "业部";document.write(word1 + word2 + word3 + word4 + word5);</script>
新浪互动社区事业部技术总监王老大那儿获得的，非常不错）<br>　　返回结果示例：<br>　　LAST_ACK 5<br>　　SYN_RECV 30<br>　　ESTABLISHED 1597<br>　　FIN_WAIT1 51<br>　　FIN_WAIT2 504<br>　　TIME_WAIT 1057<br>　　其中的SYN_RECV表示正在等待处理的请求数；ESTABLISHED表示正常数据传输状态；TIME_WAIT表示处理完毕，等待超时结束的请求数。<br>
<hr>
<br>　　关于TCP状态的变迁，可以从下图形象地看出：<br>　　<a href="http://blog.s135.com/read.php/attachment/200707/tcps.gif" target=_blank><img class=insertimage title=点击在新窗口中浏览此图片 alt=点击在新窗口中浏览此图片 src="http://www.phpweblog.net/images/phpweblog_net/killjin/tcps.gif" border=0></a>　　<br>　　状态：描述<br>　　CLOSED：无连接是活动的或正在进行<br>　　LISTEN：服务器在等待进入呼叫<br>　　SYN_RECV：一个连接请求已经到达，等待确认<br>　　SYN_SENT：应用已经开始，打开一个连接<br>　　ESTABLISHED：正常数据传输状态<br>　　FIN_WAIT1：应用说它已经完成<br>　　FIN_WAIT2：另一边已同意释放<br>　　ITMED_WAIT：等待所有分组死掉<br>　　CLOSING：两边同时尝试关闭<br>　　TIME_WAIT：另一边已初始化一个释放<br>　　LAST_ACK：等待所有分组死掉<br>
<img src ="http://www.phpweblog.net/killjin/aggbug/2696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 14:06 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp中主动模式(port)与被动模式(PASV)</title><link>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 06 Jan 2008 07:01:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2653.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2653.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2653.html</trackback:ping><description><![CDATA[<span class=content><strong>目录</strong> <br>
<ul>&nbsp;&nbsp;&nbsp;&nbsp; <br>
    <li>&nbsp;开场白 <br>
    <li>&nbsp;基础 <br>
    <li>&nbsp;主动FTP <br>
    <li>&nbsp;主动FTP的例子 <br>
    <li>&nbsp;被动FTP <br>
    <li>&nbsp;被动FTP的例子 <br>
    <li>&nbsp;总结 <br>
    <li>&nbsp;参考资料 <br>
    <li>&nbsp;附录&nbsp;1:&nbsp;配置常见FTP服务器 <br></li>
</ul>
<br><br><strong>开场白</strong> <br><br>处理防火墙和其他网络连接问题时最常见的一个难题是主动FTP与被动FTP的区别以及如何完美地支持它们。幸运地是，本文能够帮助你清除在防火墙环境中如何支持FTP这个问题上的一些混乱。 <br><br>本文也许不像题目声称的那样是一个权威解释，但我已经听到了很多好的反馈意见，也看到了本文在许多地方被引用，知道了很多人都认为它很有用。虽然我一直在找寻改进的方法，但如果你发现某个地方讲的不够清楚，需要更多的解释，请告诉我！最近的修改是增加了主动FTP和被动FTP会话中命令的例子。这些会话的例子应该对更好地理解问题有所帮助。例子中还提供了非常棒的图例来解释FTP会话过程的步骤。现在，正题开始了... <br><br><strong>基础</strong> <br><br>FTP是仅基于TCP的服务，不支持UDP。&nbsp;与众不同的是FTP使用2个端口，一个数据端口和一个命令端口（也可叫做控制端口）。通常来说这两个端口是21－命令端口和20－数据端口。但当我们发现根据（FTP工作）方式的不同数据端口并不总是20时，混乱产生了。 <br><br><strong>主动FTP</strong> <br><br>主动方式的FTP是这样的：客户端从一个任意的非特权端口N（N&gt;;1024）连接到FTP服务器的命令端口，也就是21端口。然后客户端开始监听端口N+1，并发送FTP命令&#8220;port&nbsp;N+1&#8221;到FTP服务器。接着服务器会从它自己的数据端口（20）连接到客户端指定的数据端口（N+1）。 <br><br>针对FTP服务器前面的防火墙来说，必须允许以下通讯才能支持主动方式FTP： <br>
<ol type=1><br>
    <li>任何端口到FTP服务器的21端口&nbsp;（客户端初始化的连接&nbsp;S&lt;-C） <br>
    <li>FTP服务器的21端口到大于1023的端口（服务器响应客户端的控制端口&nbsp;S-&gt;C） <br>
    <li>FTP服务器的20端口到大于1023的端口（服务器端初始化数据连接到客户端的数据端口&nbsp;S-&gt;C） <br>
    <li>大于1023端口到FTP服务器的20端口（客户端发送ACK响应到服务器的数据端口&nbsp;S&lt;-C） <br><br><br>画出来的话，连接过程大概是下图的样子： <br><img alt="" src="http://slacksite.com/images/ftp/activeftp.gif" onload="var image=new Image();image.src=this.src;if(image.width>0 &amp;&amp; image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}"> <br><br>在第1步中，客户端的命令端口与FTP服务器的命令端口建立连接，并发送命令&#8220;PORT&nbsp;1027&#8221;。然后在第2步中，FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中，FTP服务器发起一个从它自己的数据端口（20）到客户端先前指定的数据端口（1027）的连接，最后客户端在第4步中给服务器端返回一个"ACK"。 <br><br>主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接，它只是简单的告诉服务器自己监听的端口号，服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说，这是从外部系统建立到内部客户端的连接，这是通常会被阻塞的。 <br><br><strong>主动FTP的例子</strong> <br><br>下面是一个主动FTP会话的实际例子。当然服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从&nbsp;testbox1.slacksite.com&nbsp;(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com&nbsp;(192.168.150.90)，一个运行ProFTPd&nbsp;1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是&nbsp;debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。 <br><br>仔细考虑这个对话过程我们会发现一些有趣的事情。我们可以看到当&nbsp;PORT&nbsp;命令被提交时，它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。当我们用被动FTP时我们会看到相反的现象。我们再来关注PORT命令的格式。就象你在下面的例子看到的一样，它是一个由六个被逗号隔开的数字组成的序列。前四个表示IP地址，后两个组成了用于数据连接的端口号。用第五个数乘以256再加上第六个数就得到了实际的端口号。下面例子中端口号就是(&nbsp;(14*256)&nbsp;+&nbsp;178)&nbsp;=&nbsp;3762。我们可以用netstat来验证这个端口信息。 <br><br>testbox1:&nbsp;{/home/p-t/slacker/public_html}&nbsp;%&nbsp;<strong>ftp&nbsp;-d&nbsp;testbox2</strong> <br>Connected&nbsp;to&nbsp;testbox2.slacksite.com. <br>220&nbsp;testbox2.slacksite.com&nbsp;FTP&nbsp;server&nbsp;ready. <br>Name&nbsp;(testbox2:slacker):&nbsp;<strong>slacker</strong> <br><font color=#ff0000>---&gt;&nbsp;USER&nbsp;slacker</font> <br>331&nbsp;Password&nbsp;required&nbsp;for&nbsp;slacker. <br>Password:<strong>&nbsp;TmpPass</strong> <br><font color=#ff0000>---&gt;&nbsp;PASS&nbsp;XXXX</font> <br>230&nbsp;User&nbsp;slacker&nbsp;logged&nbsp;in. <br><font color=#ff0000>---&gt;&nbsp;SYST <br>215&nbsp;UNIX&nbsp;Type:&nbsp;L8</font> <br>Remote&nbsp;system&nbsp;type&nbsp;is&nbsp;UNIX. <br>Using&nbsp;binary&nbsp;mode&nbsp;to&nbsp;transfer&nbsp;files. <br>ftp&gt;<strong>&nbsp;ls</strong> <br><font color=#ff0000>ftp:&nbsp;setsockopt&nbsp;(ignored):&nbsp;Permission&nbsp;denied <br>---&gt;&nbsp;PORT&nbsp;192,168,150,80,14,178</font> <br>200&nbsp;PORT&nbsp;command&nbsp;successful. <br><font color=#ff0000>---&gt;&nbsp;LIST</font> <br>150&nbsp;Opening&nbsp;ASCII&nbsp;mode&nbsp;data&nbsp;connection&nbsp;for&nbsp;file&nbsp;list. <br>drwx------&nbsp;&nbsp;&nbsp;3&nbsp;slacker&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;104&nbsp;Jul&nbsp;27&nbsp;01:45&nbsp;public_html <br>226&nbsp;Transfer&nbsp;complete. <br>ftp&gt;&nbsp;<strong>quit</strong> <br><font color=#ff0000>---&gt;&nbsp;QUIT</font> <br>221&nbsp;Goodbye. <br><br><strong>被动FTP</strong> <br><br>为了解决服务器发起到客户的连接的问题，人们开发了一种不同的FTP连接方式。这就是所谓的被动方式，或者叫做PASV，当客户端通知服务器它处于被动模式时才启用。 <br><br>在被动方式FTP中，命令连接和数据连接都由客户端，这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时，客户端打开两个任意的非特权本地端口（N&nbsp;&gt;;&nbsp;1024和N+1）。第一个端口连接服务器的21端口，但与主动方式的FTP不同，客户端不会提交PORT命令并允许服务器来回连它的数据端口，而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口（P&nbsp;&gt;;&nbsp;1024），并发送PORT&nbsp;P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。 <br><br>对于服务器端的防火墙来说，必须允许下面的通讯才能支持被动方式的FTP: <br>
    <ol type=1><br>
        <li>从任何端口到服务器的21端口&nbsp;（客户端初始化的连接&nbsp;S&lt;-C） <br>
        <li>服务器的21端口到任何大于1023的端口&nbsp;（服务器响应到客户端的控制端口的连接&nbsp;S-&gt;C） <br>
        <li>从任何端口到服务器的大于1023端口&nbsp;（入；客户端初始化数据连接到服务器指定的任意端口&nbsp;S&lt;-C） <br>
        <li>服务器的大于1023端口到远程的大于1023的端口（出；服务器发送ACK响应和数据到客户端的数据端口&nbsp;S-&gt;C） <br><br>画出来的话，被动方式的FTP连接过程大概是下图的样子： <br><img alt="" src="http://slacksite.com/images/ftp/passiveftp.gif" onload="var image=new Image();image.src=this.src;if(image.width>0 &amp;&amp; image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}"> <br><br>在第1步中，客户端的命令端口与服务器的命令端口建立连接，并发送命令&#8220;PASV&#8221;。然后在第2步中，服务器返回命令"PORT&nbsp;2024"，告诉客户端（服务器）用哪个端口侦听数据连接。在第3步中，客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4&nbsp;步中给客户端的数据端口返回一个"ACK"响应。 <br><br>被动方式的FTP解决了客户端的许多问题，但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是，许多FTP守护程序，包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。&nbsp; <br><br>第二个问题是客户端有的支持被动模式，有的不支持被动模式，必须考虑如何能支持这些客户端，以及为他们提供解决办法。例如，Solaris提供的FTP命令行工具就不支持被动模式，需要第三方的FTP客户端，比如ncftp。 <br><br>随着WWW的广泛流行，许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。 <br><br><strong>被动FTP的例子</strong> <br><br>下面是一个被动FTP会话的实际例子，只是服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从&nbsp;testbox1.slacksite.com&nbsp;(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com&nbsp;(192.168.150.90)，一个运行ProFTPd&nbsp;1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是&nbsp;debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。 <br><br>注意此例中的PORT命令与主动FTP例子的不同。这里，我们看到是服务器(192.168.150.90)而不是客户端的一个端口被打开了。可以跟上面的主动FTP例子中的PORT命令格式对比一下。 <br><br>testbox1:&nbsp;{/home/p-t/slacker/public_html}&nbsp;%&nbsp;ftp&nbsp;-d&nbsp;testbox2 <br>Connected&nbsp;to&nbsp;testbox2.slacksite.com. <br>220&nbsp;testbox2.slacksite.com&nbsp;FTP&nbsp;server&nbsp;ready. <br>Name&nbsp;(testbox2:slacker):&nbsp;<strong>slacker</strong> <br><font color=#ff0000>---&gt;&nbsp;USER&nbsp;slacker</font> <br>331&nbsp;Password&nbsp;required&nbsp;for&nbsp;slacker. <br>Password:&nbsp;<strong>TmpPass</strong> <br><font color=#ff0000>---&gt;&nbsp;PASS&nbsp;XXXX</font> <br>230&nbsp;User&nbsp;slacker&nbsp;logged&nbsp;in. <br><font color=#ff0000>---&gt;&nbsp;SYST <br>215&nbsp;UNIX&nbsp;Type:&nbsp;L8</font> <br>Remote&nbsp;system&nbsp;type&nbsp;is&nbsp;UNIX. <br>Using&nbsp;binary&nbsp;mode&nbsp;to&nbsp;transfer&nbsp;files. <br>ftp&gt;&nbsp;<strong>passive</strong> <br>Passive&nbsp;mode&nbsp;on. <br>ftp&gt;&nbsp;<strong>ls</strong> <br><font color=#ff0000>ftp:&nbsp;setsockopt&nbsp;(ignored):&nbsp;Permission&nbsp;denied</font> <br><font color=#ff0000>---&gt;&nbsp;PASV</font> <br>227&nbsp;Entering&nbsp;Passive&nbsp;Mode&nbsp;(192,168,150,90,195,149). <br><font color=#ff0000>---&gt;&nbsp;LIST</font> <br>150&nbsp;Opening&nbsp;ASCII&nbsp;mode&nbsp;data&nbsp;connection&nbsp;for&nbsp;file&nbsp;list <br>drwx------&nbsp;&nbsp;&nbsp;3&nbsp;slacker&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;104&nbsp;Jul&nbsp;27&nbsp;01:45&nbsp;public_html <br>226&nbsp;Transfer&nbsp;complete. <br>ftp&gt;;&nbsp;<strong>quit</strong> <br><font color=#ff0000>---&gt;&nbsp;QUIT</font> <br>221&nbsp;Goodbye. <br><br><strong>总结</strong> <br><br>下面的图表会帮助管理员们记住每种FTP方式是怎样工作的： <br><br>主动FTP： <br>&nbsp;&nbsp;&nbsp;命令连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;21端口 <br>&nbsp;&nbsp;&nbsp;数据连接：客户端&nbsp;&gt;1023端口&nbsp;&lt;-&nbsp;服务器&nbsp;20端口&nbsp; <br><br>被动FTP： <br>&nbsp;&nbsp;&nbsp;命令连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;21端口 <br>&nbsp;&nbsp;&nbsp;数据连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;&gt;1023端口&nbsp; <br><br>下面是主动与被动FTP优缺点的简要总结：&nbsp; <br><br>主动FTP对FTP服务器的管理有利，但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接，而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利，但对服务器端的管理不利。因为客户端要与服务器端建立两个连接，其中一个连到一个高位随机端口，而这个端口很有可能被服务器端的防火墙阻塞掉。 <br><br>幸运的是，有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接，那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样，不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险，但它大大减少了危险。详细信息参看附录1。 <br><br><br><strong>参考资料&nbsp;</strong> <br><br>O'Reilly出版的《组建Internet防火墙》（第二版，Brent&nbsp;Chapman，Elizabeth&nbsp;Zwicky著）是一本很不错的参考资料。里面讲述了各种Internet协议如何工作，以及有关防火墙的例子。&nbsp; <br><br>最权威的FTP参考资料是RFC&nbsp;959，它是FTP协议的官方规范。RFC的资料可以从许多网站上下载，例如：<a href="ftp://nic.merit.edu/documents/rfc/rfc0959.txt&nbsp;" target=_blank><font color=#000000 size=2>ftp://nic.merit.edu/documents/rfc/rfc0959.txt&nbsp;</font></a>。 </li>
    </ol>
    </li>
</ol>
</span>
<img src ="http://www.phpweblog.net/killjin/aggbug/2653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-06 15:01 <a href="http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP cookie和session的分析 </title><link>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sat, 05 Jan 2008 20:26:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2652.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2652.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2652.html</trackback:ping><description><![CDATA[<p><br><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Arial">1. </span></strong><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">PHP</span></strong><strong style="TEXT-DECORATION: underline"><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">的</span></strong><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">COOKIE</span></strong><br></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie </span><span style=" FONT-FAMILY: 宋体">是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br>PHP</span><span style=" FONT-FAMILY: 宋体">在</span><span lang=EN-US style=" FONT-FAMILY: Verdana">http</span><span style=" FONT-FAMILY: 宋体">协议的头信息里发送</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie,</span><span lang=EN-US> </span><span style=" FONT-FAMILY: 宋体">因此</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setcookie() </span><span style=" FONT-FAMILY: 宋体">函数必须在其它信息被输出到浏览器前调用，这和对</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> header() </span><span style=" FONT-FAMILY: 宋体">函数的限制类似。</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><br><span style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline">1.1 </span></span><strong style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">设置</span></strong><strong style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span><span lang=EN-US style=" FONT-FAMILY: Verdana">:</span></strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><span>&nbsp;&nbsp;&nbsp; </span></span><span style=" FONT-FAMILY: 宋体">可以用</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setcookie() </span><span style=" FONT-FAMILY: 宋体">或</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setrawcookie() </span><span style=" FONT-FAMILY: 宋体">函数来设置</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> cookie</span><span style=" FONT-FAMILY: 宋体">。也可以通过向客户端直接发送</span><span lang=EN-US style=" FONT-FAMILY: Verdana">http</span><span style=" FONT-FAMILY: 宋体">头来设置</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<br><st1:chsdate style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline" year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><strong>1.1.1</strong></st1:chsdate><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"> </strong></span><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">使用</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">setcookie()</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">函数</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">设置cookie:</span></strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><span style="COLOR: rgb(255,1,2)">bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span></span><span style="COLOR: rgb(0,1,2)">name:&nbsp;&nbsp; cookie</span></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量名</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>value: &nbsp; cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量的值</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>expire:&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效期结束的时间</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>path:&nbsp;&nbsp;&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效目录</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>domain: </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效域名</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">顶级域唯一</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>secure:&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">如果值为</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">1,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">则</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">只能在</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">https</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">连接上有效</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">如果为默认值</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">0,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">则</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">http</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">和</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">https</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">都可以</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">例子</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">:</span><br><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,255)">'something from somewhere'</span><span style="COLOR: rgb(0,0,204)">;</span><br><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">/* 简单cookie设置 */</span><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">+</span>3600<span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">/* 有效期1个小时 */</span><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">+</span>3600<span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,255)">"/~rasmus/"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,255)">".example.com"</span><span style="COLOR: rgb(0,0,204)">,</span> 1