﻿<?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>Sun, 05 Jul 2009 09:32:20 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 09:32:20 GMT</pubDate><ttl>60</ttl><item><title>人生短暂，自由可贵，单身倍好，光棍万岁！</title><link>http://www.phpweblog.net/killjin/archive/2009/02/11/6323.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 11 Feb 2009 14:43:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2009/02/11/6323.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6323.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2009/02/11/6323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6323.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6323.html</trackback:ping><description><![CDATA[一人消费，没有拖累，独立自主，拍板干脆 <br>不扫房屋，不叠床被，不听罗嗦，不会下跪， <br>不看脸色，不用惧内，没有吵闹，没有眼泪， <br>所有收入，自己支配，花钱潇洒，当家绝对， <br>朋友相聚，乱侃胡吹，参加饭局，满足肠胃， <br>能吃能饿，能喝能醉，能爱能恨，能熬能睡， <br>昼夜上网，聊天泡妹，打情骂俏，胆大妄为， <br>连连出招，频频约会，搂抱亲吻，无所忌讳， <br>奔波劳累，身心疲惫，我行我素，无怨无悔， <br>人生短暂，自由可贵，单身倍好，光棍万岁！
<img src ="http://www.phpweblog.net/killjin/aggbug/6323.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> 2009-02-11 22:43 <a href="http://www.phpweblog.net/killjin/archive/2009/02/11/6323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>YUM更新出错后的处理 AttributeError: CHECKSUM_VALUE</title><link>http://www.phpweblog.net/killjin/archive/2009/02/10/6320.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 09 Feb 2009 16:20:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2009/02/10/6320.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6320.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2009/02/10/6320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6320.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6320.html</trackback:ping><description><![CDATA[<div>今日使用 yum -y update 更新 剛安裝好的 Linux CentOS 5.1 系統時，但更新到一半忽然停電..</div>
<div>等來電時，再度使用 yum -y update 進行更新時，卻無法更新了，一直出現以下的錯誤：</div>
<div><br></div>
<div>#yum -y update</div>
<div>Loading "installonlyn" plugin</div>
<div>Setting up Update Process</div>
<div>Setting up repositories</div>
<div>Reading repository metadata in from local files</div>
<div>Traceback (most recent call last):</div>
<div>&nbsp;File "/usr/bin/yum", line 29, in ?</div>
<div>&nbsp;&nbsp; yummain.main(sys.argv[1:])</div>
<div>&nbsp;File "/usr/share/yum-cli/yummain.py", line 94, in main</div>
<div>&nbsp;&nbsp; result, resultmsgs = base.doCommands()</div>
<div>&nbsp;File "/usr/share/yum-cli/cli.py", line 381, in doCommands</div>
<div>&nbsp;&nbsp; return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)</div>
<div>&nbsp;File "/usr/share/yum-cli/yumcommands.py", line 150, in doCommand</div>
<div>&nbsp;&nbsp; return base.updatePkgs(extcmds)</div>
<div>&nbsp;File "/usr/share/yum-cli/cli.py", line 673, in updatePkgs</div>
<div>&nbsp;&nbsp; self.doRepoSetup()</div>
<div>&nbsp;File "/usr/share/yum-cli/cli.py", line 109, in doRepoSetup</div>
<div>&nbsp;&nbsp; self.doSackSetup(thisrepo=thisrepo)</div>
<div>&nbsp;File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 341, in doSackSetup</div>
<div>&nbsp;&nbsp; self.pkgSack.excludeArchs(archlist)</div>
<div>&nbsp;File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 331, in excludeArchs</div>
<div>&nbsp;&nbsp; sack.excludeArchs(archlist)</div>
<div>&nbsp;File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 589, in excludeArchs</div>
<div>&nbsp;&nbsp; obj = self.pc(rep,self.db2class(x))</div>
<div>&nbsp;File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 431, in db2class</div>
<div>&nbsp;&nbsp; y.checksum = {'pkgid': 'YES','type': db.checksum_type,&nbsp;</div>
<div>&nbsp;File "/usr/lib/python2.4/site-packages/sqlite/main.py", line 97, in __getattr__</div>
<div>&nbsp;&nbsp; raise AttributeError, key</div>
<div>AttributeError: CHECKSUM_VALUE</div>
<div><br></div>
<div>心想，真是糟糕了，這一下該如何是好...使用 yum clean all 也無法解決，經過百般的抽絲剝繭後終於搞定了</div>
<div>以下為解決的方式：</div>
<div>#rpm -qa | grep yum-metadata-parser</div>
<div><br></div>
<div>得到以下結果</div>
<div>yum-metadata-parser-1.1.2-2.el5</div>
<div>yum-metadata-parser-1.0-8.fc6</div>
<div><br></div>
<div>怪了怎麼會有兩個，肯定是斷電後所造成的安裝不完整，而該套件是造成上訴的問題，所以將這兩個套件給先移除</div>
<div>#rpm -ev --nodeps yum-metadata-parser-1.1.2-2.el5</div>
<div>#rpm -ev --nodeps yum-metadata-parser-1.0-8.fc6</div>
<div><br></div>
<div>移除後再將 yum-metadata-parser-1.1.2-2.el5 安裝回去 方法有二：</div>
<div>方法一:</div>
<div>#yum insatll yum-metadata-parser</div>
<div>(此時已經正常可以透過 yum 去安裝了，如果不行，請用方法二)</div>
<div><br></div>
<div>方法二:</div>
<div>#wget http://ftp.cse.yzu.edu.tw/pub/CentOS/5.2/os/i386/CentOS/yum-metadata-parser-1.1.2-2.el5.i386.rpm</div>
<div>#rpm -iv yum-metadata-parser-1.1.2-2.el5.i386.rpm</div>
<div><br></div>
<div>安裝好 yum-metadata-parser 後，再使用 yum -y update 去更新，已經可以正常了，不會再出現上述的問題了..<br><br><a href="http://www.cnblogs.com/pipelone/archive/2008/12/01/1344678.html">http://www.cnblogs.com/pipelone/archive/2008/12/01/1344678.html</a></div>
<img src ="http://www.phpweblog.net/killjin/aggbug/6320.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> 2009-02-10 00:20 <a href="http://www.phpweblog.net/killjin/archive/2009/02/10/6320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux磁盘读写故障的通常处理流程</title><link>http://www.phpweblog.net/killjin/archive/2009/01/21/6296.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 21 Jan 2009 03:21:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2009/01/21/6296.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6296.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2009/01/21/6296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6296.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6296.html</trackback:ping><description><![CDATA[<strong>问题</strong>
<p taggedby="hylanda">　　使用Linux作为服务器操作系统的时候</p>
<p taggedby="hylanda">　　维护少不需要重新启动的优势非常明显</p>
<p taggedby="hylanda">　　但有时候会遇到莫明其妙的故障</p>
<p taggedby="hylanda">　　例如数据无法写入，执行某程序报错</p>
<p taggedby="hylanda">　　这个时候建议检查一下，是否是磁盘子系统的故障</p>
<p taggedby="hylanda">　　例如SCSI/IDE/SATA硬盘出现了坏扇区，例如SCSI卡热插拔插座接触不良等。</p>
<p taggedby="hylanda">　　<strong taggedby="hylanda">解决方案</strong></p>
<p taggedby="hylanda">　　1) 首先定位故障所在。</p>
<p taggedby="hylanda">　　查看/var/log/message查看里边是否有磁盘的报错</p>
<p taggedby="hylanda">　　例如如下的信息，就是磁盘错误：</p>
<p taggedby="hylanda">　　Oct 23 10:22:58 vm3 kernel: EXT3-fs error (device ide0(3,5)): ext3_readdir: directory #719520 contains a hole at offset 898727936</p>
<p taggedby="hylanda">　　Oct 23 10:22:58 vm3 kernel: attempt to access beyond end of device</p>
<p taggedby="hylanda">　　Oct 23 10:22:58 vm3 kernel: 03:05: rw=0, want=969723216, limit=6144831</p>
<p taggedby="hylanda">　　还可以执行dmesg，查看物理设备是否有报告SCSI IO error等错误信息</p>
<p taggedby="hylanda">　　如果发现类似信息，则可以确定为磁盘子系统的故障。</p>
<p taggedby="hylanda">　　还有时候也会遇到磁盘某些分区成为了只读分区，任何数据都无法写入</p>
<p taggedby="hylanda">　　这是linux系统在挂载磁盘分区时候发生了错误，随即启动了&#8220;安全模式&#8221;</p>
<p taggedby="hylanda">　　将分区挂载为readonly，即只读状态，以免更严重的损坏发生。</p>
<p taggedby="hylanda">　　2) 确认为磁盘故障后，千万不要重新启动服务器。</p>
<p taggedby="hylanda">　　这种情况下重新启动服务器是比较危险的，可能重启时候读取数据错误造成引导失败</p>
<p taggedby="hylanda">　　系统就在也启动不了了。</p>
<p taggedby="hylanda">　　首先通过mount命令和df命令，查看当前的分区情况。</p>
<p taggedby="hylanda">　　确认有用的数据都放在哪些分区上，这些分区是否独立，是在第几块硬盘等，</p>
<p taggedby="hylanda">　　为一会的具体修复甚至更换硬件做准备。</p>
<p taggedby="hylanda">　　此时应尽快对关键数据做备份，如果挂载有两块磁盘，则可以直接向无故障的磁盘备份。</p>
<p taggedby="hylanda">　　如果只有一块磁盘，可以向其他正常的分区备份（但是也有风险）</p>
<p taggedby="hylanda">　　在只有一块磁盘的情况下，比较可靠的方式是通过scp直接复制远程的文件</p>
<p taggedby="hylanda">　　这样不会在本地写入大量的备份数据，避免加速硬盘的崩溃。</p>
<p taggedby="hylanda">　　但缺点是速度较慢。</p>
<p taggedby="hylanda">　　还有开设共享通过samba映射等各种方式都可以备份数据</p>
<p taggedby="hylanda">　　3) 备份数据完成后，重新启动系统。使用安装光盘进行引导</p>
<p taggedby="hylanda">　　并在启动的时候输入rescue，进入单用户救援模式</p>
<p taggedby="hylanda">　　使用fsck命令，加上-y参数，修复故障的分区。</p>
<p taggedby="hylanda">　　如果故障无法修复，则只能更换硬盘，重新装系统，再导回数据了。</p>
<p taggedby="hylanda">　　以上为linux服务器遇到一般的数据错误的通常解决方法</p>
<p taggedby="hylanda">　　建议具体情况具体分析，查看完全后，在进行操作</p>
<p taggedby="hylanda">　　以免造成数据丢失等严重损失。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/6296.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> 2009-01-21 11:21 <a href="http://www.phpweblog.net/killjin/archive/2009/01/21/6296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webserver 维护常用命令</title><link>http://www.phpweblog.net/killjin/archive/2008/12/19/6192.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 19 Dec 2008 01:47:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/12/19/6192.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6192.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/12/19/6192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6192.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6192.html</trackback:ping><description><![CDATA[<p><strong>实时查看正在执行的sql语句</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #000000">/</span>usr<span style="FONT-WEIGHT: bold; COLOR: #000000">/</span>sbin<span style="FONT-WEIGHT: bold; COLOR: #000000">/</span>tcpdump <span style="COLOR: #660033">-i</span> eth0 <span style="COLOR: #660033">-s</span> 0 <span style="COLOR: #660033">-l</span> <span style="COLOR: #660033">-w</span> - dst port <span style="COLOR: #000000">3306</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">strings</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">egrep</span> <span style="COLOR: #660033">-i</span> <span style="COLOR: #ff0000">'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>查看http连接</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-n</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> <span style="COLOR: #ff0000">'/^tcp/ {++state[$NF]} END {for(key in state) print key,"<span style="FONT-WEIGHT: bold; COLOR: #000099">\t</span>",state[key]}'</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>查看SYN状态的http连接</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-an</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> SYN | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> <span style="COLOR: #ff0000">'{print $5}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> -F: <span style="COLOR: #ff0000">'{print $1}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">uniq</span> <span style="COLOR: #660033">-c</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> <span style="COLOR: #660033">-nr</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">more</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>查看TIME_WAIT状态的http连接</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1<br>2
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-tna</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">cut</span> <span style="COLOR: #660033">-b</span> <span style="COLOR: #000000">49</span>- |<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> TIME_WAIT | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> |<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">more</span>
            <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-an</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> TIME_WAIT | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> <span style="COLOR: #ff0000">'{print $5}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> -F: <span style="COLOR: #ff0000">'{print $1}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">uniq</span> <span style="COLOR: #660033">-c</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> <span style="COLOR: #660033">-nr</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">more</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>查看ESTABLISHED状态的http连接</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1<br>2
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-an</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> ESTABLISHED | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> <span style="COLOR: #ff0000">'{print $5}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> -F: <span style="COLOR: #ff0000">'{print $1}'</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">uniq</span> <span style="COLOR: #660033">-c</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> <span style="COLOR: #660033">-nr</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">more<br></span><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-an</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> <span style="COLOR: #ff0000">":80"</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> ESTABLISHED | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">more</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>批量kill进程</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">ps</span> -efww|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> sqlr-listener|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> <span style="COLOR: #660033">-v</span> <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span>|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">cut</span> <span style="COLOR: #660033">-c</span> <span style="COLOR: #000000">9</span>-<span style="COLOR: #000000">15</span>|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">xargs</span> <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">kill</span> <span style="COLOR: #660033">-9</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>查看活动的php-cgi连接数</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> -anpo|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> php-cgi|<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">wc</span> <span style="COLOR: #660033">-l</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>按ip查看httpd连接数</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">netstat</span> <span style="COLOR: #660033">-anlp</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> <span style="COLOR: #000000">80</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">grep</span> tcp | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> <span style="FONT-WEIGHT: bold; COLOR: #7a0874">{</span><span style="COLOR: #ff0000">'print $5'</span><span style="FONT-WEIGHT: bold; COLOR: #7a0874">}</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">awk</span> -F: <span style="FONT-WEIGHT: bold; COLOR: #7a0874">{</span><span style="COLOR: #ff0000">'print $1'</span><span style="FONT-WEIGHT: bold; COLOR: #7a0874">}</span>| <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> |<span style="FONT-WEIGHT: bold; COLOR: #c20cb9">uniq</span> <span style="COLOR: #660033">-c</span> | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sort</span> <span style="COLOR: #660033">-nr</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>禁IP</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            2
            3
            4
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace">iptables <span style="COLOR: #660033">-A</span> INPUT <span style="COLOR: #660033">-s</span> IP地址 <span style="COLOR: #660033">-j</span> REJECT<br>iptables <span style="COLOR: #660033">-A</span> INPUT <span style="COLOR: #660033">-s</span> IP地址<span style="FONT-WEIGHT: bold; COLOR: #000000">/</span><span style="COLOR: #000000">24</span> <span style="COLOR: #660033">-j</span> REJECT</pre>
            <p>route add <span style="COLOR: #660033">-net</span> IP地址 netmask 255.255.255.0 reject</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>调试命令</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">strace</span> <span style="COLOR: #660033">-p</span> pid</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>跟踪指定的进程pid.</p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">gdb</span> <span style="COLOR: #660033">-p</span> pid</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>跟踪指定的进程pid. </p>
<p><strong>批量查找文件并删除</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1<br>2
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">find</span> . <span style="COLOR: #660033">-name</span> test.php <span style="COLOR: #660033">-exec</span> <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">rm</span> <span style="FONT-WEIGHT: bold; COLOR: #7a0874">{</span><span style="FONT-WEIGHT: bold; COLOR: #7a0874">}</span> \;<br><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">find</span> . <span style="COLOR: #660033">-name</span> test.php | <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">xargs</span> <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">rm</span> <span style="COLOR: #660033">-rf</span></pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>更改某一目录下所有目录的权限, 不包括文件, aaa 是目录名</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">find</span> aaa <span style="COLOR: #660033">-type</span> d <span style="COLOR: #660033">-exec</span> <span style="FONT-WEIGHT: bold; COLOR: #c20cb9">chmod</span> <span style="COLOR: #000000">755</span> <span style="FONT-WEIGHT: bold; COLOR: #7a0874">{</span><span style="FONT-WEIGHT: bold; COLOR: #7a0874">}</span> \;</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>替换文件内容</strong></p>
<div class=wp_syntax>
<table>
    <tbody>
        <tr>
            <td class=line_numbers>
            <pre>1
            </pre>
            </td>
            <td class=code>
            <pre class="bash bash" style="FONT-FAMILY: monospace"><span style="FONT-WEIGHT: bold; COLOR: #c20cb9">sed</span> <span style="COLOR: #660033">-i</span> <span style="COLOR: #ff0000">'s/b/strong/g'</span> index.html</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>此命令搜索 index.html 文件中的 b 并将其替换为 strong。<br><br><a href="http://www.lostk.com/blog/linux_webserver_cmd/">http://www.lostk.com/blog/linux_webserver_cmd/</a></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/6192.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-12-19 09:47 <a href="http://www.phpweblog.net/killjin/archive/2008/12/19/6192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更改MySQL数据库目录位置</title><link>http://www.phpweblog.net/killjin/archive/2008/11/16/6085.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 16 Nov 2008 14:00:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/16/6085.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6085.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/16/6085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6085.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6085.html</trackback:ping><description><![CDATA[<p>MySQL默认的数据文档存储目录为/var/lib/mysql。prog.Phontol.com假如要把MySQL目录移到/home/data下需要进行下面几步：</p>
<p>1、home目录下建立data目录</p>
<p>cd /home</p>
<p>mkdir data</p>
<p>2、把MySQL服务进程停掉：</p>
<p>mysqladmin -u root -p shutdown</p>
<p>3、把/var/lib/mysql整个目录移到/home/data</p>
<p>mv /var/lib/mysql　/home/data/</p>
<p>这样就把MySQL的数据文档移动到了/home/data/mysql下</p>
<p>4、找到my.cnf配置文档</p>
<p>假如/etc/目录下没有my.cnf配置文档，请到/usr/share/mysql/下找到*.cnf文档，拷贝其中一个到/etc/并改名为my.cnf)中。prog.Phontol.com命令如下：</p>
<p>[root@test1 mysql]# cp /usr/share/mysql/my-medium.cnf　/etc/my.cnf</p>
<p>5、编辑MySQL的配置文档/etc/my.cnf</p>
<p>为确保MySQL能够正常工作，需要指明mysql.sock文档的产生位置。prog.Phontol.com修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为：/home/mysql/mysql.sock 。prog.Phontol.com操作如下：</p>
<p>vi　 my.cnf　　　 (用vi工具编辑my.cnf文档，找到下列数据修改之)</p>
<p># The MySQL server</p>
<p>[mysqld]</p>
<p>port　　　= 3306</p>
<p>#socket　 = /var/lib/mysql/mysql.sock(原内容，为了更稳妥用&#8220;#&#8221;注释此行)</p>
<p>socket　 = /home/data/mysql/mysql.sock　　　(加上此行)</p>
<p>6、修改MySQL启动脚本/etc/init.d/mysql</p>
<p>最后，需要修改MySQL启动脚本/etc/init.d/mysql，把其中datadir=/var/lib/mysql一行中，等号右边的路径改成您现在的实际存放路径：home/data/mysql。prog.Phontol.com</p>
<p>[root@test1 etc]# vi　/etc/init.d/mysql</p>
<p>#datadir=/var/lib/mysql　　　　(注释此行)</p>
<p>datadir=/home/data/mysql　　 (加上此行)</p>
<p>7、重新启动MySQL服务</p>
<p>/etc/init.d/mysql　start</p>
<p>或用reboot命令重启Linux</p>
<p>假如工作正常移动就成功了，否则对照前面的7步再检查一下。prog.Phontol.com</p>
<p>还要注意目录的属主和权限。<br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/6085.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-11-16 22:00 <a href="http://www.phpweblog.net/killjin/archive/2008/11/16/6085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复被破坏了的linux文件系统分区表</title><link>http://www.phpweblog.net/killjin/archive/2008/11/13/6068.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 13 Nov 2008 08:14:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/13/6068.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6068.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/13/6068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6068.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6068.html</trackback:ping><description><![CDATA[<div _element_extended_="true">昨天晚上在信息港的机房里鼓捣到凌晨4点多，帮助朋友修复损坏的硬盘数据。由于当时没有详细的记录，凭回忆先记录下整个过程，也许有错误的地方，请不吝指正！<br><br>现象和环境：REDHAT FC4，一块36G的SCSI硬盘（/dev/sdc）无法mount，fdisk也看不到分区信息。另外一块该盘重要数据的备份盘（9G SCSI硬盘，/dev/sdb）也是同样的现象。均为独立磁盘，没有RAID设置。（怎么这么巧？数据盘和备份盘同时坏掉了）<br><br>整个尝试修复的过程大致如下：<br><br></div>
<h2 _element_extended_="true">尝试查看分区信息</h2>
<div _element_extended_="true">尽管事先被告知fdisk看不到分区信息，还是固执的尝试了一下:-)<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">fdiks&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true">果然什么样都看不到。但是，系统启动的时候正确的列出了磁盘的相关信息（大小等），而且fdisk也能够列出磁盘大小等相关物理信息，只是没有分区信息。因此初步判断，是磁盘的分区表丢失，不一定是磁盘物理损坏。<br></div>
<h2 _element_extended_="true">尝试使用parted查看和恢复分区信息</h2>
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">parted&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc</span></div>
</div>
<div _element_extended_="true"><br>print自然也列不出分区信息，好在管理员还有一块分区完全一致的硬盘（是早先通过dd完全复制的），于是挂上这块clone盘，获得了sdc的分区信息，记录下来（注：这里可以有更好的处理方法，见下面的gpart部分），尝试使用parted恢复分区信息：<br><br></div>
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">rescue<br>start</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">end</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;4G</span></div>
</div>
<div _element_extended_="true"><br>上面是parted尝试根据给出起始尺寸和结束尺寸，在这个范围内寻找分区标志符，以决定是否重新写入分区表。可是奇怪的是，总共6个分区，parted只能按照这个办法找回一个分区，其他的都宣告一个提示，大致的意思是&#8220;分区结束符位于开始符之前&#8221;。<br><br>也尝试使用parted的mkpart重新创建分区表，但是失败，提示不能创建更多的主分区（难道分区信息没有丢失吗？为什么不允许创建分区信息呢？）<br><br></div>
<h2 _element_extended_="true">使用gpart尝试找回分区信息</h2>
<div _element_extended_="true">parted没有成功的找回分区信息，于是转而尝试gpart：<br><br></div>
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">gpart&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc</span></div>
</div>
<div _element_extended_="true"><br>可喜的是，gpart经过一段时间的搜寻，列出了看起来有道理的分区信息！但是，按照管理员提供的clone盘，应该是找到6个分区（包括swap）才对，但是gpart只找到了4个。经过分析发现， gpart原来只是找到了主分区分析，扩展分区和逻辑分区没有找到。<br><br>尝试通过<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">gpart&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">W&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true">将分区信息重新写入到损坏盘中。虽然fdisk, parted可以列出分区信息，但是还是无法mount。于是怀疑文件系统也遭到了损坏。<br><br></div>
<h2 _element_extended_="true">使用reiserfsck/e2fsck修复文件系统</h2>
<div _element_extended_="true">管理员告知，/dev/sdc的文件系统应该是reiserfs，于是尝试使用reiserfsck检查和修复文件系统（事后证明，这是一个严重的错误！）<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">reiserfsck&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">check&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1<br>reiserfsck&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">fix</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">fixable&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1<br>reiserfsck&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">rebuild</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">sb&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1<br>reiserfsck&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">rebuild</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">tree&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true"><br>但是，一番修复之后，发现仍然无法mount！对比clone盘（早就应该比对了，失策！），才发现原来文件系统是ext3！这一番使用reiserfsck的折腾，估计/dev/sdc1是彻底完蛋了。好在知道/dev/sdc1是一个没有重要数据的分区，可以把用来试验。<br><br>于是，又使用e2fsck（fsck.ext3）尝试修复数据：<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true">告知找不到superblock，于是：<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">8193</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true">尝试找回superblock，但是失败！于是在另外几个保存superblock的地方继续尝试：<br></div>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">24577</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1&nbsp;<br>fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">40961</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1&nbsp;<br>fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">57345</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1&nbsp;<br>fsck</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ext3&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">73729</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sdc1</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true"><br>但是，均告失败！没有找回superblock，极度失望！<br><br></div>
<h3 _element_extended_="true">小技巧：如何知道superblock存储的位置？</h3>
<p _element_extended_="true">
<div _element_extended_="true">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">dd&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">=/</span><span style="COLOR: #000000">dev</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">zero&nbsp;of</span><span style="COLOR: #000000">=/</span><span style="COLOR: #000000">tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">test&nbsp;bs</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008080">count</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">160000</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">160000</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;records&nbsp;in<br></span><span style="COLOR: #000000">160000</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;records&nbsp;out<br></span><span style="COLOR: #000000">163840000</span><span style="COLOR: #000000">&nbsp;bytes&nbsp;(</span><span style="COLOR: #000000">164</span><span style="COLOR: #000000">&nbsp;MB)&nbsp;copied</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4.35857</span><span style="COLOR: #000000">&nbsp;seconds</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">37.6</span><span style="COLOR: #000000">&nbsp;MB</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">s<br><br>mke2fs&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">test<br>&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">test&nbsp;is&nbsp;not&nbsp;a&nbsp;block&nbsp;special&nbsp;device</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br>Proceed&nbsp;anyway</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;(y</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">n)&nbsp;y<br>Filesystem&nbsp;label</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br>OS&nbsp;type</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;Linux<br>Block&nbsp;size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #008080">log</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>Fragment&nbsp;size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #008080">log</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #000000">40000</span><span style="COLOR: #000000">&nbsp;inodes</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">160000</span><span style="COLOR: #000000">&nbsp;blocks<br></span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">&nbsp;blocks&nbsp;(</span><span style="COLOR: #000000">5.00</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">)&nbsp;reserved&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;the&nbsp;super&nbsp;user<br>First&nbsp;data&nbsp;block</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br>Maximum&nbsp;filesystem&nbsp;blocks</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">67371008</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">&nbsp;block&nbsp;groups<br></span><span style="COLOR: #000000">8192</span><span style="COLOR: #000000">&nbsp;blocks&nbsp;per&nbsp;group</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">8192</span><span style="COLOR: #000000">&nbsp;fragments&nbsp;per&nbsp;group<br></span><span style="COLOR: #000000">2000</span><span style="COLOR: #000000">&nbsp;inodes&nbsp;per&nbsp;group<br>Superblock&nbsp;backups&nbsp;stored&nbsp;on&nbsp;blocks</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">8193</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">24577</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">40961</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">57345</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">73729</span><span style="COLOR: #000000"><br><br>Writing&nbsp;inode&nbsp;tables</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">done</span><span style="COLOR: #000000"><br>Writing&nbsp;superblocks&nbsp;and&nbsp;filesystem&nbsp;accounting&nbsp;information</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">done</span><span style="COLOR: #000000"><br><br>This&nbsp;filesystem&nbsp;will&nbsp;be&nbsp;automatically&nbsp;checked&nbsp;every&nbsp;</span><span style="COLOR: #000000">35</span><span style="COLOR: #000000">&nbsp;mounts&nbsp;or<br></span><span style="COLOR: #000000">180</span><span style="COLOR: #000000">&nbsp;days</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;whichever&nbsp;comes&nbsp;first</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">Use</span><span style="COLOR: #000000">&nbsp;tune2fs&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">c&nbsp;or&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i&nbsp;to&nbsp;override</span><span style="COLOR: #000000">.</span></div>
</div>
<p _element_extended_="true">&nbsp;</p>
<div _element_extended_="true"><br></div>
<h2 _element_extended_="true">尝试live cd</h2>
<div _element_extended_="true">万般无奈，下载knoppix live cd，启动起来，居然认出并成功加载了/dev/sdb (备份盘)！于是把备份数据先弄下来再说。<br><br>但是，knoppix没有认出/dev/sdc，时间已经临近凌晨4点，这个盘暂时被宣布死缓。<br><br><br></div>
<h2 _element_extended_="true">经验教训</h2>
<div _element_extended_="true">
<ul>
    <li>系统安装时，一定要记录磁盘分区的相关信息，包括分区情况，所使用的参数（比如块大小）
    <li>常规备份是万万不能缺少的。对于系统管理员而言，系统崩溃是迟早要面临的事情，没有侥幸可言。 </li>
