<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/WebFuns" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/WebFuns" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 08 Feb 2012 12:30:57 GMT</lastBuildDate><title>WebFuns------趣味互联网</title><description>LAMP is a lamp!</description><link>http://blog.webfuns.net</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><xhtml:meta name="robots" content="noindex"></xhtml:meta><language>en</language><pubDate>Wed, 08 Feb 2012 12:30:57 GMT</pubDate><item><title>this.length &gt;&gt;&gt; 0 的作用(Javascript)？</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603801391/5685392/1/item.html</link><content:encoded>&lt;p&gt;在Javascript代码有时候会看到this.length &amp;gt;&amp;gt;&amp;gt; 0 这样的类似代码，那么this.length &amp;gt;&amp;gt;&amp;gt; 0这样的代码有什么用呢？&lt;br /&gt;
要弄明白this.length &amp;gt;&amp;gt;&amp;gt; 0的作用，关键是要搞清楚 &amp;gt;&amp;gt;&amp;gt; 这个运算符是干什么的？&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt;在Javascript中代表无符号右移元算符，详细说明见：&lt;a href=&quot;http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp&quot;&gt;ECMAScript 位运算符&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://github.com&quot;&gt;Github&lt;/a&gt;问了 &lt;strong&gt;&lt;a href=&quot;https://github.com/lifesinger&quot;&gt;lifesinger&lt;/a&gt;&lt;/strong&gt;给出了一个this.length &amp;gt;&amp;gt;&amp;gt; 0 的作用更简易的总结&lt;strong&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有非数值转换成0&lt;/li&gt;
&lt;li&gt;所有大于等于 0 数取整数部分&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1398.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603801391/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603801391/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1398.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>在Javascript代码有时候会看到this.length &amp;#62;&amp;#62;&amp;#62; 0 这样的类似代码，那么this.length &amp;#62;&amp;#62;&amp;#62; 0这样的代码有什么用呢？ 要弄明白this.length &amp;#62;&amp;#62;&amp;#62; 0的作用，关键是要搞清楚 &amp;#62;&amp;#62;&amp;#62; 这个运算符是干什么的？ &amp;#62;&amp;#62;&amp;#62;在Javascript中代表无符号右移元算符，详细说明见：ECMAScript 位运算符。 在Github问了 lifesinger给出了一个this.length &amp;#62;&amp;#62;&amp;#62; 0 的作用更简易的总结： 所有非数值转换成0 所有大于等于 0 数取整数部分 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603801391/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603801391/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>seajs</category><category>LAMP</category><category>JavaScript</category><pubDate>Wed, 08 Feb 2012 20:30:57 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1398.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1398</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1398.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603801391/5685392</fs:itemid></item><item><title>初识Git</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411704/5685392/1/item.html</link><content:encoded>&lt;h3&gt;&lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt; ?&lt;/h3&gt;
&lt;p&gt;Git 是一个分布式的版本控制系统。Git现在应用很广，很多开源项目都使用Git（&lt;a title=&quot;social coding&quot; href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt;）进行代码管理。Git不同于SVN，Git所有版本信息可以保存在本地，所以可以离线使用，这样就避免了像SVN这样有中心服务器带来的单点问题，而且速度很快。&lt;/p&gt;
&lt;p&gt;Git诞生在Linux环境中，不过同样可以在window系统中使用，目前有两个开源项目在做这个个工作&lt;a href=&quot;https://code.google.com/p/msysgit/&quot;&gt;Msysgit&lt;/a&gt; 和 &lt;a href=&quot;https://code.google.com/p/tortoisegit/&quot;&gt;Tortoisegit&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.google.com/p/msysgit/&quot;&gt;https://code.google.com/p/msysgit/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.google.com/p/tortoisegit/&quot;&gt;https://code.google.com/p/tortoisegit/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;命令说明？&lt;/h3&gt;
&lt;h3&gt;&lt;img class=&quot; wp-image-1388&quot; title=&quot;关于Git很重要到一张图&quot; src=&quot;http://blog.webfuns.net/wp-content/uploads/2012/02/local-remote.png&quot; alt=&quot;关于Git很重要到一张图&quot; width=&quot;664&quot; height=&quot;545&quot; /&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://zh-cn.whygitisbetterthanx.com/&quot;&gt;http://zh-cn.whygitisbetterthanx.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://article.yeeyan.org/view/219474/204402&quot;&gt;http://article.yeeyan.org/view/219474/204402&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://files.cnblogs.com/phphuaibei/git%E6%90%AD%E5%BB%BA.pdf&quot;&gt;http://files.cnblogs.com/phphuaibei/git%E6%90%AD%E5%BB%BA.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://icyleaf.com/2010/09/apps-auto-deploy-with-git/&quot;&gt;http://icyleaf.com/2010/09/apps-auto-deploy-with-git/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://artori.us/git-github-usage/&quot;&gt;http://artori.us/git-github-usage/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://nathanj.github.com/gitguide/tour.html&quot;&gt;http://nathanj.github.com/gitguide/tour.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;http://nvie.com/posts/a-successful-git-branching-model/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rogerdudler.github.com/git-guide/&quot;&gt;http://rogerdudler.github.com/git-guide/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://progit.org/&quot;&gt;http://progit.org&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1379.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411704/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411704/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1379.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Git ? Git 是一个分布式的版本控制系统。Git现在应用很广，很多开源项目都使用Git（GitHub）进行代码管理。Git不同于SVN，Git所有版本信息可以保存在本地，所以可以离线使用，这样就避免了像SVN这样有中心服务器带来的单点问题，而且速度很快。 Git诞生在Linux环境中，不过同样可以在window系统中使用，目前有两个开源项目在做这个个工作Msysgit 和 Tortoisegit。 https://code.google.com/p/msysgit/ https://code.google.com/p/tortoisegit/ 命令说明？ 参考资料： http://zh-cn.whygitisbetterthanx.com/ http://article.yeeyan.org/view/219474/204402 http://files.cnblogs.com/phphuaibei/git%E6%90%AD%E5%BB%BA.pdf http://icyleaf.com/2010/09/apps-auto-deploy-with-git/ http://artori.us/git-github-usage/ http://nathanj.github.com/gitguide/tour.html http://nvie.com/posts/a-successful-git-branching-model/ http://rogerdudler.github.com/git-guide/ http://progit.org 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411704/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411704/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>git</category><category>github</category><category>LAMP</category><pubDate>Tue, 07 Feb 2012 19:38:21 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1379.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1379</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1379.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411704/5685392</fs:itemid></item><item><title>DNS预获取（dns-prefetch）</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411705/5685392/1/item.html</link><content:encoded>&lt;p&gt;今天翻看twitter的源码的时候看到了一下内容：&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://a0.twimg.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://a1.twimg.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://a2.twimg.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://a3.twimg.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://api.twitter.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;查阅了相关资料，知道DNS Prefetch也就是DNS预获取，也是前段优化的一部分。在前段优化中关于DNS的有两点：一是减少DNS的请求次数，第二个就是进行DNS预先获取。&lt;/p&gt;
&lt;p&gt;DNS Prefetch 已经被下面的浏览器支持&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox: 3.5+&lt;/li&gt;
&lt;li&gt;Chrome: Supported&lt;/li&gt;
&lt;li&gt;Safari 5+&lt;/li&gt;
&lt;li&gt;Opera: Unknown&lt;/li&gt;
&lt;li&gt;IE: 9 (called “Pre-resolution” on blogs.msdn.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;默认情况下浏览器会对页面中和当前域名（正在浏览网页的域名）不在同一个域的域名进行预获取，并且缓存结果，这就是隐式的DNS Prefetch。如果想对页面中没有出现的域进行预获取，那么就要使用显示的DNS　Prefetch了，也就是使用link标签：&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;link rel=”dns-prefetch” href=”http://api.twitter.com”/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;DNS Prefetch应该尽量的放在网页的前面，推荐放在&amp;lt;meta charset=”/&amp;gt;后面。&lt;/p&gt;
&lt;p&gt;PS:可以通过下面的标签禁止隐式的DNS Prefetch。&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;meta http-equiv=”x-dns-prefetch-control” content=”off”&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;内容整理自：&lt;a href=&quot;https://github.com/h5bp/html5-boilerplate/wiki/DNS-Prefetching&quot;&gt;DNS-Prefetching&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考：&lt;br /&gt;
&lt;a href=&quot;http://www.dbanotes.net/web/dns_prefetching.html&quot;&gt;网站优化应重视 DNS 预获取(DNS Prefetching)&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1357.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411705/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411705/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1357.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>今天翻看twitter的源码的时候看到了一下内容： &amp;#60;link rel=”dns-prefetch” href=”http://a0.twimg.com”/&amp;#62; &amp;#60;link rel=”dns-prefetch” href=”http://a1.twimg.com”/&amp;#62; &amp;#60;link rel=”dns-prefetch” href=”http://a2.twimg.com”/&amp;#62; &amp;#60;link rel=”dns-prefetch” href=”http://a3.twimg.com”/&amp;#62; &amp;#60;link rel=”dns-prefetch” href=”http://api.twitter.com”/&amp;#62; 查阅了相关资料，知道DNS Prefetch也就是DNS预获取，也是前段优化的一部分。在前段优化中关于DNS的有两点：一是减少DNS的请求次数，第二个就是进行DNS预先获取。 DNS Prefetch 已经被下面的浏览器支持 Firefox: 3.5+ Chrome: Supported Safari 5+ Opera: Unknown IE: 9 (called “Pre-resolution” on blogs.msdn.com) 默认情况下浏览器会对页面中和当前域名（正在浏览网页的域名）不在同一个域的域名进行预获取，并且缓存结果，这就是隐式的DNS Prefetch。如果想对页面中没有出现的域进行预获取，那么就要使用显示的DNS　Prefetch了，也就是使用link标签： &amp;#60;link rel=”dns-prefetch” href=”http://api.twitter.com”/&amp;#62; DNS Prefetch应该尽量的放在网页的前面，推荐放在&amp;#60;meta charset=”/&amp;#62;后面。 PS:可以通过下面的标签禁止隐式的DNS Prefetch。 &amp;#60;meta http-equiv=”x-dns-prefetch-control” content=”off”&amp;#62; 内容整理自：DNS-Prefetching 参考： 网站优化应重视 DNS 预获取(DNS Prefetching) 评论&amp;#124; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603411705/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411705/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>DNS</category><category>LAMP</category><pubDate>Mon, 16 Jan 2012 22:02:08 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1357.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1357</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1357.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411705/5685392</fs:itemid></item><item><title>如何设置一个严格30分钟过期的Session</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411706/5685392/1/item.html</link><content:encoded>&lt;p&gt;问题是&lt;a href=&quot;http://t.sina.com.cn/laruence&quot;&gt;Laruence&lt;/a&gt;在微博上提出的:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识多着呢, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;说实话，如果是面试我的话，我回答不好。我找了一下stackoverflow发现有人讨论过同样的问题，&lt;a href=&quot;http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes&quot;&gt;How do I expire a PHP session after 30 minutes?&lt;/a&gt;，看了一下&lt;a href=&quot;http://stackoverflow.com/users/53114/gumbo&quot;&gt;Gumbo&lt;/a&gt;回复应该是最好的。过了不久Laruence也整理了一篇&lt;a href=&quot;http://www.laruence.com/2012/01/10/2469.html&quot;&gt;文章&lt;/a&gt;，讲的更全面一些。 Gumbo说的对，要回到好这个问题只要弄清楚&lt;strong&gt;&lt;a href=&quot;http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime&quot;&gt;session.gc_maxlifetime&lt;/a&gt;&lt;/strong&gt;和&lt;strong&gt;&lt;strong&gt;&lt;a href=&quot;http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime&quot;&gt;session.cookie_lifetime&lt;/a&gt;&lt;/strong&gt;&lt;/strong&gt;这两个配置的原理就可以了。 &lt;strong&gt;session.gc_maxlifetime&lt;/strong&gt;这个时间是指的Session过多少时间会被session GC回收。这里需要主要以下几点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GC启动本身是有概率的（ &lt;a href=&quot;http://www.php.net/manual/en/session.configuration.php#ini.session.gc-probability&quot;&gt;session.gc_probability&lt;/a&gt;和&lt;a href=&quot;http://www.php.net/manual/en/session.configuration.php#ini.session.gc-divisor&quot;&gt;session.gc_divisor&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据，则具有最小数值的脚本会清理数据。此情况下，与 session.save_path 一起使用本指令&lt;/li&gt;
&lt;li&gt;GC和这个时间比较的时候是用的sesssion文件的mtime（ &amp;gt;PHP 4.2.3）而不是atime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;session.cookie_lifetime&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个是Server发送给浏览器的cookie过期时间&lt;/p&gt;
&lt;p&gt;所以只要明白了这两个配置的原理，那么这个问题至少会回答及格（我认为）。&lt;/p&gt;
&lt;p&gt;所以手册很重要，不管是哪种技术，如果把手册研究一篇，搞懂80%以上，那么不是大牛也是个高级工程师鸟。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1329.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411706/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411706/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1329.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>问题是Laruence在微博上提出的: 我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识多着呢, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵 说实话，如果是面试我的话，我回答不好。我找了一下stackoverflow发现有人讨论过同样的问题，How do I expire a PHP session after 30 minutes?，看了一下Gumbo回复应该是最好的。过了不久Laruence也整理了一篇文章，讲的更全面一些。 Gumbo说的对，要回到好这个问题只要弄清楚session.gc_maxlifetime和session.cookie_lifetime这两个配置的原理就可以了。 session.gc_maxlifetime这个时间是指的Session过多少时间会被session GC回收。这里需要主要以下几点 GC启动本身是有概率的（ session.gc_probability和session.gc_divisor） 不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据，则具有最小数值的脚本会清理数据。此情况下，与 session.save_path 一起使用本指令 GC和这个时间比较的时候是用的sesssion文件的mtime（ &amp;#62;PHP 4.2.3）而不是atime session.cookie_lifetime 这个是Server发送给浏览器的cookie过期时间 所以只要明白了这两个配置的原理，那么这个问题至少会回答及格（我认为）。 所以手册很重要，不管是哪种技术，如果把手册研究一篇，搞懂80%以上，那么不是大牛也是个高级工程师鸟。 &amp;#160; 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411706/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411706/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>PHP基础</category><category>LAMP</category><pubDate>Tue, 10 Jan 2012 23:35:45 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1329.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1329</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1329.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411706/5685392</fs:itemid></item><item><title>MySQL中得到当前使用的数据库</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411707/5685392/1/item.html</link><content:encoded>&lt;p&gt;在MySQL中用use 切换使用的数据库（或者在PHP中用mysql_select_db函数)，反过来我们怎样知道正在使用的是哪个数据库呢？&lt;/p&gt;
&lt;p&gt;这种需求很少遇到，但是还是会遇到的：）&lt;/p&gt;
&lt;p&gt;所以找了一下，发现MySQL可以通过&lt;span style=&quot;color: #0000ff;&quot;&gt;select databse()&lt;/span&gt;命令来查看当前使用的数据库。&lt;/p&gt;
&lt;p&gt;ps:&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_database&quot;&gt;MySQL database函数&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐：&lt;a href=&quot;http://techcrunch.com/2011/11/11/start-making-sense/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29&quot;&gt;Stop Making Apps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;再搭车推荐：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;《他们在毕业的前一天爆炸 》《听说》《那些年，我们一起追的女孩》值得一看&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1320.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411707/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411707/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1320.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>在MySQL中用use 切换使用的数据库（或者在PHP中用mysql_select_db函数)，反过来我们怎样知道正在使用的是哪个数据库呢？ 这种需求很少遇到，但是还是会遇到的：） 所以找了一下，发现MySQL可以通过select databse()命令来查看当前使用的数据库。 ps:MySQL database函数 推荐：Stop Making Apps 再搭车推荐： 《他们在毕业的前一天爆炸 》《听说》《那些年，我们一起追的女孩》值得一看 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411707/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411707/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>MySQL</category><category>LAMP</category><pubDate>Thu, 05 Jan 2012 20:38:06 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1320.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1320</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1320.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411707/5685392</fs:itemid></item><item><title>让2012来的更猛烈些吧</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411708/5685392/1/item.html</link><content:encoded>&lt;p&gt;好吧，2012真的要来了！&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;除了上面一句，一下内容算流水账一类的内容了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;对我而言，2011年如果用一个词来描述的话，我想应该是‘初来乍到’，最大的感受就是“不容易”，关键词是“实习、毕业、父母、工作”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2011年的时间线&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2011年1月8日，考完试我就来到了北京想找一个实习机会。因为大四下学期基本上没有什么课程了，主要就是实习，考试前已经有同学去寻找实习机会了。毕竟是初生牛犊，来北京是慎重考虑的结果，而且做好了各种准备，准备了两个月左右的生活费（来之前问过一些在北京的朋友，一个月生活费，省着点的话大概2000左右），联系了一些在北京的朋友必要时提供一些帮助。来到之后，随便找了一个房子（其实是地下室吧），买了些生活必需品，之后的事情就是找工作了。经历了多次面试之后，最后决定去&lt;a href=&quot;http://www.mengmai.com&quot;&gt;猛买&lt;/a&gt;实习，其实在猛买不像是实习，更像是正式工作，学到了很多东西。因为自己初来乍到也犯过很多错误。&lt;/p&gt;
&lt;p&gt;2011年5月下旬，因为最后的毕业答辩要回到学校才行，随启程返回烟台。之后一个月就是各种搞论文、各种聚会、各种玩了，那是另外一个故事了，一直想写一下最后的那一个月的生活，以后有可能再补上吧！&lt;/p&gt;
&lt;p&gt;2011年6月10日，处理完学校的事情之后回到北京，来之前我已经给&lt;a href=&quot;http://www.zyzhang.com&quot;&gt;张总&lt;/a&gt;发了一封离职邮件说明一下。所以接下来又要重新找工作，这次面试的都是一些稍大些的公司，经过一月左右的尝试，最后选择了&lt;a href=&quot;http://www.hunantv.com&quot;&gt;金鹰网&lt;/a&gt;（2011年7月12日）。&lt;/p&gt;
&lt;p&gt;接下来是两个月安稳时期，应是在8月初，部门经理跟我说我们部门要搬到长沙去，金鹰网北京这边应该算是一个办事处，大部队是在长沙那边，当时我的同意去长沙，毕竟年多走一些地方，长长见识是好的。&lt;/p&gt;
&lt;p&gt;于是乎8月下旬迁往长沙，到长沙不到一周，我姐打来电话说我爸得了食道癌，当时听了之后，我一时真不知道应该怎么办了，下午跟部门经理请了两周的假。我爸得病的事突如其来，对我的打击很大，当时回济南以后就是安排老人到济南做手术，医生说如果不做手术两三个月后就不能吃东西了（其实当时吞咽已经有困难了），之后20多天就是在医院照顾父亲，值得庆幸的是父亲手术很成功。在 那20天了哭了很多次，想了很多的事情，有很多感触。&lt;/p&gt;
&lt;p&gt;2011年10月4日回到长沙，基于当时父亲的情况，我不想走远了。和部门经理商量之后准备回北京。&lt;/p&gt;
&lt;p&gt;2011年10月中旬再次回到北京。&lt;/p&gt;
&lt;p&gt;毕业第一年走的不是很顺利，但这样已经很好了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感受&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无力，这一年我感到前所未有的无力感，太弱小，很多东西无法改变（也是我不够努力）。&lt;/li&gt;
&lt;li&gt;人生最重要的是健康快乐，对于我们做IT的人更是如此，要多锻炼，少熬夜！&lt;/li&gt;
&lt;li&gt;坚持真的很重要，永远不要放弃。&lt;/li&gt;
&lt;li&gt;学海无涯，技术、生活、感情各个方面都有学不完的知识&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;收获&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对自己的认识深了一层，知道自己真正想要什么东西了，其实内心一直知道自己想要什么，只不过自己不知道。&lt;/p&gt;
&lt;p&gt;买了kindle，读书多了起来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2012年&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;希望爸妈、姐、侄女可以健健康康、平平安安！&lt;/li&gt;
&lt;li&gt;自己可以有所作为&lt;/li&gt;
&lt;li&gt;走更多的地方，认识更多的朋友&lt;/li&gt;
&lt;li&gt;可以赚更多的钱&lt;/li&gt;
&lt;li&gt;脱光&lt;/li&gt;
&lt;li&gt;玛雅预言失败&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;附：&lt;br /&gt;
&lt;a title=&quot;回顾09展望10&quot; href=&quot;http://blog.webfuns.net/archives/414.html&quot;&gt;2009总结&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1290.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411708/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411708/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1290.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>好吧，2012真的要来了！ 除了上面一句，一下内容算流水账一类的内容了。 对我而言，2011年如果用一个词来描述的话，我想应该是‘初来乍到’，最大的感受就是“不容易”，关键词是“实习、毕业、父母、工作”。 2011年的时间线 2011年1月8日，考完试我就来到了北京想找一个实习机会。因为大四下学期基本上没有什么课程了，主要就是实习，考试前已经有同学去寻找实习机会了。毕竟是初生牛犊，来北京是慎重考虑的结果，而且做好了各种准备，准备了两个月左右的生活费（来之前问过一些在北京的朋友，一个月生活费，省着点的话大概2000左右），联系了一些在北京的朋友必要时提供一些帮助。来到之后，随便找了一个房子（其实是地下室吧），买了些生活必需品，之后的事情就是找工作了。经历了多次面试之后，最后决定去猛买实习，其实在猛买不像是实习，更像是正式工作，学到了很多东西。因为自己初来乍到也犯过很多错误。 2011年5月下旬，因为最后的毕业答辩要回到学校才行，随启程返回烟台。之后一个月就是各种搞论文、各种聚会、各种玩了，那是另外一个故事了，一直想写一下最后的那一个月的生活，以后有可能再补上吧！ 2011年6月10日，处理完学校的事情之后回到北京，来之前我已经给张总发了一封离职邮件说明一下。所以接下来又要重新找工作，这次面试的都是一些稍大些的公司，经过一月左右的尝试，最后选择了金鹰网（2011年7月12日）。 接下来是两个月安稳时期，应是在8月初，部门经理跟我说我们部门要搬到长沙去，金鹰网北京这边应该算是一个办事处，大部队是在长沙那边，当时我的同意去长沙，毕竟年多走一些地方，长长见识是好的。 于是乎8月下旬迁往长沙，到长沙不到一周，我姐打来电话说我爸得了食道癌，当时听了之后，我一时真不知道应该怎么办了，下午跟部门经理请了两周的假。我爸得病的事突如其来，对我的打击很大，当时回济南以后就是安排老人到济南做手术，医生说如果不做手术两三个月后就不能吃东西了（其实当时吞咽已经有困难了），之后20多天就是在医院照顾父亲，值得庆幸的是父亲手术很成功。在 那20天了哭了很多次，想了很多的事情，有很多感触。 2011年10月4日回到长沙，基于当时父亲的情况，我不想走远了。和部门经理商量之后准备回北京。 2011年10月中旬再次回到北京。 毕业第一年走的不是很顺利，但这样已经很好了。 感受 无力，这一年我感到前所未有的无力感，太弱小，很多东西无法改变（也是我不够努力）。 人生最重要的是健康快乐，对于我们做IT的人更是如此，要多锻炼，少熬夜！ 坚持真的很重要，永远不要放弃。 学海无涯，技术、生活、感情各个方面都有学不完的知识 收获 对自己的认识深了一层，知道自己真正想要什么东西了，其实内心一直知道自己想要什么，只不过自己不知道。 买了kindle，读书多了起来。 2012年 希望爸妈、姐、侄女可以健健康康、平平安安！ 自己可以有所作为 走更多的地方，认识更多的朋友 可以赚更多的钱 脱光 玛雅预言失败 附： 2009总结 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411708/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411708/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>快乐生活</category><category>总结</category><pubDate>Sat, 31 Dec 2011 23:59:45 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1290.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1290</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1290.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411708/5685392</fs:itemid></item><item><title>关于CSDN用户数据泄露的一些思考</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411709/5685392/1/item.html</link><content:encoded>&lt;p&gt;“有很多用户的密码在网上飘荡，而且它还是明文的”&lt;/p&gt;
&lt;p&gt;CSDN 600万的用户信息（用户名、密码和邮箱）泄露了，而且密码是明文存储的。之后又爆出了人人、多玩等众多网站的用户信息也被泄露了。当然这只是黑客门放出的一部分信息，只是冰山一角，不过管中窥豹可以知道现在互联网是多么的不安全，多么的没有隐私，翻开手机看看手机里的那些垃圾短息吧！还有接到的那些很多莫名其妙的电话。&lt;/p&gt;
&lt;p&gt;毋庸置疑互联网时代安全是一个大问题，但是互联网的安全性和开放性始终一对矛盾，在一个开发的系统中想实现绝对的安全似乎是不可能的。在2011年的尾巴上的这次信息泄露事件，从另一侧面来看反而是一件好事，无论对于网站开发人员还是最终用户，大家的安全意识应该在这次事件中有一个提高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何保证信息的安全?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(1) 加密算法的选择&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://zh.wikipedia.org/wiki/MD5#Security&quot;&gt;MD5&lt;/a&gt;、&lt;a href=&quot;http://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F&quot;&gt;SHA&lt;/a&gt;、&lt;a href=&quot;http://coolshell.cn/articles/2078.html&quot;&gt;Bcrypt() &lt;/a&gt;、PHK、SRP等究竟应该选择哪一个算法比较安全。&lt;a title=&quot;Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes&quot; href=&quot;http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html&quot;&gt;这里&lt;/a&gt;做了一个关于Bcrypt 、PHK、SRP的讨论，作者指出一个越快的加密算法越不安全，快即意味着破解或者攻击所需要的时间也会减少，所以选择加密算法加密速度是一个考虑的因素，作者最后推荐的加密算法是Bcrypt。&lt;/p&gt;
&lt;p&gt;牛逼、并且最靠谱的方法可能是自己开发一个加密算法、当然开发的算法强度至少要达到MD5，然后要严格保密这种加密算法（这又是个问题），那么被破解的概率就要小很多了。&lt;/p&gt;
&lt;p&gt;还有一点就是选择常用的加密方法，虽然是一个笨得思路，但也许能起到一些作用。毕竟现在最完备的字典应该是MD5的，如果采用非MD5的加密方法，那么被字典攻击的时间消耗就要更长一些。&lt;/p&gt;
&lt;p&gt;更多关于加密算法选择的讨论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/2235158/php-sha1-vs-md5-vs-sha256-which-to-use-for-a-php-login&quot;&gt;(PHP) SHA1 vs md5 vs SHA256: which to use for a PHP login?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codahale.com/how-to-safely-store-a-password/&quot;&gt;How To Safely Store A Password&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（2）如何加密&lt;/p&gt;
&lt;p&gt;对于用户密码来说一般都是单向加密，加密时一定要加salt，而且要每一个用户一个salt，这样就会大大的增加字典破解的难度，如果选用MD5这种快速加密方法，推荐至少加密两次。&lt;/p&gt;
&lt;p&gt;(3)强制用户使用复杂密码，这一招也很有用&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用户应该怎样管理自己的密码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2009年的时候写过一篇关于&lt;a href=&quot;http://blog.webfuns.net/archives/409.html&quot;&gt;密码管理&lt;/a&gt;的文章，这里不再重复了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关于安全问题的讨论&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php&quot;&gt;How do you use bcrypt for hashing passwords in PHP?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hi.baidu.com/caoz/blog/item/edcc36d3f812891e3af3cf28.html&quot;&gt;谈谈近期的安全事件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;strong&gt;相关网站&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title=&quot;OWASP Guide Project&quot; href=&quot;https://www.owasp.org/index.php/Category:OWASP_Guide_Project&quot;&gt;OWASP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;自由平等的漏洞报告平台&quot; href=&quot;http://www.wooyun.org/&quot;&gt;WooYun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;PS:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;今天又发现天涯4000万的用户数据，又是明文存储。不过事件的发展越来越阴谋论了，互联网在这里真好玩。（update: 2011-12-25)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;未完待续···&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1259.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411709/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411709/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1259.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>“有很多用户的密码在网上飘荡，而且它还是明文的” CSDN 600万的用户信息（用户名、密码和邮箱）泄露了，而且密码是明文存储的。之后又爆出了人人、多玩等众多网站的用户信息也被泄露了。当然这只是黑客门放出的一部分信息，只是冰山一角，不过管中窥豹可以知道现在互联网是多么的不安全，多么的没有隐私，翻开手机看看手机里的那些垃圾短息吧！还有接到的那些很多莫名其妙的电话。 毋庸置疑互联网时代安全是一个大问题，但是互联网的安全性和开放性始终一对矛盾，在一个开发的系统中想实现绝对的安全似乎是不可能的。在2011年的尾巴上的这次信息泄露事件，从另一侧面来看反而是一件好事，无论对于网站开发人员还是最终用户，大家的安全意识应该在这次事件中有一个提高。 如何保证信息的安全? (1) 加密算法的选择 MD5、SHA、Bcrypt() 、PHK、SRP等究竟应该选择哪一个算法比较安全。这里做了一个关于Bcrypt 、PHK、SRP的讨论，作者指出一个越快的加密算法越不安全，快即意味着破解或者攻击所需要的时间也会减少，所以选择加密算法加密速度是一个考虑的因素，作者最后推荐的加密算法是Bcrypt。 牛逼、并且最靠谱的方法可能是自己开发一个加密算法、当然开发的算法强度至少要达到MD5，然后要严格保密这种加密算法（这又是个问题），那么被破解的概率就要小很多了。 还有一点就是选择常用的加密方法，虽然是一个笨得思路，但也许能起到一些作用。毕竟现在最完备的字典应该是MD5的，如果采用非MD5的加密方法，那么被字典攻击的时间消耗就要更长一些。 更多关于加密算法选择的讨论： (PHP) SHA1 vs md5 vs SHA256: which to use for a PHP login? How To Safely Store A Password （2）如何加密 对于用户密码来说一般都是单向加密，加密时一定要加salt，而且要每一个用户一个salt，这样就会大大的增加字典破解的难度，如果选用MD5这种快速加密方法，推荐至少加密两次。 (3)强制用户使用复杂密码，这一招也很有用 用户应该怎样管理自己的密码 2009年的时候写过一篇关于密码管理的文章，这里不再重复了。 关于安全问题的讨论 How do you use bcrypt for hashing passwords in PHP? 谈谈近期的安全事件 相关网站 OWASP WooYun PS: 今天又发现天涯4000万的用户数据，又是明文存储。不过事件的发展越来越阴谋论了，互联网在这里真好玩。（update: 2011-12-25) [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603411709/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411709/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>CSDN</category><category>安全</category><category>LAMP</category><pubDate>Thu, 22 Dec 2011 20:25:14 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1259.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1259</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1259.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411709/5685392</fs:itemid></item><item><title>SQL中LIKE的另类玩法</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411710/5685392/1/item.html</link><content:encoded>&lt;p&gt;设想一个场景，我有个关键词屏蔽词库（应该很多网站都有吧），所有的关键词都存储在MySQL中，怎样查询某个字符串是否含有屏蔽关键词？&lt;/p&gt;
&lt;p&gt;比如我们有一个屏蔽词 tom，要屏蔽任何含有tom的词语。&lt;/p&gt;
&lt;p&gt;通常情况下LIKE这样用&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;SELECT * FROM `table` WHERE field LIKE &amp;#8217;%字符串%&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;下面我们这样玩，来解决上面的问题&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;SELECT * FROM `table` WHERE &amp;#8216;字符串&amp;#8217; LIKE CONCAT(&amp;#8216;%&amp;#8217;,field,&amp;#8217;%')&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;PS:&lt;/p&gt;
&lt;p&gt;这让我想起了初中时数学课中经常用来做几何证明的逆向思考方式。&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1254.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411710/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411710/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1254.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>设想一个场景，我有个关键词屏蔽词库（应该很多网站都有吧），所有的关键词都存储在MySQL中，怎样查询某个字符串是否含有屏蔽关键词？ 比如我们有一个屏蔽词 tom，要屏蔽任何含有tom的词语。 通常情况下LIKE这样用 SELECT * FROM `table` WHERE field LIKE &amp;#8217;%字符串%&amp;#8217; 下面我们这样玩，来解决上面的问题 SELECT * FROM `table` WHERE &amp;#8216;字符串&amp;#8217; LIKE CONCAT(&amp;#8216;%&amp;#8217;,field,&amp;#8217;%') PS: 这让我想起了初中时数学课中经常用来做几何证明的逆向思考方式。 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411710/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411710/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>MySQL</category><category>LAMP</category><pubDate>Wed, 21 Dec 2011 19:48:27 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1254.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1254</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1254.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411710/5685392</fs:itemid></item><item><title>seajs 使js开发模块化</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411711/5685392/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;seajs.com&quot;&gt;seajs&lt;/a&gt;一个js类库，主要实现对js的模块化开发。&lt;/p&gt;
&lt;p&gt;对于一个大项目或者是一个需要团队协作的项目，模块化开发&lt;/p&gt;
&lt;p&gt;可以使得对代码的管理更规范和高效。seajs就是为了满足这种需求来的。&lt;/p&gt;
&lt;p&gt;不过我个人可能会更需要js可以按需加载，因为有些类库不是所有的页面都&lt;/p&gt;
&lt;p&gt;需要的，我的预期是js类库只有在需要的时候才去加载。&lt;/p&gt;
&lt;p&gt;seajs可以通过require.async来实现按需加载。&lt;/p&gt;
&lt;p&gt;最近在关注HTML5、CSS3的相关内容，这两个东西确实会给我们带来很不一样的体验。&lt;/p&gt;
&lt;p&gt;还有js也很活跃，后端出了&lt;a href=&quot;http://nodejs.org/&quot;&gt;nodejs&lt;/a&gt;，前段有各种基础类库，还有MVC框架。&lt;/p&gt;
&lt;p&gt;还有在js上发展起来的新语言&lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt; coffee script&lt;/a&gt;和&lt;a href=&quot;http://www.dartlang.org/ &quot;&gt;dart&lt;/a&gt;,令人目不暇接。&lt;/p&gt;
&lt;p&gt;确实很多东西(&lt;a href=&quot;http://www.zhihu.com/question/19938648&quot;&gt;以论坛为主的网站将如何转型？&lt;/a&gt;)需要从底层变革一下了，因为他们周围的东西已经变了。&lt;/p&gt;
&lt;p&gt;矛盾促使了这样的变革和发展。&lt;/p&gt;
&lt;p&gt;更多内容：seajs.com&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1246.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411711/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411711/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1246.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>seajs一个js类库，主要实现对js的模块化开发。 对于一个大项目或者是一个需要团队协作的项目，模块化开发 可以使得对代码的管理更规范和高效。seajs就是为了满足这种需求来的。 不过我个人可能会更需要js可以按需加载，因为有些类库不是所有的页面都 需要的，我的预期是js类库只有在需要的时候才去加载。 seajs可以通过require.async来实现按需加载。 最近在关注HTML5、CSS3的相关内容，这两个东西确实会给我们带来很不一样的体验。 还有js也很活跃，后端出了nodejs，前段有各种基础类库，还有MVC框架。 还有在js上发展起来的新语言 coffee script和dart,令人目不暇接。 确实很多东西(以论坛为主的网站将如何转型？)需要从底层变革一下了，因为他们周围的东西已经变了。 矛盾促使了这样的变革和发展。 更多内容：seajs.com 评论&amp;#124; 作者: tomheng 85159e08d5f1f50d244825cb03e92c65&lt;img src=&quot;http://www1.feedsky.com/t1/603411711/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411711/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>seajs</category><category>LAMP</category><category>JavaScript</category><pubDate>Sun, 11 Dec 2011 23:33:31 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1246.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1246</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1246.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411711/5685392</fs:itemid></item><item><title>在什么场景下使用闭包？</title><link>http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411712/5685392/1/item.html</link><content:encoded>&lt;p&gt;在需要把逻辑封装到自己的范围内的情况下，闭包会十分有用。重构旧代码以进行简化并提高可读性就是这样一个例子。查看以下示例，该示例显示了在运行一些 SQL 查询时使用的记录程序。&lt;/p&gt;
&lt;div class=&quot;codecolorer-container php blackboard&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;&quot;&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;&quot;&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class=&quot;php codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;//记录 SQL 查询的代码&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/mysqli_connect&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;mysqli_connect&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;pass&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
Logger&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;a href=&quot;http://www.php.net/log&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;log&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'debug'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'database'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Connected to database'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'insert into parts (part, description) values ('&lt;/span&gt;Hammer&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Pounds nails&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
Logger::log('&lt;/span&gt;debug&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;database&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Insert Hammer into to parts table&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
$db-&amp;gt;query('&lt;/span&gt;insert into parts &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;part&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; description&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; values &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Drill'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Puts holes in wood'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
Logger&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;a href=&quot;http://www.php.net/log&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;log&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'debug'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'database'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Insert Drill into to parts table'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'insert into parts (part, description) values ('&lt;/span&gt;Saw&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Cuts wood&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
Logger::log('&lt;/span&gt;debug&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;database&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Insert Saw into to parts table&lt;span style=&quot;color: #0000ff;&quot;&gt;');&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;可以看出执行操作的重复程度。对 Logger::log() 执行的每次调用都有相同的前两个实参。为了解决此问题，我们可以把该方法调用放入闭包并转而针对该闭包执行调用。得到的代码如下所示：&lt;/p&gt;
&lt;div class=&quot;codecolorer-container php blackboard&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;&quot;&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;&quot;&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class=&quot;php codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;//记录 SQL 查询的重构代码&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$logdb&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$string&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; Logger&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;a href=&quot;http://www.php.net/log&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;log&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'debug'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'database'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$string&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;a href=&quot;http://www.php.net/mysqli_connect&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;mysqli_connect&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;pass&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$logdb&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Connected to database'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'insert into parts (part, description) values ('&lt;/span&gt;Hammer&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Pounds nails&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
$logdb('&lt;/span&gt;Insert Hammer into to parts table&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
$db-&amp;gt;query('&lt;/span&gt;insert into parts &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;part&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; description&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; values &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Drill'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Puts holes in wood'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$logdb&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'Insert Drill into to parts table'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #000088;&quot;&gt;$db&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;'insert into parts (part, description) values ('&lt;/span&gt;Saw&lt;span style=&quot;color: #0000ff;&quot;&gt;','&lt;/span&gt;Cuts wood&lt;span style=&quot;color: #0000ff;&quot;&gt;'); &lt;br /&gt;
$logdb('&lt;/span&gt;Insert Saw into to parts table&lt;span style=&quot;color: #0000ff;&quot;&gt;');&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;整理自：http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new2/&lt;br /&gt;
PS:原文有些不正确的地方，比方说到PHP 5.3.5都不可以通过闭包中的this指针访问类内的成员变量（当然可以通过其他方法实现），文章大部分内容正确，还是“尽信书不如无书”。&lt;/p&gt;
&lt;hr/&gt;&lt;small&gt;&lt;a href=&quot;http://blog.webfuns.net/archives/1238.html#comments&quot; title=&quot;评论&quot;&gt;评论&lt;/a&gt;| 作者: &lt;a href=&quot;http://blog.webfuns.net&quot; &gt;tomheng&lt;/a&gt; 85159e08d5f1f50d244825cb03e92c65&lt;/small&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603411712/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411712/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.webfuns.net/archives/1238.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>在需要把逻辑封装到自己的范围内的情况下，闭包会十分有用。重构旧代码以进行简化并提高可读性就是这样一个例子。查看以下示例，该示例显示了在运行一些 SQL 查询时使用的记录程序。 12345678910//记录 SQL 查询的代码&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $db = mysqli_connect&amp;#40;&amp;#34;server&amp;#34;,&amp;#34;user&amp;#34;,&amp;#34;pass&amp;#34;&amp;#41;; Logger::log&amp;#40;'debug','database','Connected to database'&amp;#41;; $db-&amp;#62;query&amp;#40;'insert into parts (part, description) values ('Hammer','Pounds nails'); Logger::log('debug','database','Insert Hammer into to parts table'); $db-&amp;#62;query('insert into parts &amp;#40;part, description&amp;#41; values &amp;#160; &amp;#160; &amp;#160; &amp;#40;'Drill','Puts holes in wood'&amp;#41;; Logger::log&amp;#40;'debug','database','Insert Drill into to parts table'&amp;#41;; $db-&amp;#62;query&amp;#40;'insert into parts [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603411712/WebFuns/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/WebFuns/~8160389/603411712/5685392/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>闭包</category><category>PHP</category><category>LAMP</category><pubDate>Wed, 07 Dec 2011 14:38:17 +0800</pubDate><author>tomheng</author><comments>http://blog.webfuns.net/archives/1238.html#comments</comments><guid isPermaLink="false">http://blog.webfuns.net/?p=1238</guid><dc:creator>tomheng</dc:creator><fs:srclink>http://blog.webfuns.net/archives/1238.html</fs:srclink><fs:srcfeed>http://blog.webfuns.net/feed</fs:srcfeed><fs:itemid>feedsky/WebFuns/~8160389/603411712/5685392</fs:itemid></item></channel></rss>
