﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title>梁龙的博客</title>
<link>http://www.lianglong.org</link>
<description></description>
<language>zh-cn</language>
<copyright>粤ICP备08127484号  Copyright 梁龙的博客 www.lianglong.org  All Rights Reserved. Power by lianglong . Version:Demo


</copyright>
<pubDate>May 21,2012  22:19:00</pubDate>
<generator>diplodocus@126.com</generator>

<item>
  <title>GoAgent图文设置教程 google免费翻墙设置</title>
  <link>http://www.lianglong.org/article/GoAgent.html</link>
  <description><![CDATA[<p>相信有很多人都懂得使用GoAgent这个方法实现无障碍地访问国外的网站，如Facebook、Twitter、YouTube等。不少网友也曾经跟我探讨过这个免费的方法，现在笔者综合网上的资料对GoAgent进行一个详细的介绍。希望对大家有所帮助。</p>
<p>&nbsp;<img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/d05803bc28de54b5b34fb36aad8f7216.jpg" /></p>
<p>使用GoAgent浏览&ldquo;某些网站&rdquo;的具体步骤：</p>
<h3><span style="color: #3366ff">申请创建一个Application</span></h3>
<p><strong>Step 1 -申请Google App Engine账号</strong></p>
<p>登录<a target="_blank" href="http://appengine.google.com/"><font color="#0099cc">http://appengine.google.com</font></a>，如果你已经拥有一个Gmail账户，直接输入账号密码就可以登录；如果没有则需要新申请一个Gmail账户。（笔者认为Gmail是必用的邮箱之一，木有的童鞋赶快申请一个）</p>
<p><strong>Step 2 -创建Application</strong></p>
<p>&nbsp;</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/9e77973fe0fab7620848a560f163b083.jpg" /></p>
<p>简单地介绍一下Google App Engine，Google App Engine是一个开发、托管网络应用程序的平台，使用Google管理的数据中心。它在2008年4月发布了第一个beta版本。Google App Engine使用了云计算技术。它跨越多个服务器和数据中心来虚拟化应用程序。</p>
<p><strong>Step 3 -通过短信验证你的账户；</strong></p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/caa741ee6fffe311d0b1eee442ed8f56.jpg" /></p>
<p>需要短信验证才可以进行下一步操作，Country and Carrier（国家和运营商）处选择Other，Mobile Number（手机号码）处填写你的个人手机号码号码，格式为+8613912345678</p>
<p><strong>Step 4 -将手机收到的验证码输入并Send；</strong></p>
<p>&nbsp;</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/4d99ff58a198867a28e21797be7acdb0.jpg" /></p>
<p>你将会收到谷歌发给你的短信，短信内容大致为：Google&nbsp;App Engine：******（六位数字）。</p>
<p><strong>Step 5 -创建一个属于你的Application；</strong></p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/5d3153d5e0899e1a44d76a32e8b98044.jpg" /></p>
<blockquote>
<p>1）输入一个Application ID，允许使用英文字母和短横杆；<br />
2）点击Check Available，检查一下是否可用；<br />
3）输入Application名称，这里可以随便填；<br />
4）勾选I&nbsp;accept&nbsp;these&nbsp;terms，即接受协议；<br />
5）最后Creat&nbsp;Application</p>
</blockquote>
<p><strong>Final -当你看到以下画面，说明你已经成功创建一个&nbsp;Application</strong></p>
<p>&nbsp;</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/aab757b369bdb8b3554184f43ffe7aaf.jpg" /></p>
<p>注：每个Gmail账户最多只能够创建10个Google App Engine应用，每个应用每天有1GB免费流量。如果你经常下载或者观看视频，建议多创建几个Google App Engine应用。</p>
<h3><span style="color: #3366ff">修改谷歌账号两步验证</span></h3>
<p><strong>Step 1 -</strong>进入谷歌账户设置页面https://www.google.com/settings，在安全性-两步认证处，点击修改；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/788a2036df77d03c1a4d70355fad42ab.jpg" /></strong></p>
<p><strong>Step 2 -</strong>开始设置Google账户；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/5b6ccb90cb0dbbac5b81967464789ecb.jpg" /></strong></p>
<p><strong>Step 3 -</strong>手机设置，此处你需要点击发送验证码，获取验证码后提交确认进入下一步；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/8549497418b143ae71ae30cc832aa8c4.jpg" /></strong></p>
<p><strong>Step 4 -</strong>验证计算机，如果当前计算机不是你个人的计算机，不要勾选信任此计算机；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/d1a067d73edfcbad70defe7cef5efddb.jpg" /></strong></p>
<p><strong>Step 5 -</strong>设置两步验证的最后一步，激活</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/eff25bca4af129db014c7005c4839ae9.jpg" /></strong></p>
<p><strong>Step 6 -</strong>开始为你的Application创建密码</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/6b191fa5a8586f17bf39708cd2845fe9.jpg" /></strong></p>
<p><strong>Step 7 -</strong>输入名称，这里可以随便填写，点击生成密码进入下一步；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/12254bbbb75cd520fe45445057a1adb6.jpg" /></strong></p>
<p><strong>Step 8 -</strong>把生成的密码记下来，后面会用到的。</p>
<p>&nbsp;</p>
<h3><span style="color: #3366ff"><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/7c6bc751144223be58e8ec3033b5f078.jpg" /></span></h3>
<h3><span style="color: #3366ff">配置goagent客户端</span></h3>
<p><strong>Step 1 -</strong>下载goagent客户端（<a target="_blank" href="http://code.google.com/p/goagent/"><font color="#0099cc">Download</font></a>）；</p>
<p><strong>Step 2 -</strong>修改local\proxy.ini中的<tt>[gae]</tt>下的appid=你的appid(多appid请用|隔开)，即前面创建创建Application所设定的Application ID，如我设定的my-xberry；</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/ccbaa32a3c138dfdc81f8816867a9b58.jpg" /></strong></p>
<p><strong>Step 3 -</strong>双击server\uploader.bat（Windows 7或Windows 8用户最好以管理员身份运行），根据提示依次输入Application ID，邮箱地址，和修改谷歌账号两步验证Step 8中生成的16位密码。（注，输入密码时，文字是不可见的，确定输入后回车确认即可。</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/9a4a87d344bba6ec29d66e2e9293c02b.jpg" /><br />
&nbsp;</p>
<p>注：笔者在Windows 8下使用goagent 1.7.10 稳定版提示错误，使用goagent 1.8.0测试版表示可以正常上网</p>
<h3><span style="color: #3366ff">开始使用GoAgent</span></h3>
<p>使用GoAgent上网前，你必须运行local\goagent.exe（以管理员身份运行），就刚才下载的goagent压缩包里面的文件。</p>
<p><strong>如果你使用的是Chrome，请参考以下教程：</strong></p>
<p><strong>1）</strong>chrome请安装<a rel="nofollow" href="https://chrome.google.com/webstore/detail/dpplabbmogkhghncfbfdeeokoefdjegm"><font color="#0099cc">SwitchySharp</font></a>插件；<br />
<strong>2）</strong>导入SwitchySharp配置，下载地址<a rel="nofollow" href="http://goagent.googlecode.com/files/SwitchyOptions.bak"><font color="#0099cc">http://goagent.googlecode.com/files/SwitchyOptions.bak</font></a>，进入SwitchySharp设置界面，点击&ldquo;导入/导出&rdquo;-&ldquo;从文件恢复&rdquo;，导入刚才下载的SwitchyOptions.bak</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/4c1ced4ec55529abf92e79e775e2a524.jpg" /></strong></p>
<p><strong>3）</strong>使用Chrome浏览Twitter、Facebook，YouTube等网站时，记得切换到GoAgent</p>
<p>&nbsp;</p>
<p><strong><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/a07eef6324b3344fc8852c6a0bb0f573.jpg" /></strong></p>
<p><strong>如果你使用的是Firefox，请参考以下教程：</strong></p>
<p><strong>1）</strong>安装火狐附加组件<a rel="nofollow" href="https://addons.mozilla.org/zh-cn/firefox/addon/autoproxy/"><font color="#0099cc">AutoProxy</font></a>；安装完毕后重启Firefox，提示规则列表，记得选中确定；</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/82b72746351766e3bb58e62fc73c801d.jpg" /></p>
<p><strong>2）</strong>FireFox-&gt;选项-&gt;高级-&gt;加密-&gt;查看证书-&gt;证书机构-&gt;导入证书, 选择local\ca.crt, 勾选所有项，导入。</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/fd7ac741f47a3fb8d43be2fa435a907d.jpg" /></p>
<p><strong>3）</strong>添加代理设置，点击AutoProxy图标旁边的三角按钮，在下拉菜单中选择&ldquo;preferences&rdquo;或者使用快捷键Ctrl+Alt+P进入附加组件首选项设置，然后点击Proxy Server，选择Edit Proxy Server，添加代理地址，如下图：</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/7e18fda9c5792be5eede39565eb22aa8.jpg" /></p>
<p><strong>4）</strong>修改默认代理，同样是&ldquo;preferences&rdquo;界面点击Proxy Server，选择Choose Proxy Server，将默认的Proxy改成刚才添加的；</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/71ffda741f6bf075d066e6032bf768ac.jpg" /></p>
<p><strong>5）</strong>使用AutoProxy会自动根据已定规则决定是否使用Proxy的。碉堡了。</p>
<p>都设置好了twitter看看，有木有？再上facebook看看看，有木有？再&nbsp;上YouTube看看看看，有木有？碉堡了，速度果然威武，哥上YouTube看720P视频居然完全不需要缓冲，<span>気持ちいい</span>。</p>
<p><img alt="" onload="ResizeImage(this,500)" src="http://www.lianglong.org/upload/7b26171fb09d11547b736b1c6146243e.jpg" /></p>
<p>遇到问题？请登录<a href="http://code.google.com/p/goagent/">http://code.google.com/p/goagent/</a>或者留言。</p>
<p>如果你使用的是linux或者mac，请阅读https://code.google.com/p/goagent/的FAQ。</p>
<p><span style="color: #ff0000">Warning：切记需要连接外网时运行文件夹local下的goagent.exe，否则无法连接外网。</span></p>]]></description>
  <category>生活点滴</category>
  <comments>http://www.lianglong.org/article/GoAgent.html#comment</comments>
  <guid>http://www.lianglong.org/article/GoAgent.html</guid>
  <pubDate>Wed, 09 May 2012 15:20:33 +0000</pubDate>