</ul>
</div>
<p><a href="http://blog.guoshuang.com/showlog.asp?log_id=4213">http://blog.guoshuang.com/showlog.asp?log_id=4213</a><br><a href="http://www.yeeyan.com/articles/view/888888/4137">http://www.yeeyan.com/articles/view/888888/4137</a><br><br></p>
<p>1. ext2ifs</p>
<p>这个工具与explore2fs都是John Newbigin使用Delphi写的，explore2fs Copyright (C) 2000，Ext2IFS v0.3 Copyright (C) 2004，由此也可以推测下哪个程序更完善，ext2ifs默认支持ext分区的写操作。</p>
<p>下载地址：http://uranus.it.swin.edu.au/~jn/li&#8230;ext2ifs-0.3.zip</p>
<p>http://uranus.it.swin.edu.au/~jn/linux/ext2ifs.htm</p>
<p>2.Paragon Ext2FS Anywhere</p>
<p>帮助你在 Windows 下访问 Linux 分区，把其作为正常逻辑器使用。提供对隐藏或者刚刚被创建的和格式化的 FAT/NTFS 分区。将创建，删除，格式，隐藏，在 Windows 下面取消隐藏初选，逻辑值或者扩展逻辑分区。你能够也马上改变的驱动器盘符。支持ext2／3读写，但是对超过4G的文件写入存在不可预知的问题。</p>
<p>3.explore2fs</p>
<p>使用相当简单，下载后解压缩，执行explore2fs.exe，程序会自动搜索ext2、ext3分区。</p>
<p>4.Total Commander加Ext2+Reiser 插件</p>
<p>Total Commander 网上很多，自行搜索一下吧。</p>
<p>Ext2+Reiser 插件下载</p>
<p>下载地址：http://ghisler.fileburst.com/fsplugins/ex2fs.zip</p>
<p>http://www.ghisler.com/plugins.htm 有许多插件可下载使用。</p>
<p>下载并安装Total Commander，下载并解压缩Ext2+Reiser插件中的output目录到Total Commander的安装目录内（或硬盘的其他固定位置，想使用就不能删除），运行Total Commander，选择配置－－插件－－文件系统插件－－配置－－添加－－找到ex2fs.wfx并添加，最后&#8220;确定&#8221;插件添加成功。</p>
<p>5.Ext2 Installable File System(另一个ext2ifs)</p>
<p>两个软件不是一个作者，不过实现的原理应该相似，驱动通用。这个软件安装后就能使用ext分区，可读写，但更改分区盘符很不方便，需要先到控制面板卸载，重启后重新安装程序重设盘符。</p>
<p>http://www.fs-driver.org/download.html</p>
<p>6.Paragon Mount Everything</p>
<p>和Paragon Ext2FS Anywhere这个软件是同一个公司出品，功能极其相似，Paragon Mount Everything Professional里已经包含了Paragon Ext2FS Anywhere，当然卖的价格也高了10美元。支持ext2／3读写，但是对超过4G的文件写入存在不可预知的问题。</p>
<p>引用:</p>
<p>Paragon Mount Everything Professional 是一款功能强劲的磁盘管理工具,程序</p>
<p>可以让你挂载各种系统格式下文件的软件，让不同系统下的文件可以互相访问。</p>
<p>Mount Everything 用于解除各个操作系统（DOS，Windows，Linux）访问彼此文件</p>
<p>系统的分区，使得访问计算机上别的操作系统的文件系统如同访问自己本来的文件系</p>
<p>统一样方便，可以自如的浏览、读写、创建甚至运行在各个分区的文件。</p>
<p>－支持NTFS1.2 - 3.1（Windows NT/2000/XP）；</p>
<p>－支持可压缩的NTFS；</p>
<p>－支持Ex2和Ext3文件系统；</p>
<p>－在各中环境－Windows、DOS、Linux－下都支持大于4GB的分区；</p>
<p>－Windows平台支持：Windows 95/98/ME, Windows NT/2000 Workstation/Pro,</p>
<p>Windows XP；</p>
<p>－任何Windows版本都可以无限制的访问Ext2/3FS和NTFS；</p>
<p>－DOS下对NTFS只读；</p>
<p>－Linux下对NTFS只读；</p>
<p>－在任何环境都支持基于脚本的批处理；</p>
<p>－Windows下提供了各种基本的分区功能；</p>
<p>－WIndows和DOS下随意改变启动器号；</p>
<p>－可建立能够访问NTFS以及其他各种移动存贮设备的DOS启动盘；</p>
<p>－提供了一个启动光盘，可直接进入DOS或Linux，并且访问NTFS（只读）；</p>
<p>7.Ext2Fsd</p>
<p>安装后使用mount命令对ext分区挂载卸载，可读写。</p>
<p>下载地址： http://switch.dl.sourceforge.net/so&#8230;xt2Fsd-0.25.exe</p>
<p>8、rfstool</p>
<p>命令行工具</p>
<p>http://p-nand-q.com/download/rfstool.html</p>
<p>下载地址：http://freshmeat.net/redir/rfstool/&#8230;fstool-0.14.zip</p>
<p>9、rfsgui-2.2</p>
<p>使用rfstool功能，gui界面。</p>
<p>下载地址：http://www.wolfsheep.com/map/rfsgui/rfsgui-2.2.zip</p>
<p>10、YAReG</p>
<p>也是使用rfstool功能，gui界面，需.net framework的支持</p>
<p>http://yareg.akucom.de/</p>
<p>11.ReiserDriver Pre-release Version 2</p>
<p>下载地址：http://switch.dl.sourceforge.net/so&#8230;-release.v2.zip</p>
<p>12.R-studio</p>
<p>功能超强的数据恢复、反删除工具，采用全新恢复技术，为使用 FAT12/16/32、NTFS、NTFS5（Windows 2000系统）和Ext2FS（Linux系统）分区的磁盘提供完整数据维护解决方案！同时提供对本地和网络磁盘的支持，此外大量参数设置让高级用户获得最佳恢复效果。具体功能有：采用Windows资源管理器操作界面；通过网络恢复远程数据（远程计算机可运行 Win95/98/ME/NT/2000/XP、Linux、UNIX系统）；支持FAT12/16/32、NTFS、NTFS5和Ext2FS文件系统；能够重建损毁的RAID阵列；为磁盘、分区、目录生成镜像文件；恢复删除分区上的文件、加密文件（NTFS 5）、数据流（NTFS、NTFS 5）；恢复FDISK或其它磁盘工具删除过得数据、病毒破坏的数据、MBR破坏后的数据；识别特定文件名；把数据保存到任何磁盘；浏览、编辑文件或磁盘内容等等。</p>
<p>上面列出的工具只是比较常见的，还有不少WINDOWS下可访问LINUX分区的工具，这得益于微软的IFS Kit（The primary goal of the Microsoft Windows Installable File System (IFS) Kit is to provide all of the materials necessary to design, build, and debug file systems and file system filter drivers for Windows 2000 and later operating systems.）想看了解更多不妨到这里去看看：</p>
<p>http://www.microsoft.com/taiwan/whdc/devtools/ifskit/default.mspx </p>
<p>WinAllFS<br><br>EXT2FSD</p>
<!-- google_ad_section_end -->
<img src ="http://www.phpweblog.net/killjin/aggbug/6068.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-11-13 16:14 <a href="http://www.phpweblog.net/killjin/archive/2008/11/13/6068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复Linux内核错误</title><link>http://www.phpweblog.net/killjin/archive/2008/11/13/6067.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 12 Nov 2008 19:20:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/13/6067.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6067.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/13/6067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6067.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6067.html</trackback:ping><description><![CDATA[环境介绍：Centos5.2+2.6.18-8.el5内核，编译器是GCC4.1.2。<br>要编译的内核2.6.18-8.el3<br>仅仅修改了部分内核的配置信息，没有大的变化。<br>然后：make ;make modules;make modules_install;<br>编译没有出问题，生成了内核，mkinitrd生成了initrd，加到lilo.conf中，重启选择新内核，出现一下问题：<br><br>hub 3-0:1.0: USB hub found<br>hub 3-0:1.0: 2 ports detected<br>Scanning and configuring dmraid supported devices<br>Trying to resume from LABEL=SWAP-hdc4<br>No suspend signature on swap, not resuming.<br>Creating root device.<br>Mounting root filesystem.<br>mount: could notKernel panic - not syncing: Attempted to kill init!<br>find filesystem&nbsp;&nbsp;'/dev/root'<br>Setting up other filesystems.<br>Setting up new root fs<br>setuproot: moving /dev failed: No such file or directory<br>no fstab.sys, mounting internal defaults<br>setuproot: error mounting /proc: No such file or directory<br>setuproot: error mounting /sys: No such file or directory<br>Switching to new root and running init.<br>unmounting old /dev<br>unmounting old /proc<br>unmounting old /sys<br>switchroot: mount failed: No such file or directory<br>两者区别就是编译器版本一个是gcc3.4，一个是gcc4.1，后者编译通过，但是不能引导系统。<br><br>解决方法：<br>Here's the fix<br>After almost giving up on Fedora 5, I finally got the fix to this problem.<br><br>The suspend signature on swap error, "Trying to resume from LABEL=SWAP-hdd3. No suspend signature on swap, not resuming", can be ignored. It gives this error because when the volumes are activated (look at the output previous to this error), it resumes the swap partition in that step. Therefore, it's trying to resume something that isn't suspended.<br><br>The error that causes all the trouble is "mount: could not find filesystem '/dev/root'". Appartently, in the init script within initrd-2.6.15-1.2054_FC5.img, the command 'mount /sysroot' is trying to mount /dev/root to /sysroot. Fedora 5 does not use /dev/root like in the previous versions of Fedora. Instead, it uses '/dev/VolGroup00/LogVol00' or '/dev/hda1' (or whereever '/' is located) to mount to /sysroot. For some reason, when init calls 'mount /sysroot', it's trying to mount /dev/root to /sysroot, instead of /dev/VolGroup00/LogVol00 to /sysroot. This messes up everything after this step in the init process. When it does a switchroot at the end, it fails. After killing init, it causes the kernel panic.<br><br>Here's the fix:<br><br>1) Boot with the rescue CD<br>2) Type 'chroot /mnt/sysimage' (wherever it mounts the Fedora 5 partition)<br>3) 'cd /boot'<br>4) 'mkdir newinit'<br>5) 'cd newinit'<br>6) 'gunzip -c ../initrd-2.6.15-1.2054_FC5.img | cpio -idmv'<br>7) 'vi init'<br>8) Find 'mount /sysroot' (near the end of the file)<br>9) Delete or comment this out<br>10) Replace with 'mount -o defaults --ro -t ext3 /dev/VolGroup00/LogVol00 /sysroot' where /dev/VolGroup00/LogVol00 is the mount point for /<br>11) ':wq' out of vi<br>12) 'find . | cpio --quiet -c -o &gt;../newinitrd'<br>13) 'cd ..' - you are now in /boot<br>14) 'mv initrd-2.6.15-1.2054_FC5.img initrd-2.6.15-1.2054_FC5.bak' - backup current initrd img file (just in case)<br>15) 'gzip -9 &lt; newinitrd &gt; initrd-2.6.15-1.2054_FC5.img'<br>16) Reboot the computer without the CD<br><br>* Steps 4-6,12,13,15 were taken from another site, but I couldn't post the URL. I'll try in my next post.<br><br>This should fix it. I'm glad I can finally run Fedora 5 on my box.<br><br>MarkCole, I'm not sure if you were experiencing the exact same problems I was with mounting root. However, I hope this helps anyone else experiencing the same problems I had.<br><br>Andy 
<img src ="http://www.phpweblog.net/killjin/aggbug/6067.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-11-13 03:20 <a href="http://www.phpweblog.net/killjin/archive/2008/11/13/6067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zend 框架摘要</title><link>http://www.phpweblog.net/killjin/archive/2008/11/12/6063.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 12 Nov 2008 12:36:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/12/6063.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6063.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/12/6063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6063.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6063.html</trackback:ping><description><![CDATA[<p>From: <a href="http://www.ibm.com/developerworks/cn/opensource/top-projects/php-resources.html#zend">http://www.ibm.com/developerworks/cn/opensource/top-projects/php-resources.html#zend</a></p>
<p>Zend 框架组件包括：</p>
<p>Zend_Controller<br>此模块为应用程序提供全面的控制。它将请求转化为特定的行为并确保其执行。</p>
<p>Zend_Db<br>此模块基于 PHP 数据对象 (PDO) 并提供一种通用方式来访问数据库。</p>
<p>Zend_Feed<br>此模块使使用 RSS 和 Atom 提要变得简单。</p>
<p>Zend_Filter<br>此模块提供字符串过滤函数，如 isEmail() 和 getAlpha()。</p>
<p>Zend_InputFilter<br>对于 Zend_Filter，此模块是用来操作数组的，如表单输入。</p>
<p>Zend_HttpClient<br>此模块使您能轻易地执行 HTTP 请求。</p>
<p>Zend_Json<br>此模块使您能够轻易地将 PHP 对象转换成 JavaScript 对象符号，反之亦然。</p>
<p>Zend_Log<br>此模块提供通用日志功能。</p>
<p>Zend_Mail<br>此模块使您能够发送文本文件和多部分 MIME 电子邮件。</p>
<p>Zend_Mime<br>此模块被 Zend_Mail 用来解码 MIME 消息。</p>
<p>Zend_Pdf<br>此模块用来创建新的 PDF 文档，及加载和编辑现有文档。</p>
<p>Zend_Search<br>此模块使您能在现有文本上执行复杂搜索。例如，您可以建立一个搜索引擎，该引擎可以基于相关性或其他因素返回结果。</p>
<p>Zend_Service_Amazon、Zend_Service_Flickr 以及 Zend_Service_Yahoo<br>这些模块提供对这些 Web 服务 API 的简单访问。</p>
<p>Zend_View<br>此模块处理 MVC 模式的 &#8220;视图&#8221; 部分。</p>
<p>Zend_XmlRpc<br>此模块使您能够轻易地创建 XML-RPC 客户机。（已为将来计划好服务器功能。）</p>
<p>编码准则</p>
<p>当您为 Zend 框架编码，或使用其编码时，您应该遵循特定的准则。这些准则是为了使团队项目变得更加简单而设计的。换句话说，通过定义编码规范，您不仅能避免接下来的问题，而且能够使其他人更容易阅读您的代码。Zend 框架文档中包含几页指导准则，比如：</p>
<p>* 确保文件整洁。换句话说，在文件头、标准的四格缩进等前面不能有任何前导或者后置的空格，这些空格会调用 Web 服务器导致意外地发送内容。<br>* 有且只有当类作为 Zend 框架的一部分时，而不仅仅是使用 Zend 框架时，类名才以 Zend_ 开头。<br>* 在函数名中下划线是禁止的。而是使用小写开头大小写间隔的方式（如 getTodaysDate()）。<br>* 只有当变量是 private 或 protected 类型时，才以下划线开头。<br>* 将所有的变量声明为 private、protected 或者 public，而不要使用 var。<br>* 使用标准的 PHP 标记（如 ），而不是简写方式 ()。<br>* 确保您的代码易于阅读。换句话说，当使用一个句号 (.) 连接文本时，确保在句号前后加上空格以便于阅读。同理，当声明一个数组时，要在逗号后面加上空格。<br>* 如果您必须通过引用传值，那只能在函数声明中这样做。调用时通过引用传值是不允许的。<br>* 任何 PHP 文件都必须包括能被 PhpDocumentor 阅读的文档，并且编码准则指定了特定的最少标记。<br><br>From: <a href="http://www.lostk.com/blog/zend_framework_summary/">http://www.lostk.com/blog/zend_framework_summary/</a> </p>
<img src ="http://www.phpweblog.net/killjin/aggbug/6063.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-11-12 20:36 <a href="http://www.phpweblog.net/killjin/archive/2008/11/12/6063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL不能启动解决办法</title><link>http://www.phpweblog.net/killjin/archive/2008/11/12/6062.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 12 Nov 2008 10:47:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/12/6062.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6062.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/12/6062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6062.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6062.html</trackback:ping><description><![CDATA[<p>启动mysql 报错：</p>
<p>ERROR 2002 (HY000): Can&#8217;t connect to local MySQL server through socket &#8216;/var/lib/mysql/mysql.sock&#8217; (2)</p>
<p>1、先查看 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已经启动.<br>另外看看是不是权限问题.</p>
<p>2、确定你的mysql.sock是不是在那个位置，<br>mysql -u 你的mysql用户名 -p -S /var/lib/mysql/mysql.sock</p>
<p>3、试试：service mysqld start</p>
<p>4、如果是权限问题，则先改变权限 #chown -R mysql:mysql /var/lib/mysql</p>
<p>[root@localhost ~]# /etc/init.d/mysqld start<br>启动 MySQL： [ 确定 ]<br>[root@localhost ~]# mysql -uroot -p</p>
<p>&nbsp;</p>
<p>ERROR 2002 (HY000): Can't connect to local <a onclick="javascript:tagshow(event, 'MySQL');" href="javascript:;" target=_self><u><strong><font color=#70314e>MySQL</font></strong></u></a> server through socket '/var/lib/mysql/mysql.sock' (2)<br>&nbsp;&nbsp; <span id=ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry>原因是，/var/lib/mysql 的访问权限问题。<br><br>shell&gt; chown -R mysql:mysql /var/lib/mysql<br><br>接着启动服务器<br><br>shell&gt; /etc/init.d/mysql start<br><br>服务器正常启动后察看 /var/lib/mysql 自动生成mysql.sock文件。<br><br>但是我的问题仍然没有得到解决。<br><br>问题终于解决：<br>方法：&nbsp;&nbsp;&nbsp; 修改/etc/my.conf:<br></span>[mysqld] <br>datadir=/usr/local/mysql/data <br>socket=/var/lib/mysql/mysql.sock <br><br>[mysql.server] <br>user=mysql <br>basedir=/usr/local/mysql <br></p>
<p>If there is not currently a section called [client], add one at the bottom of the file and copy the socket= line under the [mysqld] section such as: <br><br></p>
<div class=code>[client] <br>socket=/var/lib/mysql/mysql.sock </div>
<p><br>发现依旧如此，运行<span id=ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry>/etc/init.d/mysql start报错：&nbsp;&nbsp;&nbsp; Starting MySQLCouldn't find MySQL manager or server <br>是mysqld服务没启，运行/usr/local/mysql/bin/mysqld_safe &amp;<br><br>问题解决。<br><br><br><br><span style="COLOR: #ff0000"><strong>mysql Couldn't find the mysql server or manager<br></strong></span></p>
<p oN30g="0" yj_6T="19">Solution <br>Step 1.)<br><br>Rem out the line in /etc/my.conf that was setting basedir to /var/lib. As seen below:<br><strong><font color=red oN30g="0" yj_6T="3"><br>user=mysql<br>#basedir=/var/lib<br></font></strong><br>Step 2.)<br><br>Create the directory "/var/run/mysqld" if it does not exist. Then chown that directory to mysql.mysql as below...<br><strong><font color=red oN30g="0" yj_6T="3"><br>mkdir /var/run/mysqld<br>chown mysql.mysql /var/run/mysqld<br></font></strong><br>Step 3.)<br><br>Start the service..<br><strong><font color=red oN30g="0" yj_6T="1"><br>service mysql start<br></font></strong></p>
<p><br></span></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/6062.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-11-12 18:47 <a href="http://www.phpweblog.net/killjin/archive/2008/11/12/6062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复MYSQL数据库</title><link>http://www.phpweblog.net/killjin/archive/2008/11/12/6061.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 12 Nov 2008 09:44:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/12/6061.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6061.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/12/6061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6061.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6061.html</trackback:ping><description><![CDATA[全部:<br>mysqlcheck -A -o -r -p -uroot<br><br>指定数据库:<br>mysqlcheck -A -o -r 数据库名 -p <br><br><br>-r 恢复模式 -q 快速恢复<br>myisamchk -r tbl_name/*.MYI<br>myisamchk -r -q tbl_name/*.MYI<br><br>安全恢复<br>myisamchk --safe-recover tbl_name/*.MYI <br><br>quick参数做修补的工作： <br>linux# myisamchk --recover --quick tbl_name <br>linux# isamchk --recover --quick tbl_name <br>如果上面的方法不能解决问题，可以将--quick参数去掉： <br>linux# myisamchk --recover tbl_name <br>linux# isamchk --recover tbl_name <br>如果还是不能解决问题，可以再试着改用--safe_recover参数: <br>linux# myisamchk --safe_recover --quick tbl_name <br>linux# isamchk --safe_recover --quick tbl_name <br><br>附加MYSQL可怕的错误：<br>mysqld got signal 11;<br>The manual section 'Debugging a MySQL server' tells you how to<br>use a stack trace and/or the core file to produce a readable <br>backtrace that may help in finding out why mysqld died<br>Attempting backtrace. You can use the following information <br>to find out where mysqld died.&nbsp; If you see no messages after <br>this, something went terribly wrong...<br>stack range sanity check, ok, backtrace follows<br>0x40077552<br>0x81281a0<br>0x8128f47<br>0x8127be0<br>0x8127995<br>0x8104947<br>0x80ff28f<br>0x810131b<br>0x80ee4bc<br>0x80c3c91<br>0x80c6b43<br>0x80c1fd9<br>0x80c1686<br><br><a href="http://dev.mysql.com/doc/refman/5.0/en/using-stack-trace.html">http://dev.mysql.com/doc/refman/5.0/en/using-stack-trace.html</a>
<img src ="http://www.phpweblog.net/killjin/aggbug/6061.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-11-12 17:44 <a href="http://www.phpweblog.net/killjin/archive/2008/11/12/6061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序端口命令</title><link>http://www.phpweblog.net/killjin/archive/2008/11/12/6058.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 12 Nov 2008 09:01:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/12/6058.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6058.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/12/6058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6058.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6058.html</trackback:ping><description><![CDATA[lsof lsof -i@127.0.0.1:80<br>fuser<br>netstat -p&nbsp; netstat -lnp<br>
<img src ="http://www.phpweblog.net/killjin/aggbug/6058.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-11-12 17:01 <a href="http://www.phpweblog.net/killjin/archive/2008/11/12/6058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>俞敏洪的那段激动人心的励志话语 </title><link>http://www.phpweblog.net/killjin/archive/2008/11/10/6045.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 10 Nov 2008 15:16:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/10/6045.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6045.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/10/6045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6045.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6045.html</trackback:ping><description><![CDATA[人的生活方式有两种，<br>第一种方式是像草一样活着，<br>你尽管活着，每年还在成长，<br>但是你毕竟是一棵草，<br>你吸收雨露阳光，<br>但是长不大。<br>人们可以踩过你，<br>但是人们不会因为你的痛苦，而产生痛苦；<br>人们不会因为你被踩了，而来怜悯你，<br>因为人们本身就没有看到你。<br>所以我们每一个人，<br>都应该像树一样的成长，<br>即使我们现在什么都不是，<br>但是只要你有树的种子，<br>即使你被踩到泥土中间，<br>你依然能够吸收泥土的养分，<br>自己成长起来。<br>当你长成参天大树以后，<br>遥远的地方，人们就能看到你；<br>走近你，你能给人一片绿色。<br>活着是美丽的风景，<br>死了依然是栋梁之才，<br>活着死了都有用。<br>这就是我们每一个同学做人的标准和成长的标准。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ——俞敏洪在《赢在中国》36进12第3场中的现场演讲<br><br><embed src=http://www.tudou.com/v/e6ywqPOX3Ms width=400 height=342 type=application/x-shockwave-flash allowScriptAccess="always" wmode="transparent" allowFullScreen="true">&nbsp;<br><br>
<object width="400" height="340"><param name="movie" value="http://www.tudou.com/v/TZYMmaXLIms"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><embed src="http://www.tudou.com/v/TZYMmaXLIms" type="application/x-shockwave-flash" width="400" height="340" allowFullScreen="true" wmode="transparent" allowScriptAccess="always"></embed></object><img src ="http://www.phpweblog.net/killjin/aggbug/6045.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-11-10 23:16 <a href="http://www.phpweblog.net/killjin/archive/2008/11/10/6045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache出现大量的CLOSE_WAIT状态连接</title><link>http://www.phpweblog.net/killjin/archive/2008/11/07/6029.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 07 Nov 2008 15:27:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/07/6029.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6029.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/07/6029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6029.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6029.html</trackback:ping><description><![CDATA[一台运行Apache的Web服务器，前面有Squid，出现大量的CLOSE_WAIT连接，直接占满TCP队列，导致Apache失去响应。<br><br>一般来说，在一次正常的HTTP连接结束时，按正常的次序应该是服务器先发出FIN信号，客户端确认，然后客户端再发出FIN信号，服务端确认。如果客户端因为某种原因先于服务端发出了FIN信号，就会导致服务端被动关闭。<br><br>-------------------------------------<br><br><code>通过下列</code><code>Linux</code><code>内核参数来解决问题：<br><br></code><code>sysctl -w </code><code>net.ipv4.tcp_keepalive_time=30<br></code><code>sysctl -w </code><code>net.ipv4.tcp_keepalive_probes=2<br></code><code>sysctl -w </code><code>net.ipv4.tcp_keepalive_intvl=2<br><br>注意：Linux的内核参数我调整的可能有些猛，到底合不合适要注意观察。<br></code><code><br>参考链接：<br>http://ipsysctl-tutorial.frozentux.net/<br>http://haka.sharera.com/blog/BlogTopic/32309.htm<br></code>
<img src ="http://www.phpweblog.net/killjin/aggbug/6029.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-11-07 23:27 <a href="http://www.phpweblog.net/killjin/archive/2008/11/07/6029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL优化经验</title><link>http://www.phpweblog.net/killjin/archive/2008/11/07/6028.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 07 Nov 2008 09:00:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/07/6028.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6028.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/07/6028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6028.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6028.html</trackback:ping><description><![CDATA[<a href="http://kb.discuz.net/index.php?title=MySQL%E4%BC%98%E5%8C%96%E7%BB%8F%E9%AA%8C">http://kb.discuz.net/index.php?title=MySQL%E4%BC%98%E5%8C%96%E7%BB%8F%E9%AA%8C</a>
<img src ="http://www.phpweblog.net/killjin/aggbug/6028.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-11-07 17:00 <a href="http://www.phpweblog.net/killjin/archive/2008/11/07/6028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不再为Apache进程淤积、耗尽内存而困扰</title><link>http://www.phpweblog.net/killjin/archive/2008/11/07/6027.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 07 Nov 2008 08:29:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/07/6027.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6027.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/07/6027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6027.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6027.html</trackback:ping><description><![CDATA[<div class=tpc_content id=read_tpc>
<div>本篇文章是为使用Apache+MySQL，并为Apache耗尽内存而困扰的系统管理员而写。如果您没有耐心读完本文，请参考以下步骤：</div>
<ol>
    <li>修改/etc/my.cnf,加上这样一行：<br>log-slow-queries=queries-slow.log
    <li>重启MySQL
    <li>酌情过上一段时间，执行mysqldumpslow命令，或直接查看datadir/queries-slow.log,从中找出执行超时的SQL语句。其中datadir是MySQL所有数据库的存放路径。
    <li>根据上一步找出的SQL语句的内容，找到相应的数据表和脚本文件，查看超时原因所在。可能的原因有：数据量确实太大，未使用索引加快查询速度，等等。但程序没写好肯定是原因之一。
    <li>根据查出的原因酌情解决。 </li>