</item>
<item>
  <title>[转]7个免费强大的Ajax文件管理器</title>
  <link>http://www.lianglong.org/article/229.html</link>
  <description><![CDATA[<p>如果你正在开发一个WEB应用，需要一个不错的强大的文件管理器，并且可以简单的定制，那么，下面的这七个免费开源的文件管理器你一会喜欢的。这些 文件管理器都很强大，他们全部都支持PHP，Javascript和Ajax，有几个还支持别的WEB开发语言。这些管理理可以让你完成目录文件浏览，搜 索，上传/下载，编辑，拷贝，移动，删除等等文件操作功能。</p>
<h3 class="title">1. <a href="http://www.ajaxplorer.info/">AjaXplorer</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager4.jpg" alt="Ajax File Manager" /></p>
<p>AjaXplorer 是一个免费的 Ajax 文件管理器，其很容易安装。而且它的布局很丰富，可以用于多种应用，比如：文件管理，文件共享，图片库，代码库等等。不过它只支持(4&nbsp;呀 5) ，不支持数据库。</p>
<p>&nbsp;</p>
<ul>
    <li>改名/拷贝/移动/删除/下载文件或目录。</li>
    <li>以进度条的方式上传多个文件 (需要Flash 支持，不支持https)</li>
    <li>创建目录和空文件。</li>
    <li>编辑纯文本文件和代码 (js, php, html, java, sql, perl)，支持语法高亮。</li>
    <li>查看图片，有缩略图功能。</li>
    <li>可以在线地播放MP3文件。</li>
    <li>在线地查看Flash videos (FLV) 文件。</li>
    <li>可以在线地浏览或解压ZIP 文件。</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>下载</strong>：<a href="http://www.ajaxplorer.info/download/">http://www.ajaxplorer.info/download/</a></li>
    <li><strong>演示</strong>：<a href="http://www.ajaxplorer.info/demo/">http://www.ajaxplorer.info/demo/</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">2. <a href="http://filenice.com/">fileNice</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager1.jpg" alt="Ajax File Manager" /></p>
<p>fileNice 是一个免费的PHP文件浏览器。</p>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>主页：</strong><a href="http://filenice.com/">http://filenice.com/</a></li>
    <li><strong>演示：</strong><a href="http://filenice.com/demo/">http://filenice.com/demo/</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">3. <a href="http://www.solitude.dk/filethingie/">File Thingie</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager2.jpg" alt="Ajax File Manager" /></p>
<p>File Thingie 是一个小型的文件管理器。由PHP写成。他主要的目的是提示一个WEB界面的文件管理器（如果你不能使用或是不会使用FTP）。通过File Thingie你可以完成下面这些事：</p>
<ul>
    <li>安装简单&mdash; 只有一个文件</li>
    <li>多文件上传</li>
    <li>多用户和用户组</li>
    <li>创建子目录</li>
    <li>改名，移动，删除，拷贝文件和目录</li>
    <li>搜索文件或目录名</li>
    <li>通过黑/白名单进行文件级的存取控制</li>
    <li>编辑纯文本文件</li>
    <li>在线Unzip&nbsp;文件</li>
    <li>非常容易地进行CSS界面定制</li>
    <li>支持多国语言</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>教程：</strong><a href="http://www.solitude.dk/filethingie/tour">http://www.solitude.dk/filethingie/tour</a></li>
    <li><strong>下载：</strong><a href="http://www.solitude.dk/filethingie/download">http://www.solitude.dk/filethingie/download</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">4. <a href="http://og5.net/christoph/article/MooTools_based_FileManager">MooTools based FileManager</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager3.jpg" alt="Ajax File Manager" /></p>
<p>MooTools based File-Manager 提供了预览，上传和修改文件和目录的功能。其主要功能如下：</p>
<ul>
    <li>浏览文件和目录</li>
    <li>改名，删除，移动（拖放）,拷贝（Ctrl+拖放）和下载</li>
    <li>查看文件细节和预览图片文件，文本文件，压缩文件和音频文件。</li>
    <li>非常不错的UI设计&nbsp;</li>
    <li>通过FancyUpload 上传文件</li>
    <li>提供在上传时自动缩放图片尺寸的选项</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>演示：</strong><a href="http://og5.net/christoph/Scripts/FileManager/Demos/">http://og5.net/christoph/Scripts/FileManager/Demos/</a></li>
    <li><strong>下载：</strong><a href="http://og5.net/christoph/article/MooTools_based_FileManager">http://og5.net/christoph/article/MooTools_based_FileManager</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">5. <a href="http://ecosmear.com/relay/">Relay</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager5.jpg" alt="Ajax File Manager" /></p>
<p>Relay 是一个极牛的Ajax 文件管理器。在上传和下载文件它做得相当出色。下面是它的一些功能：</p>
<ul>
    <li>可以随意拖放文件和目录</li>
    <li>动态地载入文件目录结构&nbsp;</li>
    <li>上传文件进度条&nbsp;</li>
    <li>缩略图预览（包括PDF文件）&nbsp;</li>
    <li>多用户和帐号</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>演示：</strong><a href="http://ecosmear.com/relay/demo/">http://ecosmear.com/relay/demo/</a></li>
    <li>&nbsp;<strong>主页：</strong><a href="http://ecosmear.com/relay/">http://ecosmear.com/relay/</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">6. <a href="http://kfm.verens.com/">Kae&rsquo;s File Manager</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager8.jpg" alt="Ajax File Manager" /></p>
<p>KFM 是一个在线的文件管理器，它可以单独使用或是以一个插件的方式给一些编辑器使用。比如这些编辑器：FCKeditor 或TinyMCE。KFM 是一个开源的免费的项目，下面是它的一些特性：</p>
<ul>
    <li>鼠标拖放功能</li>
    <li>图标显示，列表显示</li>
    <li>支持插件</li>
    <li>图片操作，幻灯片播放</li>
    <li>简单的安装和升级</li>
    <li>文本编辑时语法高亮</li>
    <li>搜索引擎</li>
    <li>标签</li>
    <li>多语言</li>
    <li>mp3&nbsp;和视频播放插件</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>演示：</strong><a href="http://kfm.verens.com/demo/1.3.1/?lang=en">http://kfm.verens.com/demo/1.3.1/?lang=en</a></li>
    <li><strong>主页：</strong><a href="http://kfm.verens.com/">http://kfm.verens.com/</a></li>
</ul>
<p>&nbsp;</p>
<h3 class="title">7. <a href="http://extplorer.sourceforge.net/">eXtplorer</a></h3>
<p class="img"><img src="http://devsnippets.com/img/file-manager7.jpg" alt="Ajax File Manager" /></p>
<p>eXtplorer 特性如下：</p>
<ul>
    <li>文件目录浏览</li>
    <li>编辑，复制，移动，删除文件</li>
    <li>搜索，上传和下载文件</li>
    <li>创建和释放压缩文件</li>
    <li>创建文件和目录</li>
    <li>更改文件和目录权限</li>
    <li>其它更多更多的内容</li>
</ul>
<p><strong>链接：</strong></p>
<ul>
    <li><strong>主页：</strong>&nbsp;<a href="http://extplorer.sourceforge.net/">http://extplorer.sourceforge.net/</a></li>
</ul>]]></description>
  <category>开发板块</category>
  <comments>http://www.lianglong.org/article/229.html#comment</comments>
  <guid>http://www.lianglong.org/article/229.html</guid>
  <pubDate>Thu, 26 Apr 2012 10:25:43 +0000</pubDate>
</item>
<item>
  <title>Centos下MongoDB的安装</title>
  <link>http://www.lianglong.org/article/227.html</link>
  <description><![CDATA[<p>安装MongoDB的方法有很多种，可以源代码安装，在Centos也可以用yum源安装的方法。两种方法都有各自的好处，源代码安装的话可以把默认的js引擎换成Google的V8引擎，用yum源安装的话就是更新方便。</p>
<p>由于MongoDB更新得比较快，我比较喜欢用yum源安装的方法。64位Centos下的安装步骤如下：</p>
<p>1、vi /etc/yum.repos.d/Mongo.repo，输入下面的语句：</p>
<p>[10gen]<br />
name=10gen Repositorybaseurl=http://downloads.mongodb.org/distros/centos/5.4/os/x86_64/<br />
gpgcheck=0</p>
<p>保存</p>
<p>2、执行安装：<br />
yum install mongo-stable mongo-stable-server</p>
<p>3、启动MongoDB<br />
MongoDB的配置在/etc/mongod.conf，执行相应的修改后，执行：</p>
<p>service mongod start</p>
<p>这样就启动了MongoDB了。</p>
<p>以后有更新了，停掉mongodb，执行yum update&nbsp;mongo-stable mongo-stable-server即可。</p>
<p>3、PHP Driver的安装：</p>
<p>wget http://pecl.php.net/get/mongo-1.1.3.tgz<br />
tar -zxvf mongo-1.1.3.tgz<br />
cd mongo-1.1.3<br />
phpize<br />
./configure<br />
make &amp;&amp; make install</p>]]></description>
  <category>学习札记</category>
  <comments>http://www.lianglong.org/article/227.html#comment</comments>
  <guid>http://www.lianglong.org/article/227.html</guid>
  <pubDate>Tue, 06 Mar 2012 14:38:56 +0000</pubDate>