</ol>
<div>可能有很多系统管理员都为这样的情形而困扰过：Apache进程动辄占用内存几百兆，而且剧烈浮动，变化无常，有时甚至耗掉上G内存。在访问者那里的表现就是网站速度极不稳定，间歇性抽风，有时甚至会有5-30分钟无法打开网页。这时候，你的上司或同事可能会急切地打来电话问：我们的网站怎么上不去了？我们今天还要xxxx呢！但这时你的SSH也无法像往常一样忠实地给你一个&#8220;login:&#8221;，因为它也连不上服务器了。这个时候你的服务器在做什么呢？你找出各种理由向他们解释之后，过上一段时间，网站能够正常访问了，你也终于SSH上了服务器（听起来系统管理员真没用），然后你会用dmesg或者在/var/log/messages里面发现一堆有关内存的信息，什么DMA了，HighMem了，其中会包含类似这样一行：</div>
<div>Out of Memory: Killed process 6760 (httpd).</div>
<div>它告诉你的信息是，你的服务器物理内存耗尽，也没什么好向交换区淘汰的了，只好杀掉了你的Apache的一个进程。之所以选择这个进程，基本上就是因为它占用的物理内存最多。</div>
<div>&nbsp;</div>
<div>很没面子的说，我被这样的问题困扰了大半年。我曾在网上疯狂地搜索解决的办法，那些文章一般都会告诉你修改httpd.conf,把MinSpareThreads或是MaxSpareThreads或是MaxRequestsPerChild设小一点，我尝试过各种设定，都没有明显的效果。我甚至曾极端地经把MaxRequestsPerChild设为1，但是Apache的进程还是会淤积，超过ServerLimit设定值，直到耗尽内存。</div>
<div>&nbsp;</div>
<div>我曾经怀疑过是PHP内存泄漏，因为PHP官方不保证PHP的各种扩展是线程安全的，推荐使用prefork MPM而不是worker MPM.于是我也曾经把ThreadsPerChild设为1，因为这样每个进程也就只有一个线程，在一定意义上相当于prefork MPM，但是这种做法还是没有效果，问题依旧。</div>
<div>&nbsp;</div>
<div>大约一周以前，我在检查MySQL的运行状态的时候，发现有一项Slow_queries数值很高，我敏感地认识到可能是某个程序的SQL语句没有写好，而且很可能就是这样的程序导致Apache进程淤积。然后我翻阅了MySQL手册中有关<a href="http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html" target=_blank><font color=#2b76b0>Slow query log</font></a>的部分，按照那里的指示，修改/etc/my.cnf,在mysqld那一段加上如下一行：</div>
<div>&nbsp;</div>
<div>log-slow-queries=queries-slow.log</div>
<div>&nbsp;</div>
<div>重启MySQL。过上一段时间以后，用mysqldumpslow命令找出了执行超时的那条语句，根据那条查询的内容，我找出相应的脚本。那是一个留言本页面，程序确实没有写好，成了垃圾广告的乐园。有人通过这个页面向数据库里面写入了超过10万条的流言，而正常的留言还不到300条。而且这个程序里面分页的做法，居然是查询数据表里面所有10万条数据并排序，而用到的只有区区10条。竟然不使用LIMIT语句，我<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#126;&#64;&#35;&#36;&#37;"><font color=#2b76b0>~@#$%</font></a>^&amp;*!后来证实这个留言本已经是废弃的了（我想也不可能是正在使用的，因为每次都执行超时，已经无法使用了），就删掉了。之后，就再也没有出现过进程淤积、内存耗尽的问题。在ThreadsPerChild=64的情况下，每个Apache进程的内存一般就几十兆，最多的时候也就只有200M,进程数量也很少超过六七个。</div>
<div>&nbsp;</div>
<div>历经千辛万苦，终于搞定了这个问题。在此加以总结，希望本文能够给跟我一样被程序员害惨的系统管理员们一点点帮助。</div>
</div>
<img src ="http://www.phpweblog.net/killjin/aggbug/6027.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-11-07 16:29 <a href="http://www.phpweblog.net/killjin/archive/2008/11/07/6027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SYN_RECV SYN Flood 攻击处理</title><link>http://www.phpweblog.net/killjin/archive/2008/11/07/6026.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 07 Nov 2008 05:30:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/07/6026.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6026.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/07/6026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6026.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6026.html</trackback:ping><description><![CDATA[<p>网页在翻页到一个特定的页面的时候，和服务器80端口的连接被中止。<br>查看了netstat -anlp 发现有类似以下的记录，而IP就是我的。<br>
<blockquote>tcp 0 2560 61.152.251.68:80 60.26.156.241:1523 SYN_RECV -</blockquote>由于可能是程序的问题，因为仅仅在浏览这张网页的时候会出现这个问题，但是还是在netstat里面偶尔会看到几个 SYN_RECV ,所以就google了一下，在此总结一下。
<p>&#160;</p>
<p><strong>1.对于大量的 SYN_RECV</strong><br>若怀疑是SYN Flood攻击，有<a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=security&amp;Number=416586&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=31&amp;fpart=">以下建议</a>:<br>
<blockquote>这个攻击的解决方法如下： <br>1，增加未完成连接队列（q0)的最大长度。 <br>echo 1280&gt;/proc/sys/net/ipv4/tcp_max_syn_backlog <br>2, 启动SYN_cookie。 <br>echo 1&gt;/proc/sys/net/ipv4/tcp_syncookies <br>这些是被动的方法，治标不治本。而且加大了服务器的负担，但是可以避免被拒绝攻击（只是减缓） <br>治本的方法是在防火墙上做手脚。但是现在能在一定程度上防住syn flood攻击的防火墙都不便宜。并且把这个命令加入"/etc/rc.d/rc.local"文件中</blockquote><br>如果对 /proc/sys/net/ipv4 下的配置文件进行解释，可以参阅 <a href="http://oldsite.linuxaid.com.cn/training/showtri.jsp?i=371">LinuxAid技术站的文章</a>。查看本文全文也可以参阅。<br>关于 syn cookies， 请参阅 <a href="http://cr.yp.to/syncookies.html">&lt;<syn cookies>&gt; http://cr.yp.to/syncookies.html</a><br>也许 <a href="http://www.chinaunix.net/jh/13/3129.html">使用mod_limitipconn.c来限制apache的并发数</a> 也会有一定的帮助。
<p>&#160;</p>
<p><font color=red>最终，仅仅修改了这个参数，但是也加上了iptables的防火墙规则，问题解决。</font></p>
<p><strong>2.什麼是 TCP SYN Flood 攻擊?</strong> <br>發表日期： 星期二, 15 六月 2004 @ 01:36:47 台北標準時間 <br><br>TCP SYN Flood是一種常見，而且有效的遠端(遠程)拒絕服務(Denial of Service)攻擊方式，它透過一定的操作破壞TCP三次握手建立正常連接，佔用並耗費系統資源，使得提供TCP服務的主機系統無法正常工作。 由於TCP SYN Flood是透過網路底層對服務器Server進行攻擊的，它可以在任意改變自己的網路IP地址的同時，不被網路上的其他設備所識別，這樣就給防範網路犯罪部門追查犯罪來源造成很大的困難。 在國內內外的網站中，這種攻擊屢見不鮮。在一個拍賣網站上，曾經有犯罪分子利用這種手段，在低價位時阻止其他用戶繼續對商品拍賣，干擾拍賣過程的正常運作。</p>
<p>系統檢查 <br>一般情況下，可以一些簡單步驟進行檢查，來判斷系統是否正在遭受TCP SYN Flood攻擊。 </p>
<p>1、 服務端無法提供正常的TCP服務。連接請求被拒絕或超時。 <br>2、透過 netstat -an 命令檢查系統，發現有大量的SYN_RECV連接狀態。</p>
<p><strong>3. iptables的设置，引用自<a href="http://www.chinaunix.net/forum/viewtopic.php?t=118676">CU</a></strong><br>
<blockquote>防止同步包洪水（Sync Flood） <br># iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT <br>也有人写作 <br>#iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT <br>--limit 1/s 限制syn并发数每秒1次，可以根据自己的需要修改<br>防止各种端口扫描 <br># iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT <br>Ping洪水攻击（Ping of Death） <br># iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT </blockquote><br>附： <br><a href="http://iptables-tutorial.frozentux.net/cn/iptables-tutorial-cn-1.1.19.html">Iptables 指南 1.1.19</a><br>防火墙例子：<br><a href="http://www.chinaunix.net/forum/viewtopic.php?t=118676">在Linux上使用iptables命令，建立一个个人防火墙</a>
<p>&#160;</p>
<a name=a000144more></a><a id=more></a>
<p>参阅：</p>
<p>proc文件系统面面谈</p>
<p><a href="http://www.linuxaid.com.cn/">http://www.linuxaid.com.cn</a> 02-01-16 21:34 5467p ideal<br>----------------------------------------------------------------------<br></p>
<p>什么是proc文件系统</p>
<p>proc文件系统是一个伪文件系统，它只存在内存当中，而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息，并可以改变内核的某些参数。由于系统的信息，如进程，是动态改变的，所以用户或应用程序读取proc文件时，proc文件系统是动态从系统内核读出所需信息并提交的。它的目录结构如下：</p>
<p>目录名称 目录内容 <br>apm 高级电源管理信息 <br>cmdline 内核命令行 <br>Cpuinfo 关于Cpu信息 <br>Devices 可以用到的设备（块设备/字符设备） <br>Dma 使用的DMA通道<br>Filesystems 支持的文件系统 <br>Interrupts 中断的使用 <br>Ioports I/O端口的使用 <br>Kcore 内核核心印象 <br>Kmsg 内核消息 <br>Ksyms 内核符号表 <br>Loadavg 负载均衡 <br>Locks 内核锁 <br>Meminfo 内存信息 <br>Misc 杂项<br>Modules 加载模块列表 <br>Mounts 加载的文件系统 <br>Partitions 系统识别的分区表 <br>Rtc 实时时钟<br>Slabinfo Slab池信息<br>Stat 全面统计状态表<br>Swaps 对换空间的利用情况 <br>Version 内核版本 <br>Uptime 系统正常运行时间 </p>
<p>并不是所有这些目录在你的系统中都有，这取决于你的内核配置和装载的模块。另外，在/proc下还有三个很重要的目录：net，scsi和sys。Sys目录是可写的，可以通过它来访问或修改内核的参数（见下一部分），而net和scsi则依赖于内核配置。例如，如果系统不支持scsi，则scsi目录不存在。 </p>
<p>除了以上介绍的这些，还有的是一些以数字命名的目录，它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下，以进程的PID号为目录名，它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口，是一个link。Proc文件系统的名字就是由之而起。进程目录的结构如下： </p>
<p>目录名称 目录内容 <br>Cmdline 命令行参数 <br>Environ 环境变量值 <br>Fd 一个包含所有文件描述符的目录 <br>Mem 进程的内存被利用情况 <br>Stat 进程状态 <br>Status 进程当前状态，以可读的方式显示出来 <br>Cwd 当前工作目录的链接 <br>Exe 指向该进程的执行命令文件<br>Maps 内存映象<br>Statm 进程内存状态信息 <br>Root 链接此进程的root目录</p>
<p>用户如果要查看系统信息，可以用cat命令。例如：</p>
<p># cat /proc/interrupts <br>CPU0 <br>0: 8728810 XT-PIC timer <br>1: 895 XT-PIC keyboard <br>2: 0 XT-PIC cascade <br>3: 531695 XT-PIC aha152x <br>4: 2014133 XT-PIC serial <br>5: 44401 XT-PIC pcnet_cs <br>8: 2 XT-PIC rtc <br>11: 8 XT-PIC i82365 <br>12: 182918 XT-PIC Mouse <br>13: 1 XT-PIC fpu PS/2 <br>14: 1232265 XT-PIC ide0 <br>15: 7 XT-PIC ide1 <br>NMI: 0 </p>
<p>用户还可以实现修改内核参数。在/proc文件系统中有一个有趣的目录：/proc/sys。它不仅提供了内核信息，而且可以通过它修改内核参数，来优化你的系统。但是你必须很小心，因为可能会造成系统崩溃。最好是先找一台无关紧要的机子，调试成功后再应用到你的系统上。</p>
<p>要改变内核的参数，只要用vi编辑或echo参数重定向到文件中即可。下面有一个例子： </p>
<p># cat /proc/sys/fs/file-max <br>4096 <br># echo 8192 &gt; /proc/sys/fs/file-max <br># cat /proc/sys/fs/file-max <br>8192 </p>
<p>如果你优化了参数，则可以把它们写成添加到文件rc.local中，使它在系统启动时自动完成修改。</p>
<p>/proc文件系统中网络参数</p>
<p>在/proc/sys/net/ipv4/目录下，包含的是和tcp/ip协议相关的各种参数，下面我们就对这些网络参数加以详细的说明。</p>
<p>ip_forward 参数类型：BOOLEAN<br>0 - 关闭(默认值)<br>not 0 - 打开ip转发</p>
<p>在网络本地接口之间转发数据报。该参数非常特殊，对该参数的修改将导致其它所有相关配置参数恢复其默认值(对于主机参阅RFC1122，对于路由器参见RFC1812)</p>
<p>ip_default_ttl 参数类型：INTEGER<br>默认值为 64 。表示IP数据报的Time To Live值。</p>
<p>ip_no_pmtu_disc 参数类型：BOOLEAN<br>关闭路径MTU探测，默认值为FALSE</p>
<p>ipfrag_high_thresh 参数类型：整型<br>用来组装分段的IP包的最大内存量。当ipfrag_high_thresh数量的内存被分配来用来组装IP包，则IP分片处理器将丢弃数据报直到ipfrag_low_thresh数量的内存被用来组装IP包。</p>
<p>ipfrag_low_thresh 参数类型：整型<br>参见ipfrag_high_thresh。</p>
<p>ipfrag_time 参数类型：整型<br>保存一个IP分片在内存中的时间。</p>
<p>inet_peer_threshold 参数类型：整型<br>INET对端存储器某个合适值，当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多﹐存活期越低﹐GC 间隔越短</p>
<p>inet_peer_minttl 参数类型：整型<br>条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。</p>
<p>inet_peer_maxttl 参数类型：整型<br>条目的最大存活期。在此期限到达之后﹐如果缓冲池没有耗尽压力的话(例如﹐缓冲池中的条目数目非常少)﹐不使用的条目将会超时。该值以 jiffies为单位测量。</p>
<p>inet_peer_gc_mintime 参数类型：整型<br>废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值以 jiffies为单位测量。</p>
<p>inet_peer_gc_maxtime 参数类型：整型<br>废物收集(GC)通过的最大间隔，这个间隔会影响到缓冲池中内存的低压力。 该值以 jiffies为单位测量。</p>
<p>tcp_syn_retries 参数类型：整型<br>对于一个新建连接，内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255，默认值是5，对应于180秒左右。</p>
<p>tcp_synack_retries 参数类型：整型<br>对于远端的连接请求SYN，内核会发送SYN ＋ ACK数据报，以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。 </p>
<p>tcp_keepalive_time 参数类型：整型<br>当keepalive打开的情况下，TCP发送keepalive消息的频率，默认值是2个小时。</p>
<p>tcp_keepalive_probes 参数类型：整型<br>TCP发送keepalive探测以确定该连接已经断开的次数，默认值是9。</p>
<p>tcp_keepalive_interval 参数类型：整型<br>探测消息发送的频率，乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒，也就是没有活动的连接将在大约11分钟以后将被丢弃。</p>
<p>tcp_retries1 参数类型：整型<br>当出现可疑情况而必须向网络层报告这个可疑状况之前﹐需要进行多少次重试。最低的 RFC 数值是 3 ﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。</p>
<p>tcp_retries2 参数类型：整型<br>在丢弃激活的TCP连接之前﹐需要进行多少次重试。RFC1122规定，该值必须大于100秒。默认值为15，根据RTO的值来决定，相当于13-30分钟，</p>
<p>tcp_orphan_retries 参数类型：整型<br>在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是 7 个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。</p>
<p>tcp_fin_timeout 参数类型：整型<br>对于本端断开的socket连接，TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。 </p>
<p>tcp_max_tw_buckets 参数类型：整型<br>系统在同时所处理的最大timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。 </p>
<p>tcp_tw_recycle 参数类型：布尔<br>打开快速 TIME-WAIT sockets 回收。默认值是1。除非得到技术专家的建议或要求﹐请不要随意修改这个值。 </p>
<p>tcp_max_orphans 参数类型：整型<br>系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset，并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制</p>
<p>tcp_abort_on_overflow 参数类型：布尔<br>当守护进程太忙而不能接受新的连接，就象对方发送reset消息，默认值是false。这意味着当溢出的原因是因为一个偶然的猝发，那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项，该选项会影响客户的使用。</p>
<p>tcp_syncookies 参数类型：整型<br>只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。默认值是false。</p>
<p>注意：该选项千万不能用于那些没有收到攻击的高负载服务器，如果在日志中出现synflood消息，但是调查发现没有收到synflood攻击，而是合法用户的连接负载过高的原因，你应该调整其它参数来提高服务器性能。参考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.</p>
<p>syncookie严重的违背TCP协议，不允许使用TCP扩展，可能对某些服务导致严重的性能影响(如SMTP转发)。</p>
<p>tcp_stdurg 参数类型：整型<br>使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释，因此如果您在 Linux 打开它﹐或会导致不能和它们正确沟通。默认值为为﹕FALSE </p>
<p>tcp_max_syn_backlog 参数类型：整型<br>对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16&lt;=tcp_max_syn_backlog ﹐并且编进核心之内。 </p>
<p>tcp_window_scaling 参数类型：布尔<br>正常来说，TCP/IP 可以接受最大到65535字节的 windows。对于宽带网络，该值可能是不够的，通过调整该参数有助于提高宽带服务器性能。</p>
<p>tcp_timestamps 参数类型：布尔<br>Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。 </p>
<p>tcp_sack 参数类型：布尔<br>使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。</p>
<p>tcp_fack 参数类型：布尔<br>打开FACK拥塞避免和快速重传功能。</p>
<p>tcp_dsack 参数类型：布尔<br>允许TCP发送"两个完全相同"的SACK。</p>
<p>tcp_ecn 参数类型：布尔<br>打开TCP的直接拥塞通告功能。</p>
<p>tcp_reordering 参数类型：整型<br>TCP流中重排序的数据报最大数量默认值是 3 。</p>
<p>tcp_retrans_collapse 参数类型：布尔<br>对于某些有bug的打印机提供针对其bug的兼容性。</p>
<p>tcp_wmem - 三个整数的向量： min, default, max<br>min：为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4K。</p>
<p>default：为TCP socket预留用于发送缓冲的内存数量，默认情况下该值会影响其它协议使用的net.core.wmem_default 值，一般要低于net.core.wmem_default的值。默认值为16K。</p>
<p>max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max，今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。</p>
<p>tcp_rmem - 三个整数的向量： min, default, max<br>min：为TCP socket预留用于接收缓冲的内存数量，即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲，默认值为8K。</p>
<p>default：为TCP socket预留用于接收缓冲的内存数量，默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是默认值情况下，tcp 窗口大小为65535。</p>
<p>max：用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max，今天选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。</p>
<p>tcp_mem - 三个整数的向量： low, pressure, high<br>low：当TCP使用了低于该值的内存页面数时，TCP不会考虑释放内存。</p>
<p>pressure：当TCP使用了超过该值的内存页面数量时，TCP试图稳定其内存使用，进入pressure模式，当内存消耗低于low值时则退出pressure状态。</p>
<p>high：允许所有tcp sockets用于排队缓冲数据报的页面量。</p>
<p>一般情况下这些值是在系统启动时根据系统内存数量计算得到的。</p>
<p>tcp_app_win - 整数</p>
<p>保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。默认值是31。</p>
<p>tcp_adv_win_scale - 整数<br>计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale &gt; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale &lt;= 0），默认值为2。</p>
<p>ip_local_port_range - 两个整数<br>定于TCP和UDP使用的本地端口范围，第一个数是开始，第二个数是最后端口号，默认值依赖于系统中可用的内存数：<br>&gt; 128Mb 32768-61000<br>&lt; 128Mb 1024-4999 or even less.<br>该值决定了活动连接的数量，也就是系统可以并发的连接数</p>
<p>icmp_echo_ignore_all - 布尔类型<br>icmp_echo_ignore_broadcasts - 布尔类型<br>如果任何一个设置为true(&gt;0)则系统将忽略所有发送给自己的ICMP ECHO请求或那些广播地址的请求。</p>
<p>icmp_destunreach_rate - 整数<br>icmp_paramprob_rate - 整数<br>icmp_timeexceed_rate - 整数<br>icmp_echoreply_rate - 整数(not enabled per default)<br>限制发向特定目标的ICMP数据报的最大速率。0表示没有任何限制，否则表示jiffies数据单位中允许发送的个数。</p>
<p>icmp_ignore_bogus_error_responses - 布尔类型<br>某些路由器违背RFC1122标准，其对广播帧发送伪造的响应来应答。这种违背行为通常会被以告警的方式记录在系统日志中。如果该选项设置为True，内核不会记录这种警告信息。默认值为False。</p>
<p>(1) Jiffie: 内核使用的内部时间单位，在i386系统上大小为1/100s，在Alpha中为1/1024S。在/usr/include/asm/param.h中的HZ定义有特定系统的值。</p>
<p>conf/interface/*: <br>conf/all/*是特定的，用来修改所有接口的设置，is special and changes the settings for all interfaces.<br>Change special settings per interface.</p>
<p>log_martians - 布尔类型<br>记录带有不允许的地址的数据报到内核日志中。</p>
<p>accept_redirects - 布尔类型<br>收发接收ICMP重定向消息。对于主机来说默认为True，对于用作路由器时默认值为False。</p>
<p>forwarding - 布尔类型<br>在该接口打开转发功能</p>
<p>mc_forwarding - 布尔类型<br>是否进行多播路由。只有内核编译有CONFIG_MROUTE并且有路由服务程序在运行该参数才有效。</p>
<p>proxy_arp - 布尔类型<br>打开proxy arp功能。</p>
<p>shared_media - 布尔类型<br>发送(路由器)或接收(主机) RFC1620 共享媒体重定向。覆盖ip_secure_redirects的值。默认为True。</p>
<p>secure_redirects - 布尔类型<br>仅仅接收发给默认网关列表中网关的ICMP重定向消息，默认值是TRUE。</p>
<p>send_redirects - 布尔类型<br>如果是router，发送重定向消息，默认值是TRUE</p>
<p>bootp_relay - 布尔类型<br>接收源地址为0.b.c.d，目的地址不是本机的数据报。用来支持BOOTP转发服务进程，该进程将捕获并转发该包。默认为False，目前还没有实现。</p>
<p>accept_source_route - 布尔类型<br>接收带有SRR选项的数据报。对于主机来说默认为False，对于用作路由器时默认值为True。</p>
<p>rp_filter 参数类型<br>1 - 通过反向路径回溯进行源地址验证(在RFC1812中定义)。对于单穴主机和stub网络路由器推荐使用该选项。<br>0 - 不通过反向路径回溯进行源地址验证。<br>默认值为0。某些发布在启动时自动将其打开。<br><br></p>
<div align=right>(END)</div>
<img src ="http://www.phpweblog.net/killjin/aggbug/6026.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-11-07 13:30 <a href="http://www.phpweblog.net/killjin/archive/2008/11/07/6026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于linux封IP说明</title><link>http://www.phpweblog.net/killjin/archive/2008/11/07/6023.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 07 Nov 2008 01:32:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/07/6023.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6023.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/07/6023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6023.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6023.html</trackback:ping><description><![CDATA[单个IP的命令是 <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;211.1.0.0&nbsp;-j&nbsp;DROP <br><br>封IP段的命令是 <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;211.1.0.0/16&nbsp;-j&nbsp;DROP <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;211.2.0.0/16&nbsp;-j&nbsp;DROP <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;211.3.0.0/16&nbsp;-j&nbsp;DROP <br><br>封整个段的命令是 <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;211.0.0.0/8&nbsp;-j&nbsp;DROP <br><br>封几个段的命令是 <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;61.37.80.0/24&nbsp;-j&nbsp;DROP <br>iptables&nbsp;-I&nbsp;INPUT&nbsp;-s&nbsp;61.37.81.0/24&nbsp;-j&nbsp;DROP <br><br>服务器启动自运行 <br>有三个方法： <br>1、把它加到/etc/rc.local中 <br>2、iptables-save&nbsp;&gt;;/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中，系统启动iptables时自动执行。 <br>3、service&nbsp;&nbsp;iptables&nbsp;&nbsp;save&nbsp;也可以把你当前的iptables规则放/etc/sysconfig/iptables中，系统启动iptables时自动执行。 <br>后两种更好此，一般iptables服务会在network服务之前启来，更安全。 
<img src ="http://www.phpweblog.net/killjin/aggbug/6023.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-11-07 09:32 <a href="http://www.phpweblog.net/killjin/archive/2008/11/07/6023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mozilla建议的CSS书写顺序</title><link>http://www.phpweblog.net/killjin/archive/2008/11/05/6014.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 05 Nov 2008 01:41:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/11/05/6014.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/6014.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/11/05/6014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/6014.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/6014.html</trackback:ping><description><![CDATA[<strong>//显示属性<br></strong>display<br>list-style<br>position<br>float<br>clear<br><br><strong>//自身属性</strong><br>width<br>height<br>margin<br>padding<br>border<br>background<br><br><strong>//文本属性</strong><br>color<br>font<br>text-decoration<br>text-align<br>vertical-align<br>white-space<br>other text<br>content 
<img src ="http://www.phpweblog.net/killjin/aggbug/6014.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-11-05 09:41 <a href="http://www.phpweblog.net/killjin/archive/2008/11/05/6014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矜持的感动</title><link>http://www.phpweblog.net/killjin/archive/2008/10/27/5993.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 27 Oct 2008 15:21:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/10/27/5993.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5993.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/10/27/5993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5993.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5993.html</trackback:ping><description><![CDATA[<p>丁铃！门上的铃当响了起来，一个三十多岁，穿著笔挺西服的男人，走进了这家飘散着浓浓咖啡香的小小咖啡厅。&nbsp; </p>
<p>&#8220;午安！欢迎光临！&#8221;年轻的老板娘亲切地招呼着。&nbsp; <br>男人一面客气地微微点了点头，一面走到吧台前的位子坐了下来，开口对老板娘说：&nbsp; </p>
<p>&#8220;麻烦给我一杯摩卡，谢谢。&#8221;&nbsp; </p>
<p>&#8220;好的，请稍候。&#8221;老板娘微笑着说。&nbsp; </p>
<p>接着她便开始熟练地磨碎咖啡豆，煮起咖啡来。男人一直带着笑容看着老板娘煮咖啡的动作，一副很享受的样子。&nbsp; </p>
<p>过了没多久，老板娘便将一杯香醇的咖啡端到男人的面前。&#8220;请慢用！&#8221;&nbsp; </p>
<p>&#8220;谢谢。&#8221;男人将杯子拿到嘴边，浅浅地尝了一口。&nbsp; </p>
<p>&#8220;第一次来吗？？&#8221;老板娘问。&nbsp; </p>
<p>&#8220;是啊！！&#8221;男人答。&nbsp; </p>
<p>&#8220;觉得我们这家店怎么样？&#8221;&nbsp; </p>
<p>&#8220;很不错！气氛很好！&#8221;&nbsp; </p>
<p>&#8220;我自己也是很喜欢，所以虽然生意不好，我和我先生却还是舍不得把它关掉。&#8221;&nbsp; </p>
<p>&#8220;嗯&#8230;&#8230;&#8221;男人好像有所同感地点了点头，又喝了一口咖啡。&nbsp; </p>
<p>两人沉默了一会，一时间空荡的店里只余悠扬爵士音乐。男人忽然开口，打破了这短暂的宁静。&nbsp; </p>
<p>&#8220;呃&#8230;&#8230;不好意思，可以请教你一个问题吗？？&#8221;&nbsp; </p>
<p>&#8220;什么问题呢？&#8221;老板娘好奇地问。&nbsp; </p>
<p>&#8220;嗯&#8230;这&#8230;这该怎么说好呢？&#8221;男人抓着头，一副不知所措的样子。&#8220;或者你可以先听我说个故事吗？&#8221;&nbsp; </p>
<p>老板娘点了点头，示意男人继续说下去。</p>
<p>&#8220;我以前有个很要好的女朋友，已经到了要论及婚嫁的地步。我和她之间的感情发展得相当平凡，并不是什么经过大风大浪、轰轰烈烈般的爱情。但我想从我第一眼看到她的时候，就彷佛有一股魔力，有一个声音，在推动着我，告诉着我，就是她了！她就是我一直期待着的女孩。更令我高兴的是她也响应了我的示爱，接受了我。这一切的顺让 我整个人陶醉于幸褔的喜悦之中，只不过&#8230;&#8230;&#8221; </p>
<p>&#8220;只不过！！发生了什么事了吗？？&#8221;&nbsp; </p>
<p>老板娘显然给故事吸引住了，她打断了男人的话。&nbsp; </p>
<p>&#8220;嗯&#8230;&#8230;&#8221;男人脸色沉了下来，略微停顿了一下，继续说下去。&nbsp; </p>
<p>&#8220;只不过我忘了幸褔的背后，往往藏匿着最可怕的恶魔。就在我们订婚前一个月的一个晚上，她&#8230;&#8230;她遭到了歹徒的强暴&#8220;啊！&#8221;老板娘惊讶地啊的一声叫了出来&#8220;都怪我！要是我那天坚持送她回去就好了！&#8221;男人用力地捶打着桌面，杯子中的咖啡因剧烈震动的关系洒了出来。&nbsp; </p>
<p>&#8220;你要问我的该不会就是这个吧！&#8221;老板娘一面擦拭着洒出来的咖啡一面说。&nbsp; </p>
<p>&#8220;不！不是的！我对她的感情不会因为这样而有所动摇，我决定仍旧如期订婚，可惜就在我们订婚的那一天，她&#8230;&#8230;上吊自杀了！&#8221;&nbsp; </p>
<p>男人的语调异常平缓，从他的表情上看得出，当时的他是多么的难过与震惊。&nbsp; </p>
<p>&#8220;自杀！那她有没有怎么样？&#8221;老板娘为突转而下的剧情睁大了眼睛，紧张地看着男人。 &#8220;幸运的是我们发现得早，送到医院时还有气，只是脑部因为长时间缺氧，呈现昏迷状态，当时医生说她一度有成为植物人的危险。&#8221;&nbsp; </p>
<p>老板娘松下一口气，&#8220;那她后来有醒过来吗？&#8221;&nbsp; </p>
<p>&#8220;有的，她醒了！&#8221;&nbsp; </p>
<p>&#8220;但&#8230;&#8230;但当我得知她醒了的消息，高兴地要去看她时，却被她父母给拦在门外。&#8221;&nbsp; </p>
<p>&#8220;为什么？她父母为什么不让你去看她？&#8221;&nbsp; </p>
<p>&#8220;她父母跪在地上求我，原来她失去了记忆，失去了认识我以后的记忆，医生说这是选择性失忆症，当人在遭遇极大的打击时，会逃避性地藏起一些记忆。她父母 求我暂时不要再出现在她面前，他们认为让她就这样忘了之前的一切对她比较好，怕我要是去见她或许会让她回想起来，到时她可能又会陷入昏迷，甚至又跑去自 杀。&#8221;&nbsp; </p>
<p>&#8220;她父母这么说也是有道理，反正只是暂时嘛！等她情绪和身体都稳定了，你就又可以见她啦！&#8221;老板娘听了男人的话后这样说着。&nbsp; </p>
<p>男人勉力挤出一丝笑意，样子无限苍凉，&#8220;你知道他们的暂时指的是多久吗？是十年啊！也就是这十年里我得要忍受这样没有她的日子，就算偶尔在路上碰面，也得要装作陌生人一般地和她擦肩而过。&#8221;男人快要咆哮起来似的，&#8220;你知道这样的日子有多难熬，这样想爱却又不能爱的心情有多痛苦！&#8221;&nbsp; </p>
<p><br>&#8220;虽然会很痛苦，但你还是选择了这条路吧！&#8221;老板娘看着男人的眼神变得非常温柔。&nbsp; </p>
<p>老板娘的眼神让男人冷静了下来，点头说：&#8220;嗯！到今天就满十年了！&#8221;&nbsp; </p>
<p>&#8220;哦！真的吗！？那真是恭喜了，你努力撑了十年，到今天终于可以去见她了！&#8221;老板娘开心地说。&nbsp; </p>
<p>&#8220;是这样没错！但是愈到这一天，我反倒愈害怕。十年了，我的心意是没有改变，但是她呢？如果我跟 她说了以前的事，她还是想不起我那怎样办？，或者是她已经有男朋友，甚至于结婚了呢？&#8221;&nbsp; </p>
<p>&#8220;这才是我想请教你的问题！&#8221;男人似乎略带紧张的看着眼前年轻的女店主，静静地等待着她的答复。&nbsp; </p>
<p>&#8220;嗯&#8230;&#8230;&#8221;老板娘用手托着头，脸色凝重地想着男人所提的问题。&nbsp; </p>
<p>&#8220;我想既然你这么爱那个女孩，她记不记得你其实并不重要，最多是重新开始而已，再重新追求她一次，再重新谈一次恋爱，其实也很不错吧！！而且就算有男朋友了也没关系啊！把她从他手中抢过来不就行了！&#8221;老板娘笑着说。&nbsp; </p>
<p>&#8220;但是！&#8221;她忽然将表情严肃了起来，&#8220;但是如果她已经结婚了的话，那你就放弃吧！我们结了婚的人啊！是最痛恨有人破坏人家家庭的了！&#8221;&nbsp; </p>
<p><br>&#8220;是吗？&#8221;男人低着头冷寞地说。&nbsp; </p>
<p>&#8220;没错！！所以你可千万别做个破坏别人家庭的人哦！&#8221;&nbsp; </p>
<p>丁铃！挂在门上铃铛又响了起来，走进来几个刚下课的大学生，老板娘走出吧台，忙着招呼这几位新来的客人。&nbsp; </p>
<p>&#8220;对了！&#8221;老板娘好象忽然想到了什么，转过头来看着男人。&nbsp; </p>
<p>&#8220;你为什么会想问我这些啊！我和你不过是第一次见面而已啊！&#8221;她好奇地问。&nbsp; </p>
<p>&#8220;嗯&#8230;&#8230;为什么呢&#8230;&#8230;大概是因为那个女孩曾说过，结婚以后要和我一起开一家像这样的咖啡厅吧！&#8221;&nbsp; </p>
<p><br>&#8220;哦！！原来是这样子啊！&#8221;老板娘说。&nbsp; </p>
<p>&#8220;嗯！只是这样而已！只 是这样而已！只是这样而已！只是&#8230;&#8230;&#8221;男人不停地重复着同样一句话，好像藉此告诉自己什么似的。爵士乐停了下来，整个屋子里只听得大学生清脆的谈笑声。男 人低着头偷偷地瞄着老板娘手上的结婚戒指，一滴温暖的眼泪，悄悄地滑进了那杯早已冷却的咖啡里&#8230;&#8230;<br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/5993.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-10-27 23:21 <a href="http://www.phpweblog.net/killjin/archive/2008/10/27/5993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成为PHP高手的五个必由之路</title><link>http://www.phpweblog.net/killjin/archive/2008/10/17/5904.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 16 Oct 2008 16:53:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/10/17/5904.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5904.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/10/17/5904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5904.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5904.html</trackback:ping><description><![CDATA[<p>原文名称：5 ways to be a better php developer<br>原文链接：http://www.developertutorials.com/blog/web/5-ways-to-be-a-better-php-developer-36/<br>中文翻译：Altair<br>首　　发：<a href="http://www.phpinternals.com/">http://www.phpinternals.com/</a></p>
<p><span>[转载必须注明出处、作者以及上面信息的完整]</span></p>
<p>Often, an inexperienced PHP developer will hop onto IRC and ask a question in ##php on Freenode. And if the question is trivial, the answer seems obvious or they simply seem like a newbie, they may soon find themselves bombarded with such comments as &#8220;RTFM&#8221;, &#8220;Go learn PHP&#8221;, &#8220;We are not your personal tutors&#8221; or simply &#8220;You need to become a better PHP developer&#8221;. So, how is it that one becomes a better PHP developer? In this post, I&#8217;ll outline five ways to be a better developer, improve your productivity, write less code and achieve more with your web applications.There&#8217;s always more to learn when it comes to PHP development. New core functions, new frameworks, new design patterns, new code documentation styles. Here are some of the best ways you can become a better PHP developer.</p>
<p>经常有一些经验不足的PHP开发人员在Freenode的##php IRC频道上问问题。如果问题很琐碎，或者答案显而易见，或表现得象一个菜鸟，很快他们就会发现会受到如下一些回复的炮轰：&#8220;去读该死的手册去吧&#8221;，&#8220;好好去学一学PHP吧&#8221;，&#8220;我们不是你个人的导师&#8221;或更直接的&#8220;你需要成为一个更好的PHP开发者&#8221;。但是，怎样才能成为一个更优秀的PHP开发者呢？在这篇文章中，我列出了五种成为更优秀的PHP开发者的方法，让你在PHP开发过程中提高效率，用更少的代码来完成更多的事情。在PHP的开发过程中永远会有更多的内容需要去学习,如新的核心函数，新的框架，新的设计模式，新的编码或文档规范等等。下面就是一些成为更优秀的PHP开发者的最佳途径。</p>
<p><strong>1. Read the manual<br>1. 阅读手册</strong><br>I really can&#8217;t emphasize this enough - there&#8217;s a lot to be learned just reading the PHP manual. Especially check out the string and array functions. There&#8217;s a lot of functionality available right there, and often by reading through the manual you&#8217;ll find you&#8217;ve been reinventing the wheel in past projects when you could have just used a core function. The manual is your friend.<br>没什么比阅读手册更值得强调的事了&#8211;仅仅通过阅读手册你就可以学习到很多东西。特别是有关字符串和数组有关的函数。就在这些函数里面包括许多有用的功能，如果你仔细阅读手册，你会经常发现在以往的项目开发过程中，很多时候你在&#8220;重复发明轮子&#8221;，而实际上你只需要一个核心函数就可以完成相应的功能。手册是你的朋友。</p>
<p><strong>2. Browse through some code<br>2.浏览源代码</strong><br>PHP has a lot of open source code out there. So why not learn from it? Download an open source PHP application and have a read through the code. The bigger projects are probably better, as they&#8217;ll have more complex structures and systems in place but also more thorough documentation explaining it all. Check out SourceForge.net if you can&#8217;t find a good place to start.<br>有很多使用PHP开发的开源程序。为什么不去学习它们呢？下载一份开源的PHP应用程序的源代码，仔细阅读它吧。也许越大的项目越值得去阅读，虽然它们也许有更复杂的结构和系统，但也有更详细的解释文档。如果你不知道从哪里开始，可以试试SourceForge.net。</p>
<p><strong>3. Learn a new framework<br>3. 学习新的框架</strong><br>There are more PHP frameworks out there than you&#8217;ve had hot dinners; a lot of them are open source and available online if you know where to look. Try the major ones first - phpframeworks.com has a good list. Your framework can never be entirely complete, your next job may require a different framework and you might just find the functionality of another comes in handy in one of your projects.<br>也许在一顿饭的功夫就有不少新的框架问世了;它们中的大部分都是开源的，可以直接从网上下载，前提是你知道从哪里去找。先选择一些主流的框架— phpframeworks.com里面有一个很好的框架的列表。你所选的框架永远不会十全十美，你的下一个项目也许需要一个不同的框架，它的功能正好是你的项目所需要的。</p>
<p><strong>4. Research<br>4. 研究</strong><br>You&#8217;ve probably heard a lot of terminology and discussed in the context of PHP web development. From OOP to MVC, KISS to DRY, YAML to INI, even REST to XML-RPC, there are hundreds of technical concepts out there that could directly relate to your work. You may have formed a basic understanding of them, but do you really know what they are or what they mean for you? Spend some time doing real research; Wikipedia is a good place to start. You&#8217;re bound to learn something new.<br>在PHP网站开发过程和讨论中你可能听说过很多术语。从OOP到MVC,KISS到DRY,YAML到INI,甚至REST到XML-RPC，也许有数百个与你的工作直接相关的技术概念。你也许对它们有了一个基本的了解，但你真的了解它们到底是什么，对你有什么意义吗？花一点时间去做些实实在在的研究吧。Wikipedia是从事这些研究的很好的起点。你一定会从中学到一些新知识的。<br><span><strong><br>5. Learn OOP<br>5. 学习面向对象程序设计(OOP)</strong></span><br>Maybe this follows on a little from the previous point, but OOP is more important than you think. Do you really know about PHP5&#8217;s implementation OOP? For example, are you familiar with abstract classes, interfaces, the implements keyword, static methods and properties, the &#8216;protected&#8217; access modifier? Even many experienced PHP developers fall down in this area. If you make use of the features of OOP, you could save yourself a lot of development time.<br>这也许是上一个方法的继续，但是OOP比你想象的更重要。你真的了解PHP5中OOP的实现吗？例如，你真的了解抽象类，接口，&#8220;implements&#8221;关键字，静态方法和静态属性，访问修饰符&#8220;protected&#8221;吗？甚至许多有经验的开发人员都倒在这些问题的面前。如果你能充分利用OOP的特征，你就可以节省很多的开发时间。</p>
<p>So there you have it. Five, straightforward yet significant ways to be a better PHP developer.<br>就是这些了。五个成为更优秀的PHP开发者直接而又重要的的方法。<br><br><a href="http://www.phpinternals.com/">http://www.phpinternals.com/</a></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/5904.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-10-17 00:53 <a href="http://www.phpweblog.net/killjin/archive/2008/10/17/5904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是框架</title><link>http://www.phpweblog.net/killjin/archive/2008/10/14/5882.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Tue, 14 Oct 2008 15:39:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/10/14/5882.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5882.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/10/14/5882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5882.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5882.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=postmessage_70146>广义的讲，框架是用既定的基本结构去解决一个复杂的问题。<br>(A framework is a basic conceptual structure used to solve a complex issue.<a href="http://en.wikipedia.org/wiki/Framework" target=_blank>http://en.wikipedia.org/wiki/Framework</a>)<br><br>狭义的讲，软件框架就是一个软件系统再用性设计的开发模式。它是有一组抽象类及其贯彻实例整合成的一种特殊软件类型。一个软件框架通常包括支持程序和代码库，然后用脚本语言或其他软件将不同的组件结合起来去开发一个项目。框架内有各种接口(API)与外部组件连接。软件框架使用OO设计方法，但也可用非OO语言来实现。<br><br>(A software framework is a reusable design for a software system (or subsystem). This is expressed as a set of <br><a href="http://en.wikipedia.org/wiki/Abstract_class" target=_blank>abstract classes</a><br>and the way their instances collaborate for a specific type of software. Software frameworks can be <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" target=_blank>object-oriented designs</a>. Although designs don't have to be implemented in an <a href="http://en.wikipedia.org/wiki/Object-oriented_programming_language" target=_blank>object-oriented language</a>, they usually are. A software framework may include support programs, code <a href="http://en.wikipedia.org/wiki/Library_%28computer_science%29" target=_blank>libraries</a>, a <a href="http://en.wikipedia.org/wiki/Scripting_language" target=_blank>scripting language</a>, or other <a href="http://en.wikipedia.org/wiki/Software" target=_blank>software</a> to help develop and glue togetherthedifferent components of a software project. Various parts oftheframework may be exposed through an application programminginterface (<a href="http://en.wikipedia.org/wiki/Application_programming_interface" target=_blank>API</a>). <a href="http://en.wikipedia.org/wiki/Software_framework" target=_blank>http://en.wikipedia.org/wiki/Software_framework</a>)<br><br>从广义的角度来理解，其实很多人，只要开发了两个以上系统，都用了框架，包括那些反对用框架的人。简单来讲，你做新网站时，通常都是在复制老系统，然后修改代码，必要时加一些新功能。这时，你就用了框架，框架就是前一个系统!!!<br><br>从狭义的角度来理解，框架也有系统框架和模块框架之分。系统框架是整个系统采用框架结构，比如Zend Framework；具体的业务开发就在这框架下进行。模块框架是某个模块采用框架结构，公司里更多采用这种模式，比如数据库操作，分页操作，业务框架。框架可以自己开发也可以用现成的。<br><br>系统框架的开发也可用不同的模式，MVC是目前比较流行的模式。<br><br>有些人认为用框架就只是在选ZF，ThinkPHP 或者FleaPHP，有些人认为用框架就是用别人的东西，。。。。。。于是有人说好，有人说不好，。。。。。。<br><br>其实只要每人按照自己(或公司)的需要去选用或创建自己的框架，用框架的好处还是比较多的。<br><br>但对新手而言，不提倡用框架。</div>
<img src ="http://www.phpweblog.net/killjin/aggbug/5882.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-10-14 23:39 <a href="http://www.phpweblog.net/killjin/archive/2008/10/14/5882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是MVC</title><link>http://www.phpweblog.net/killjin/archive/2008/10/14/5881.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Tue, 14 Oct 2008 15:38:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/10/14/5881.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/5881.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/10/14/5881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/5881.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/5881.html</trackback:ping><description><![CDATA[<span id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<div class=title>模型－视图－控制器（MVC）是Xerox　PARC在八十年代为编程语言Smalltalk－80发明的一种软件设计模式，至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式，并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型－视图－控制器模式是一个有用的工具箱，它有很多好处，但也有一些缺点。</div>
<div class=content>
<p>MVC如何工作</p>
<p>MVC是一个设计模式，它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件：模型、视图、控制器。它们各自处理自己的任务。</p>
<p>视图<br>视图是用户看到并与之交互的界面。对老式的Web应用程序来说，视图就是由HTML元素组成的界面，在新式的Web应用程序中，HTML依旧在视图中扮演着重要的角色，但一些新的技术已层出不穷，它们包括Macromedia　Flash和象XHTML，XML/XSL，WML等一些标识语言和Web　services.</p>
<p>如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生，不管这些数据是联机存储的还是一个雇员列表，作为视图来讲，它只是作为一种输出数据并允许用户操纵的方式。</p>
<p>模型<br>模型表示企业数据和业务规则。在MVC的三个部件中，模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion　Components这样的构件对象来处理数据库。被模型返回的数据是中立的，就是说模型与数据格式无关，这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用，所以减少了代码的重复性。</p>
<p>控制器<br>控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时，控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求，然后用确定用哪个视图来显示模型处理返回的数据。</p>
<p>现在我们总结ＭVC的处理过程，首先控制器接收用户的请求，并决定应该调用哪个模型来进行处理，然后模型用业务逻辑来处理用户的请求并返回数据，最后控制器用相应的视图格式化模型返回的数据，并通过表示层呈现给用户。</p>
<p>为什么要使用 MVC</p>
<p>大部分Web应用程序都是用像ASP，PHP，或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来，但这通常不是很容易做到的，它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作，但是它给我们带来的好处是无庸质疑的。</p>
<p>首先，最重要的一点是多个视图能共享一个模型，正如我所提及的，现在需要用越来越多的方式来访问你的应用程序。对此，其中一个解决之道是使用MVC，无论你的用户想要Flash界面或是 WAP 界面；用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开，所以你可以最大化的重用你的代码了。</p>
<p>由于模型返回的数据没有进行格式化，所以同样的构件能被不同界面使用。例如，很多数据可能用HTML来表示，但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能，例如，基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。</p>
<p>因为模型是自包含的，并且与控制器和视图相分离，所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle，或者改变你的基于RDBMS数据源到LDAP，只需改变你的模型即可。一旦你正确的实现了模型，不管你的数据来自数据库或是LDAP服务器，视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立，改变其中一个不会影响其它两个，所以依据这种设计思想你能构造良好的松偶合的构件。</p>
<p>对我来说，控制器的也提供了一个好处，就是可以使用控制器来联接不同的模型和视图去完成用户的需求，这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图，控制器可以根据用户的需求选择模型进行处理，然后选择视图将处理结果显示给用户。</p>
<p>MVC的缺点<br>MVC的缺点是由于它没有明确的定义，所以完全理解MVC并不是很容易。使用MVC需要精心的计划，由于它的内部原理比较复杂，所以需要花费一些时间去思考。</p>
<p>你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序，同时由于模型和视图要严格的分离，这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试，你就可以毫无顾忌的重用它们了。</p>
<p>根据我个人经验，由于我们将一个应用程序分成了三个部件，所以使用MVC同时也意味着你将要管理比以前更多的文件，这一点是显而易见的。这样好像我们的工作量增加了，但是请记住这比起它所能带给我们的好处是不值一提。</p>
<p>MVC并不适合小型甚至中等规模的应用程序，花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。</p>
<p>MVC是一条创建软件的好途径<br>MVC设计模式是一个很好创建软件的途径，它所提倡的一些原则，像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件，你可能需要重新思考你的应用程序，尤其是应用程序的构架方面。如果你肯接受MVC，并且有能力应付它所带来的额外的工作和复杂性，MVC将会使你的软件在健壮性，代码重用和结构方面上一个新的台阶</p>
</div>
</span>
<img src ="http://www.phpweblog.net/killjin/aggbug/5881.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-10-14 23:38 <a href="http://www.phpweblog.net/killjin/archive/2008/10/14/5881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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><br>DISCUZ Username 重复：<br></p>
<div><span class=syntax><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> max(<span class="syntax_alpha syntax_alpha_identifier">uid)</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_alpha syntax_alpha_identifier">username</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_alpha syntax_alpha_functionName">count</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class=syntax_punct>*</span> <span class="syntax_punct syntax_punct_bracket_close_round">)</span> <span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">gg</span><br><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_quote syntax_quote_backtick">`cdb_members`</span> <br><span class="syntax_alpha syntax_alpha_reservedWord">GROUP</span> <span class="syntax_alpha syntax_alpha_reservedWord">BY</span> <span class="syntax_alpha syntax_alpha_identifier">username</span><br><span class="syntax_alpha syntax_alpha_reservedWord">ORDER</span> <span class="syntax_alpha syntax_alpha_reservedWord">BY</span> <span class="syntax_alpha syntax_alpha_identifier">gg</span> <span class="syntax_alpha syntax_alpha_reservedWord">DESC</span> <span class="syntax_white syntax_white_newline"></span><br><span class="syntax_alpha syntax_alpha_reservedWord">LIMIT</span> <span class="syntax_digit syntax_digit_integer">0</span> <span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_digit syntax_digit_integer">30</span></span> </div>
<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></channel></rss>