</item>
<item>
  <title>HTTP状态码301,304,502,505的详细解释</title>
  <link>http://www.lianglong.org/article/226.html</link>
  <description><![CDATA[<div id="cnblogs_post_body">在网站建设的实际应用中，容易出现很多小小的失误，就像mysql当初优化不到位，影响整体网站的浏览效果一样，其实，网站的常规http状态码的表现也是一样，Google无法验证网站几种解决办法，提及到由于404状态页面设置不正常，导致了google管理员工具无法验证的情况，当然，影响的不仅仅是这一方面，影响的更是网站的整体浏览效果。因此，比较清楚详细的了解http状态码的具体含义，对于一个网站站长来说，这是很有必要俱备的网站制作基础条件。
<p>　　如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如，用户通过浏览器访问您的网页或 Googlebot 抓取网页时)，服务器将会返回 HTTP 状态码响应请求。</p>
<p>　　此状态码提供关于请求状态的信息，告诉 Googlebot 关于您的网站和请求的网页的信息。</p>
<p>　　一些常见的状态码为：</p>
<p>　　200 - 服务器成功返回网页</p>
<p>　　404 - 请求的网页不存在</p>
<p>　　503 - 服务器超时</p>
<p>　　下面提供 HTTP 状态码的完整列表。点击链接可了解详情。您也可以访问 HTTP 状态码上的 W3C 页获取更多信息。</p>
<p>　　1xx(临时响应)</p>
<p>　　表示临时响应并需要请求者继续执行操作的状态码。</p>
<p>　　100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分，正在等待其余部分。</p>
<p>　　101(切换协议)请求者已要求服务器切换协议，服务器已确认并准备切换。</p>
<p>　　2xx (成功)</p>
<p>　　表示成功处理了请求的状态码。</p>
<p>　　200(成功)服务器已成功处理了请求。通常，这表示服务器提供了请求的网页。如果是对您的 robots.txt 文件显示此状态码，则表示 Googlebot 已成功检索到该文件。</p>
<p>　　201(已创建)请求成功并且服务器创建了新的资源。</p>
<p>　　202(已接受)服务器已接受请求，但尚未处理。</p>
<p>　　203(非授权信息)服务器已成功处理了请求，但返回的信息可能来自另一来源。</p>
<p>　　204(无内容)服务器成功处理了请求，但没有返回任何内容。</p>
<p>　　205(重置内容)服务器成功处理了请求，但没有返回任何内容。与 204 响应不同，此响应要求请求者重置文档视图(例如，清除表单内容以输入新内容)。</p>
<p>　　206(部分内容)服务器成功处理了部分 GET 请求。</p>
<p>　　3xx (重定向)</p>
<p>　　要完成请求，需要进一步操作。通常，这些状态码用来重定向。Google 建议您在每次请求中使用重定向不要超过 5 次。您可以使用网站管理员工具查看一下 Googlebot 在抓取重定向网页时是否遇到问题。诊断下的网络抓取页列出了由于重定向错误导致 Googlebot 无法抓取的网址。</p>
<p>　　300(多种选择)针对请求，服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作，或提供操作列表供请求者选择。</p>
<p>　　301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时，会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。</p>
<p>　　302(临时移动)服务器目前从不同位置的网页响应请求，但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似，会自动将请求者转到不同的位置，但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动，因为 Googlebot 会继续抓取原有位置并编制索引。</p>
<p>　　303(查看其他位置)请求者应当对不同的位置使用单独的 GET 请求来检索响应时，服务器返回此代码。对于除 HEAD 之外的所有请求，服务器会自动转到其他位置。</p>
<p>　　304(未修改)自从上次请求后，请求的网页未修改过。服务器返回此响应时，不会返回网页内容。</p>
<p>　　如果网页自请求者上次请求后再也没有更改过，您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更，进而节省带宽和开销。</p>
<p>　　.</p>
<p>　　305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应，还表示请求者应使用代理。</p>
<p>　　307(临时重定向)服务器目前从不同位置的网页响应请求，但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似，会自动将请求者转到不同的位置，但您不应使用此代码来告诉 Googlebot 某个页面或网站已经移动，因为 Googlebot 会继续抓取原有位置并编制索引。</p>
<p>　　4xx(请求错误)</p>
<p>　　这些状态码表示请求可能出错，妨碍了服务器的处理。</p>
<p>　　400(错误请求)服务器不理解请求的语法。</p>
<p>　　401(未授权)请求要求身份验证。对于登录后请求的网页，服务器可能返回此响应。</p>
<p>　　403(禁止)服务器拒绝请求。如果您在 Googlebot 尝试抓取您网站上的有效网页时看到此状态码(您可以在 Google 网站管理员工具诊断下的网络抓取页面上看到此信息)，可能是您的服务器或主机拒绝了 Googlebot 访问。</p>
<p>　　404(未找到)服务器找不到请求的网页。例如，对于服务器上不存在的网页经常会返回此代码。</p>
<p>　　如果您的网站上没有 robots.txt 文件，而您在 Google 网站管理员工具&quot;诊断&quot;标签的 robots.txt 页上看到此状态码，则这是正确的状态码。但是，如果您有 robots.txt 文件而又看到此状态码，则说明您的 robots.txt 文件可能命名错误或位于错误的位置(该文件应当位于顶级域，名为 robots.txt)。</p>
<p>　　如果对于 Googlebot 抓取的网址看到此状态码(在&quot;诊断&quot;标签的 HTTP 错误页面上)，则表示 Googlebot 跟随的可能是另一个页面的无效链接(是旧链接或输入有误的链接)。</p>
<p>　　405(方法禁用)禁用请求中指定的方法。</p>
<p>　　406(不接受)无法使用请求的内容特性响应请求的网页。</p>
<p>　　407(需要代理授权)此状态码与 401(未授权)类似，但指定请求者应当授权使用代理。如果服务器返回此响应，还表示请求者应当使用代理。</p>
<p>　　408(请求超时)服务器等候请求时发生超时。</p>
<p>　　409(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码，以及两个请求的差异列表。</p>
<p>　　410(已删除)如果请求的资源已永久删除，服务器就会返回此响应。该代码与 404(未找到)代码类似，但在资源以前存在而现在不存在的情况下，有时会用来替代 404 代码。如果资源已永久移动，您应使用 301 指定资源的新位置。</p>
<p>　　411(需要有效长度)服务器不接受不含有效内容长度标头字段的请求。</p>
<p>　　412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。</p>
<p>　　413(请求实体过大)服务器无法处理请求，因为请求实体过大，超出服务器的处理能力。</p>
<p>　　414(请求的 URI 过长)请求的 URI(通常为网址)过长，服务器无法处理。</p>
<p>　　415(不支持的媒体类型)请求的格式不受请求页面的支持。</p>
<p>　　416(请求范围不符合要求)如果页面无法提供请求的范围，则服务器会返回此状态码。</p>
<p>　　417(未满足期望值)服务器未满足&quot;期望&quot;请求标头字段的要求。</p>
<p>　　5xx(服务器错误)</p>
<p>　　这些状态码表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误，而不是请求出错。</p>
<p>　　500(服务器内部错误)服务器遇到错误，无法完成请求。</p>
<p>　　501(尚未实施)服务器不具备完成请求的功能。例如，服务器无法识别请求方法时可能会返回此代码。</p>
<p>　　502(错误网关)服务器作为网关或代理，从上游服务器收到无效响应。</p>
<p>　　503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常，这只是暂时状态。</p>
<p>　　504(网关超时)服务器作为网关或代理，但是没有及时从上游服务器收到请求。</p>
<p>　　505(HTTP 版本不受支持)服务器不支持请求中所用的 HTTP 协议版本。</p>
<p>　　上书大部分实际内容源自googel管理员博客近日文章所引用的有关301说明的有些链接，感觉非常有用，因此收藏注释，以备以后警戒注意学习。合理利用这些状态码，避免错误利用，必将会为你的网站带来更佳的浏览者体会，得到更加亲和的搜索引擎收录，得到更准确的搜索引擎切入，从而，为你的网站发展，奠定坚实的发展基础。</p>
</div>]]></description>
  <category>学习札记</category>
  <comments>http://www.lianglong.org/article/226.html#comment</comments>
  <guid>http://www.lianglong.org/article/226.html</guid>
  <pubDate>Tue, 06 Mar 2012 14:30:32 +0000</pubDate>
</item>
<item>
  <title>php实现socket</title>
  <link>http://www.lianglong.org/article/225.html</link>
  <description><![CDATA[<div id="cnblogs_post_body">
<div style="font-size: 14px" id="blogDetailDiv">
<p><strong>一、Socket 简介</strong><br />
1、socket只不过是一个数据结构。<br />
2、使用这个socket数据结构去开始一个客户端和服务器之间的会话。<br />
3、服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器，它就打开服务器正在进行监听的一个端口进行会话。<br />
4、服务器端接受客户端的连接请求，那么就进行一次循环。现在这个客户端就能够发送信息到服务器，服务器也能发送信息给客户端。</p>
<p><strong>二、Socket 变量</strong><br />
产生一个Socket，你需要三个变量：一个协议、一个socket类型和一个公共协议类型。</p>
<p>1、协议</p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">AF_INET&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//产生socket的协议，使用TCP或UDP来传输，用在IPv4的地址</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">AF_INET6&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//产生socket的协议，使用TCP或UDP来传输，用在IPv6的地址</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">AF_UNIX&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//本地协议，使用在Unix和Linux系统上，它很少使用，一般都是当客户端和服务器在同一台机器上的时候使用</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span></p>
<p>2、Socket类型</p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">SOCK_STREAM&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型，这个socket是使用TCP来进行传输。</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">SOCK_DGRAM&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//这个协议是无连接的、固定长度的传输调用。该协议是不可靠的，使用UDP来进行它的连接。</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">SOCK_SEQPACKET&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//这个协议是双线路的、可靠的连接，发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">SOCK_RAW&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//这个socket类型提供单一的网络访问，这个socket类型使用ICMP公共协议。（ping、traceroute使用该协议）</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">SOCK_RDM&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//这个类型是很少使用的，在大部分的操作系统上没有实现，它是提供给数据链路层使用，不保证数据包顺序</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span></p>
<p>3、公共协议</p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">ICMP&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//互联网控制消息协议，主要使用在网关和主机上，用来检查网络状况和报告错误信息</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">UDP&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//用户数据报文协议，它是一个无连接，不可靠的传输协议</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">TCP&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,130,0); padding-top: 0px">//传输控制协议，这是一个使用最多的可靠的公共协议，它能保证数据包能够到达接受者那儿，如果在传输过程中发生错误，那么它将重新发送出错数据包。</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;</span></span></p>
<p><strong>三、Socket函数</strong><br />
1、socket_create<br />
作用：产生一个socket，相当于产生一个socket的数据结构<br />
用法：socket_create ( int domain, int type, int protocol )<br />
参数：domain，协议；type，类型；protocol,公共协议<br />
返回：socket resource on success, or FALSE on error</p>
<p>2、socket_bind<br />
作用：把socket绑定在一个IP地址和端口上<br />
用法：socket_bind ( resource socket, string address [, int port] )<br />
参数：socket,socket resource;address，ip地址；port，端口<br />
返回：Boolean</p>
<p>3、socket_accept<br />
作用：接受一个Socket连接<br />
用法：socket_accept ( resource socket )<br />
参数：socket,socket resource<br />
返回：Returns a new socket resource on success, or FALSE on error.</p>
<p>4、socket_connect()<br />
作用：开始一个socket连接<br />
用法：socket_connect ( resource socket, string address [, int port] )<br />
参数：socket,socket resource;address，ip地址；port，端口<br />
返回：Boolean</p>
<p>5、socket_listen<br />
作用：监听由指定socket的所有连接<br />
用法：socket_listen ( resource socket [, int backlog] )<br />
参数：socket,socket resource;<br />
返回：Boolean</p>
<p>6、socket_read<br />
作用：读取指定长度的数据<br />
用法：socket_read ( resource socket, int length [, int type] )<br />
参数：socket,socket resource;length，字符长度；type，PHP_BINARY_READ |PHP_NORMAL_READ<br />
返回：string</p>
<p>7、socket_write<br />
作用：写数据到socket缓存<br />
用法：socket_write ( resource socket, string buffer [, int length] )<br />
参数：socket,socket resource;buffer，字符；length，字符长度；<br />
返回：Boolean</p>
<p>8、socket_send()<br />
作用：这个函数发送数据到已连接的socket<br />
用法：socket_send ( resource socket, string buf, int len, int flags )<br />
参数：socket,socket resource;buf，字符；len，字符长度；<br />
返回：Boolean</p>
<p>9、socket_last_error<br />
作用：获取当前socket的最后错误代码<br />
用法：socket_last_error ( [resource socket] )<br />
参数：socket,socket resource;<br />
返回：int</p>
<p>10、socket_strerror<br />
作用：返回指定错误号的详细错误<br />
用法：socket_strerror ( int errno )<br />
参数：errno,socket_last_error no;<br />
返回：string</p>
<p>11、socket_close<br />
作用：关闭一个socket资源<br />
用法：socket_close ( [resource socket] )<br />
参数：socket,socket resource;<br />
返回：null</p>
<p><strong>四、使用说明</strong><br />
确认打开socket方法<br />
a、编辑php.ini文件，去掉 extension=php_sockets.dll 前面的注释：<br />
b、代码来加载扩展库</p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,102,153); font-weight: bold; padding-top: 0px">if</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">(!</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">extension_loaded</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">(</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: blue; padding-top: 0px">'sockets'</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">))&nbsp;{&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp; &nbsp;<span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,102,153); font-weight: bold; padding-top: 0px">if</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">(</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">strtoupper</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">(</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">substr</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">(PHP_OS,&nbsp;0,&nbsp;3))&nbsp;==&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: blue; padding-top: 0px">&quot;WIN&quot;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">)&nbsp;{&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;dl(<span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: blue; padding-top: 0px">'php_sockets.dll'</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">);&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp; &nbsp;}<span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(0,102,153); font-weight: bold; padding-top: 0px">else</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">{&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dl(<span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: blue; padding-top: 0px">'sockets.so'</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">);&nbsp;&nbsp;</span></span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;</span><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: black; padding-top: 0px">}&nbsp;&nbsp;</span></p>
</div>
</div>]]></description>
  <category>学习札记</category>
  <comments>http://www.lianglong.org/article/225.html#comment</comments>
  <guid>http://www.lianglong.org/article/225.html</guid>
  <pubDate>Tue, 06 Mar 2012 14:25:56 +0000</pubDate>
</item>
<item>
  <title>php与mysql事务处理 </title>
  <link>http://www.lianglong.org/article/224.html</link>
  <description><![CDATA[<div id="cnblogs_post_body">
<p><span style="font-size: medium"><font size="3">PHP与MYSQL事务处理</font></span></p>
<p><span style="font-size: medium"><font size="3">/*<br />
MYSQL的事务处理主要有两种方法。<br />
1、用begin,rollback,commit来实现<br />
begin 开始一个事务<br />
rollback 事务回滚<br />
commit 事务确认<br />
2、直接用set来改变mysql的自动提交模式<br />
MYSQL默认是自动提交的，也就是你提交一个QUERY，它就直接执行！我们可以通过<br />
set autocommit=0 禁止自动提交<br />
set autocommit=1 开启自动提交<br />
来实现事务的处理。<br />
当你用 set autocommit=0 的时候，你以后所有的SQL都将做为事务处理，直到你用commit确认或rollback结束。<br />
注意当你结束这个事务的同时也开启了个新的事务！按第一种方法只将当前的作为一个事务！<br />
个人推荐使用第一种方法！<br />
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理！其他的类型是不支持的！<br />
***：一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务！如果要让MYSQL支持事务，可以自己手动修改:<br />
方法如下：1.修改c:\appserv\mysql\my.ini文件，找到skip-InnoDB,在前面加上#，后保存文件。<br />
2.在运行中输入：services.msc,重启mysql服务。<br />
3.到phpmyadmin中，mysql-&gt;show engines;(或执行mysql-&gt;show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。<br />
也就说明支持事务transaction了。<br />
4.在创建表时，就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表，可以使用mysql-&gt;alter table table_name type=InnoDB;<br />
或 mysql-&gt;alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。<br />
*/<br />
/*************** transaction--1 ***************/<br />
$conn = mysql_connect('localhost','root','root') or die (&quot;数据连接错误!!!&quot;);<br />
mysql_select_db('test',$conn);<br />
mysql_query(&quot;set names 'GBK'&quot;); //使用GBK中文编码;<br />
//开始一个事务<br />
mysql_query(&quot;BEGIN&quot;); //或者mysql_query(&quot;START TRANSACTION&quot;);<br />
$sql = &quot;INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')&quot;;<br />
$sql2 = &quot;INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')&quot;;//这条我故意写错<br />
$res = mysql_query($sql);<br />
$res1 = mysql_query($sql2);&nbsp; <br />
if($res &amp;&amp; $res1){<br />
mysql_query(&quot;COMMIT&quot;);<br />
echo '提交成功。';<br />
}else{<br />
mysql_query(&quot;ROLLBACK&quot;);<br />
echo '数据回滚。';<br />
}<br />
mysql_query(&quot;END&quot;); <br />
/**************** transaction--2 *******************/<br />
/*方法二*/<br />
mysql_query(&quot;SET AUTOCOMMIT=0&quot;); //设置mysql不自动提交，需自行用commit语句提交<br />
$sql = &quot;INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')&quot;;<br />
$sql2 = &quot;INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')&quot;;//这条我故意写错<br />
$res = mysql_query($sql);<br />
$res1 = mysql_query($sql2);&nbsp; <br />
if($res &amp;&amp; $res1){<br />
mysql_query(&quot;COMMIT&quot;);<br />
echo '提交成功。';<br />
}else{<br />
mysql_query(&quot;ROLLBACK&quot;);<br />
echo '数据回滚。';<br />
}<br />
mysql_query(&quot;END&quot;); //事务处理完时别忘记mysql_query(&quot;SET AUTOCOMMIT=1&quot;);自动提交</font></span></p>
<p>&nbsp;</p>
<p><br />
/******************对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法：********************/</p>
<p>//MyISAM &amp; InnoDB 都支持,<br />
/*<br />
LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定，则造成堵塞，直到可以获取所有锁定为止。<br />
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时，或当与服务器的连接被关闭时，所有由当前线程锁定的表被隐含地解锁。<br />
*/</p>
<font size="4">
<p>mysql_query(&quot;LOCK TABLES `user` WRITE&quot;);//锁住`user`表<br />
$sql = &quot;INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')&quot;;<br />
$res = mysql_query($sql);<br />
if($res){<br />
echo '提交成功。!';<br />
}else{<br />
echo '失败!';<br />
}<br />
mysql_query(&quot;UNLOCK TABLES&quot;);//解除锁定</p>
</font></div>]]></description>
  <category>学习札记</category>
  <comments>http://www.lianglong.org/article/224.html#comment</comments>
  <guid>http://www.lianglong.org/article/224.html</guid>
  <pubDate>Tue, 06 Mar 2012 14:21:48 +0000</pubDate>
</item>
</channel>
</rss>

