<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>71街 &#187; php</title>
	<atom:link href="http://www.71j.cn/archives/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.71j.cn</link>
	<description>杜工的技术博客</description>
	<lastBuildDate>Fri, 16 Dec 2011 03:52:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>gd库不支持jpeg的解决方法</title>
		<link>http://www.71j.cn/archives/283</link>
		<comments>http://www.71j.cn/archives/283#comments</comments>
		<pubDate>Sun, 06 Nov 2011 15:07:47 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.71j.cn/?p=283</guid>
		<description><![CDATA[杜工就不在这里啰嗦怎么遇到这个问题的了，如果你确实安装了的gd库，却发现无法支持jpeg格式的图片，可从下面找到答案。 原因是在编译gd库前，配置时未声明jpeg库路径。解决方法如下： 32... ]]></description>
			<content:encoded><![CDATA[<p>杜工就不在这里啰嗦怎么遇到这个问题的了，如果你确实安装了的gd库，却发现无法支持jpeg格式的图片，可从下面找到答案。</p>
<p>原因是在编译gd库前，配置时未声明jpeg库路径。解决方法如下：</p>
<p>32位系统:</p>
<p>./configure &#8211;with-php-config=/usr/local/php5/bin/php-config<br />
&#8211;with-jpeg-dir=/usr/lib</p>
<p>64位系统</p>
<p>./configure &#8211;with-php-config=/usr/local/php5/bin/php-config<br />
&#8211;with-jpeg-dir=/usr/lib64</p>
<p>&nbsp;</p>
<p>重新make&amp;make install后，重启apache即可。</p>
<p>&nbsp;</p>
<p><a href="http://www.71j.cn/wp-content/uploads/2011/11/QQ截图20111106230800.jpg"><img class="aligncenter size-full wp-image-284" title="QQ截图20111106230800" src="http://www.71j.cn/wp-content/uploads/2011/11/QQ截图20111106230800.jpg" alt="" width="815" height="301" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/283/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>configure: error: Cannot find MySQL header files under yes.杜工解决办法</title>
		<link>http://www.71j.cn/archives/251</link>
		<comments>http://www.71j.cn/archives/251#comments</comments>
		<pubDate>Tue, 19 Apr 2011 17:44:57 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.71j.cn/?p=251</guid>
		<description><![CDATA[CentOS或者redhad下用yum或者rpm安装了 mysql 及 mysql-server , 在编译安装php时用 &#8211;with-mysql 选项出现错误 Note that the MySQL client library is not bundled anymore. 首先使用命令find / -name &#8216;mysql.h’ 查找路径... ]]></description>
			<content:encoded><![CDATA[<p>CentOS或者redhad下用yum或者rpm安装了 mysql 及 mysql-server , 在编译安装php时用 &#8211;with-mysql 选项出现错误</p>
<p>Note that the MySQL client library is not bundled anymore.</p>
<p>首先使用命令find / -name &#8216;mysql.h’ 查找路径，如果找到就给with-mysql=赋上路径，如果找不到，那就是缺少了 mysql-devel 安装包，用yum或者rpm安装上，即可解决问题</p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/251/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>js模拟php的shuffle函数，用来打乱一维数组</title>
		<link>http://www.71j.cn/archives/220</link>
		<comments>http://www.71j.cn/archives/220#comments</comments>
		<pubDate>Thu, 09 Dec 2010 10:19:57 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[分享]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=220</guid>
		<description><![CDATA[Array.prototype.shuffle = function&#40;&#41; &#123; for&#40;var j, x, i = this.length; i; j = parseInt&#40;Math.random&#40;&#41; * i&#41;, x = this&#91;--i&#93;, this&#91;i&#93; = this&#91;j&#93;, this&#91;j&#93; = x&#41;; return this; &#125;; &#160; 非... ]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Array.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">shuffle</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> j<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> i <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">;</span> j <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> x <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">--</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
非原创，纯分享</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/220/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何去管理php的用户名和密码(二)</title>
		<link>http://www.71j.cn/archives/183</link>
		<comments>http://www.71j.cn/archives/183#comments</comments>
		<pubDate>Thu, 17 Jun 2010 06:32:25 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[用户名]]></category>
		<category><![CDATA[预备语句]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=183</guid>
		<description><![CDATA[(接上文:http://71j.cn/archives/173) 操练开始 在我们做出测试代码之前，首先要创建一个用户数据表。运行如下语句： create database myapp; use myapp; create table users &#40;user varchar&#40;60&#41;, pass varchar&#40;60&#... ]]></description>
			<content:encoded><![CDATA[<p>(接上文:<a href="http://71j.cn/archives/173">http://71j.cn/archives/173</a>)</p>
<p><strong>操练开始</strong><strong></strong></p>
<p>在我们做出测试代码之前，首先要创建一个用户数据表。运行如下语句：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">create</span> <span style="color: #990099; font-weight: bold;">database</span> myapp<span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">use</span> myapp<span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">create</span> <span style="color: #990099; font-weight: bold;">table</span> users <span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">user</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">60</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> pass <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">60</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>其中user用来储存用户名，pass用来储存密码的hash值。目前，phpass生成的密码hash值最大长度为60。</p>
<p><strong>创建新用户</strong><strong></strong></p>
<p>首先，我们从phpass项目网站把<em>P</em>asswordHash.php下载到网站目录中，并设置能让php加载的权限（Unix系统下一般为600或者644）。然后在网站目录中创建两个文件：user-man.html (644权限), and user-man.php (权限同asswordHash.php)。</p>
<p>下面，把下面的内容写在user-man.html中：</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;user-man.php&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;POST&quot;</span>&gt;</span>
用户名:<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;60&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span>&gt;</span>
密码：<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">br</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;60&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;创建新用户&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p>这个文件获取用户名和密码，然后提交到user-man.php。下面是user-man.php的代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Type: text/plain'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 本例只是简单的输出文本的hash值，所以开头要声明下，不让浏览器当作html解析。</span>
&nbsp;
 
&nbsp;
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'../PasswordHash.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Base-2 logarithm of the iteration count used for password stretching</span>
<span style="color: #000088;">$hash_cost_log2</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Do we require the hashes to be portable to older systems (less secure)?</span>
<span style="color: #000088;">$hash_portable</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//在实际应用中，上面两行最好写在配置文件中，比如config.inc.php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//下面开始获取提交的用户名和密码，实际应用中需要验证有效性，不再赘述。</span>
&nbsp;
<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pass</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//下面开始计算密码hash值</span>
&nbsp;
<span style="color: #000088;">$hasher</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PasswordHash<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hash_cost_log2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hash_portable</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$hasher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">HashPassword</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hash</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//这里用的CRYPT_EXT_DES方法，其它加密算法得到结果会更长。</span>
    fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Failed to hash new password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hasher</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> fail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pub</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pvt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pub</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pvt</span> <span style="color: #339933;">!==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$msg</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;: <span style="color: #006699; font-weight: bold;">$pvt</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;An error occurred (<span style="color: #006699; font-weight: bold;">$msg</span>).<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//下面开始把用户信息存入到数据库中</span>
&nbsp;
<span style="color: #000088;">$db_host</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db_port</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3306</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db_user</span> <span style="color: #339933;">=</span> ‘dbuser’<span style="color: #339933;">;</span>
<span style="color: #000088;">$db_pass</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'dbpass'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'dbname'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//数据库信息也最好存储在配置文件中。下面开始连接数据库，并注意弹出失败信息。</span>
&nbsp;
<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span><span style="color: #000088;">$db_host</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db_user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db_pass</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db_name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db_port</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mysqli_connect_errno</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL connect'</span><span style="color: #339933;">,</span> <span style="color: #990000;">mysqli_connect_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//下面用预备语句插入用户信息</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'insert into users (user, pass) values (?, ?)'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL prepare'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ss'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hash</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL bind_param'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL execute'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//最后数据库连接</span>
&nbsp;
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>好了，把左右文件保存好，放在web server下测试下。输入用户名和密码，提交后，到数据库中看下：</p>
<p>mysql&gt; select * from users;<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| user   |pass                                                         |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| myuser | $3b$08$Lg5XF1Tr.X5TGyfb43vBBeEFZm4GTRQhKQ6SY6emkcnhAGT8KfxFS |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
1 row in set (0.00 sec)</p>
<p>至此，用户插入成功。</p>
<p>用户已经存在</p>
<p>下面，我们用上面的方法插入一个相同的用户，同时，用相同的密码。然后查看数据库：</p>
<p>mysql&gt; select * from users;<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| user   |pass                                                         |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| myuser | $3b$08$Lg5XF1Tr.X5TGyfb43vBBeEFZm4GTRQhKQ6SY6emkcnhAGT8KfxFS |<br />
| myuser | $1a$08$7lM07FwQMm5/C8G/urT4z..MudfsS227e8oUEu6T51bNWk/RGb/qe |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
2 rows in set (0.00 sec)</p>
<p>我们得到了用户名相同的两条记录，但是密码hash值不相同，虽然我们使用了相同的密码。</p>
<p>为了解决这个问题，我们可以在执行插入前先执行一个select语句，查询下该用户名是否已经存在了。但是，这对程序的效率来说不是最优化的。好的做法是让为用户名建立唯一索引，禁止用户用户名的出现：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">DROP</span> <span style="color: #990099; font-weight: bold;">TABLE</span> users<span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> users <span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">user</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">60</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> pass <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">60</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">user</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>当我们插入相同的用户名时，程序就会报错：</p>
<p>An error occurred (MySQL execute: Duplicate entry &#8216;myuser&#8217; for key 1).</p>
<p>如此，系统效率会得到提高。虽然，这是纯技术性的错误提示， 我们将稍侯予以解决。</p>
<p><strong>避免泄漏过多服务器细节</strong></p>
<p>上面出现的报错多是mysql服务器报错，可能会泄漏一些敏感信息，如数据库名，数据库地址，甚至数据表文件的存储地址都会被显示，这是很危险的。因此，这些信息我们并不希望被显示，除非我们就是用户，或者是在调试。如此，我们可以修改fail()函数，把错误信息显示为用户可见的内容。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 是否为debug模式，如果是，会显示敏感信息。</span>
<span style="color: #000088;">$debug</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> fail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pub</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pvt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$debug</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pub</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$pvt</span> <span style="color: #339933;">!==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$msg</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;: <span style="color: #006699; font-weight: bold;">$pvt</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* $pvt 可能会含有敏感信息，比如需要隐藏掉，或者需要编码才能被html正确显示的内容。*/</span>
    <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;An error occurred (<span style="color: #006699; font-weight: bold;">$msg</span>).<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>需要注意的，不管是apache还是php，默认情况下是会显示所有调试信息的。所以，作为一个程序员，我们的职责是防止这些信息被泄漏，就跟我们设置了debug模式一样，这对程序员或者服务器运维人员来说至关重要。默认情况下，要把$debug值设置为false，但我们的例子作为测试来说，将继续使用true.</p>
<p><strong>如何区分mysql</strong><strong>报错</strong></p>
<p>我们需要去辨别mysql报错，以确定用户是否已经存在于数据库中，如果已经存在，需要输出一个友好的错误提示。因为当我们插入用户的时候，不只是会有一种错误，当出现其它错误的时候，我们不能傻不愣瞪的提示相同的错误（用户已经存在）吧？</p>
<p>一种解决方法是在出现报错后执行一个针对该用户名的select查询，如果能够返回一行数据，说明用户确实一定存在了。实现方法如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$save_error</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 用户已经存在了?</span>
    <span style="color: #009900;">&#40;</span><span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'select user from users where user=?'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL prepare'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL bind_param'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL execute'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">store_result</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">||</span> fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL store_result'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
        fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'This username is already taken'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL execute'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$save_error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个方法确实奏效，而且也很可靠。但是，我们还有更简捷的实现方法，那就是使用mysql错误码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errno</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">1062</span> <span style="color: #666666; font-style: italic;">/* ER_DUP_ENTRY */</span><span style="color: #009900;">&#41;</span>
        fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'额滴神，该用户已经存在了'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MySQL execute'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>在接下来的例子中，我们将使用这种简单的方法做演示。</p>
<p><strong>魔法引号的处理</strong></p>
<p>Magic quotes 开启后会自动转义输入的数据。其中，所有的单引号（&#8217;）、双引号（”）、反斜线、和 NULL 字符都会被转义（增加个反斜线），其实这操作本质上调用的是 addslashes 函数。</p>
<p>这对程序员来说固然是一个很好的事情，省却了我们过滤的麻烦。但是，当用户输入用户名和密码中含有这些字符时，我们从$_POST中获取到的内容是不是也会被addslashes了呢？</p>
<p>这就需要我们去做判断，示例如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> get_post_var<span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">get_magic_quotes_gpc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$val</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>接下来，我们将用这个函数取post过来的数据，而不是单纯的$_POST数组。<span id="_marker"> </span></p>
<p><span>(待续)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/183/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>如何去管理php的用户名和密码(一)</title>
		<link>http://www.71j.cn/archives/173</link>
		<comments>http://www.71j.cn/archives/173#comments</comments>
		<pubDate>Sun, 13 Jun 2010 09:01:08 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[用户名]]></category>
		<category><![CDATA[预备语句]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=173</guid>
		<description><![CDATA[目前，多数大型的网站，尤其是SNS社区，都有用户管理系统，这些系统一般都涉及到密码认证的问题。那么这些系统是如何储存用户密码的呢？直接存储密码明文吗？答案是否定的，好的做法... ]]></description>
			<content:encoded><![CDATA[<p>目前，多数大型的网站，尤其是SNS社区，都有用户管理系统，这些系统一般都涉及到密码认证的问题。那么这些系统是如何储存用户密码的呢？直接存储密码明文吗？答案是否定的，好的做法是把密码算出一个哈希(hash)值予以存储。我们会发现好多文章教你怎么去计算密码的hash值，<a href="http://71j.cn">杜工的博客(http://71j.cn)</a>也有类似的文章，不过不是用来加密密码的，只是简单的散列，传统的文章推荐使用md5()，后来有些人推荐把密码连接上一个附加值（我们称之为salt值， Discuz就是这么做的），然后计算sha1()，或者hash()(SHA-256等)，同时把用户名进行mysql_real_escape_string()处理。虽然这些文章介绍的方法总体方向是对的，但是并没有一篇关于密码安全存储的文章是尽善尽美的。</p>
<p>其实，最近的文章已经开始推荐使用<a href="http://www.openwall.com/phpass/" target="_blank">phpass</a>, 这是一个基于php的密码hash算法框架，已经被许多知名的web程序使用，如wordpress、Durpal 7等，但是目前并没有一篇详尽的，一步一步指引我们引用phpass的成型文章，而且密码安全问题，并不只是单纯的如何去hash密码予以存储的问题。</p>
<p>接下来，我将一步步介绍如何把用户密码管理方案引入到一套新的php程序中。首先，将简单阐述密码hash的概念以及如何安全地把这些密码送入数据库，然后通过个示例。从一个简单的创建新用户的程序开始，慢慢展开来，逐渐引入用户登录、修改（重置）密码的功能。</p>
<p>当然，文中会涉及其它相关的概念，如果你已了解，可直接略过。</p>
<p><strong>密码HASH</strong></p>
<p>合格的系统存储在数据库中的并不是密码明文，而是密码hash值。而实际上，单纯的把密码采用php函数，如md5,sha1等，加密后存储，会引发很严重的后果。只要正确的进行了hash，攻击者就很难从获取到的hash值中解析出用户密码，你只需要快速的把弱口令密码解决掉，就能把损失降到最低了。</p>
<p>当用户输入用户名和之前设定好的密码，点击登录进行验证后，程序先要根据用户名查询一些额外信息，如密码哈希类型，salt值，哈希重复的次数等，然后根据这些信息算出密码hash值，与已经存储的hash值进行比较，如果相同，则验证成功。</p>
<p><strong>Salt</strong><strong>方法</strong></p>
<p>Salt是一个近乎随机的字符串，相同的密码使用不同的salt hash散列后， 会得到不同的结果，正确的使用这个方法，可以防止一系列的攻击，包括：</p>
<p>1.通过弱口令（如123456）就知道你的hash类型。</p>
<p>2.使用已经算好的hash值去做比对，如cmd5.com。</p>
<p>3.能够准确知道两个用户（或者一个用户的两个帐号）的密码是否是一样的。</p>
<p>Salt通常和密码hash值储存在一起，它并不是保密的。具体案例可参考<a href="http://hi.baidu.com/ling1026/blog/item/ed2580d39f7ea933970a16c0.html" target="_blank">Ucenter</a></p>
<p><strong>算法强度要提升</strong></p>
<p>一旦密码hash值泄漏 ，攻击者必然会采取暴力破解，一般的hash算法，如md5, sha1等，都是为了保证速度，而非为密码加密准备的，这样势必为攻击者缩短暴力破解提供了可能。因此，采取一个略微复杂点的hash算法，能够降低损失。假想下，如果你的每个密码生成时间家长0.2ms，用户不会有任何不好的体验，但对攻击者来说，这意味着什么？他要多付出几个月甚至几年的时间去破解你的密码！</p>
<p><strong>关于phpass</strong></p>
<p>Phpass是基于php的简单易用的密码hash算法框架。它提供三种hash方法，包括两种基于函数crypt()的&#8212;-CRYPT_BLOWFISH 和 CRYPT_EXT_DES，一种phpass自己的类md5的算法，前者只有php5.30以上的版本支持，后者这是全版本皆可。虽然，所有的算法都使用了salt及算法强度提升的方法，但考虑到效果，我们推荐使用前两种。在使用时，用户可以自定义hash迭代的次数。</p>
<p>在使用的时候，phpass能够自动生成salt和对进行算法拓展，你不需要为生成这些而费神。另外，phpass支持windows系统。</p>
<p><strong>安全的接入数据库</strong></p>
<p><strong>SQL</strong><strong>注入</strong></p>
<p>所谓SQL注入，就是通过把SQL命令（特殊字符串，如单引号等）插入到Web表单递交或输入域名或页面请求的查询字符串，最终达到欺骗服务器执行恶意的SQL命令的行为，比如先前的很多会员网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的，这类表单特别容易受到SQL注入式攻击．</p>
<p><strong>如何防止</strong><strong>SQL</strong><strong>注入</strong><strong></strong></p>
<p>　　1.永远不要信任用户的输入。对用户的输入进行转码校验，可以通过正则表达式，或限制长度；对单引号等特殊字符进行转换，如对数据进行url_encode\ stripslashes等。</p>
<p>　　2.永远不要使用动态拼装sql，可以使用参数化的sql或者直接使用存储过程进行数据查询存取。</p>
<p>　　3.永远不要使用管理员权限的数据库连接，为每个应用使用单独的权限有限的数据库连接。（下面有详细说明）</p>
<p>　　4.不要把机密信息直接存放，加密或者hash掉密码和敏感的信息。</p>
<p>　　5.应用的异常信息应该给出尽可能少的提示，最好使用自定义的错误信息对原始错误信息进行包装。</p>
<p>在接下来的例子中 ，如上几点将得以体现。</p>
<p><strong>组建数据库预备语句</strong><strong></strong></p>
<p>目前，php提供三种连接mysql的接口，一种是自带的，被广泛应用的mysql扩展，另外一种是mysqli扩展， 还有一个PDO(PHP Data Objects)接口，只有mysqli和PDO支持MySQL的<a href="http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html" target="_blank">预备语句</a>，而且都需要php5+的支持。本文使用mysqli的方式。</p>
<p>预备语句的使用使数据和代码分离，虽然这并不是最完美的防止sql注入的方法，以为从头到尾，所有的数据都使用相同的socket连接传输，但比传统的语句过滤使用起来更加简单，并且不容易出错。</p>
<p><strong>对数据库采用最小权限原则</strong><strong></strong></p>
<p>除了要预防SQL注入，我们还要预防其它各方面潜在的威胁。好的做法是使用最低权限的数据库帐号，也就是说，不要使用管理员权限的数据库链接，而是为每个应用使用单独的权限的数据库连接。这样，即使你的php代码并不是很“完美”，也可以把网站被攻破而付出最小的代价。</p>
<p>(待续)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/173/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>简评file_get_contents与curl 效率及稳定性</title>
		<link>http://www.71j.cn/archives/140</link>
		<comments>http://www.71j.cn/archives/140#comments</comments>
		<pubDate>Sat, 06 Feb 2010 09:26:48 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=140</guid>
		<description><![CDATA[做过好多抓取别家网站内容的产品，习惯了使用方便快捷的file_get_contents函数，但是总是会遇到获取失败的问题，尽管按照手册中的例子设置了超时，可多数时候不会奏效： $config['context'] = strea... ]]></description>
			<content:encoded><![CDATA[<p>做过好多抓取别家网站内容的产品，习惯了使用方便快捷的file_get_contents函数，但是总是会遇到获取失败的问题，尽管按照手册中的例子设置了超时，可多数时候不会奏效：</p>
<p>$config['context'] = stream_context_create(array(&#8216;http&#8217; =&gt; array(&#8216;method&#8217; =&gt; “GET”,<br />
   &#8217;timeout&#8217; =&gt; 5//这个超时时间不稳定，经常不奏效<br />
   )<br />
  ));</p>
<p>这时候，看一下服务器的连接池，会发现一堆类似的错误，让你头疼万分：</p>
<p>file_get_contents(<a href="http://www.tianya.cn/techforum/content/16/645728.shtml">http://***</a>): failed to open stream&#8230;</p>
<p>不得已，安装了curl库，写了一个函数替换：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> curl_file_get_contents<span style="color: #009900;">&#40;</span><span style="color: #000088;">$durl</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$durl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_TIMEOUT<span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_USERAGENT<span style="color: #339933;">,</span> _USERAGENT_<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_REFERER<span style="color: #339933;">,</span>_REFERER_<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$r</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p>如此，除了真正的网络问题外，没再出现任何问题。</p>
<p>这是别人做过的关于curl和file_get_contents的测试：</p>
<p>file_get_contents抓取google.com需用秒数：</p>
<p>2.31319094<br />
2.30374217<br />
2.21512604<br />
3.30553889<br />
2.30124092</p>
<p>curl使用的时间：</p>
<p>0.68719101<br />
0.64675593<br />
0.64326<br />
0.81983113<br />
0.63956594</p>
<p>差距很大吧？呵呵，从我使用的经验来说，这两个工具不只是速度有差异，稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的curl_file_get_contents函数，不但稳定速度快，还能假冒浏览器欺骗目标地址哦！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/140/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个抓取网站内容的函数，支持301 302跳转</title>
		<link>http://www.71j.cn/archives/112</link>
		<comments>http://www.71j.cn/archives/112#comments</comments>
		<pubDate>Mon, 18 Jan 2010 08:49:04 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[防盗链]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=112</guid>
		<description><![CDATA[我们在抓取网站内容的时候，经常遇到稀奇古怪的防盗链，比如上次碰到一个站的图片地址是假的，访问后要301跳转一次才到真正的图片路径，这个真实的路径又做了防盗措施，判断referer是不... ]]></description>
			<content:encoded><![CDATA[<p>我们在抓取网站内容的时候，经常遇到稀奇古怪的防盗链，比如上次碰到一个站的图片地址是假的，访问后要301跳转一次才到真正的图片路径，这个真实的路径又做了防盗措施，判断referer是不是上个假的图片地址。用curl试了几次，终于整出一个函数，效果不错。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$curl_loops</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//避免死了循环必备</span>
<span style="color: #000088;">$curl_max_loops</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> curl_get_file_contents<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$curl_loops</span><span style="color: #339933;">,</span> <span style="color: #000088;">$curl_max_loops</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$useragent</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl_loops</span><span style="color: #339933;">++</span> <span style="color: #339933;">&gt;=</span> <span style="color: #000088;">$curl_max_loops</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$curl_loops</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>?<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_USERAGENT<span style="color: #339933;">,</span> <span style="color: #000088;">$useragent</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_REFERER<span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ret</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$http_code</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_getinfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLINFO_HTTP_CODE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$last_url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_getinfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLINFO_EFFECTIVE_URL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$http_code</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">301</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$http_code</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">302</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$matches</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/Location:(.*?)\n/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">parse_url</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ?<span style="color: #000088;">$curl_loops</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  ?<span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> 
  <span style="color: #000088;">$new_url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'scheme'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'://'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span>
   <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'?'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$new_url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> curl_get_file_contents<span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$last_url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$curl_loops</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/112/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php curl cookie 存取示例</title>
		<link>http://www.71j.cn/archives/101</link>
		<comments>http://www.71j.cn/archives/101#comments</comments>
		<pubDate>Wed, 02 Dec 2009 05:17:53 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[分享]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=101</guid>
		<description><![CDATA[好多人发来消息询问curl存取cookie文件的问题，杜工并不觉得这是个难点，因为只看手册就可以很容易把握。下面给个例子，看完后就全都明了了： &#60;?php $cookie_jar_index = 'cookie.txt'; &#160; $url = &#... ]]></description>
			<content:encoded><![CDATA[<p>好多人发来消息询问curl存取cookie文件的问题，杜工并不觉得这是个难点，因为只看手册就可以很容易把握。下面给个例子，看完后就全都明了了：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$cookie_jar_index</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'cookie.txt'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://www.71j.cn/perl/login.pl&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$params</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;username=dudu&amp;password=****&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_COOKIEJAR<span style="color: #339933;">,</span> <span style="color: #000088;">$cookie_jar_index</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_POST<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_POSTFIELDS<span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">//curl_setopt($ch, CURLOPT_NOBODY, 1);//这个不能打开，否则无法生成cookie文件</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">ob_clean</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://www.71j.cn/perl/myfavorites.pl&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ch2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch2</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch2</span><span style="color: #339933;">,</span> CURLOPT_COOKIEFILE<span style="color: #339933;">,</span> <span style="color: #000088;">$cookie_jar_index</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//$rs就是返回的内容</span>
<span style="color: #990000;">ob_clean</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/101/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>discuz 7.2 嵌套外站用户通行证详解</title>
		<link>http://www.71j.cn/archives/97</link>
		<comments>http://www.71j.cn/archives/97#comments</comments>
		<pubDate>Sat, 21 Nov 2009 17:08:28 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[通行证]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=97</guid>
		<description><![CDATA[当我们使用discuz架设论坛的时候，往往需要把全站用户打通，即让其它产品线的用户与论坛无缝衔接起来。下面我来介绍下具体实现步骤。 Step 1 修改/register.php，在最开始加入： require_once './inc... ]]></description>
			<content:encoded><![CDATA[<p>当我们使用discuz架设论坛的时候，往往需要把全站用户打通，即让其它产品线的用户与论坛无缝衔接起来。下面我来介绍下具体实现步骤。</p>
<p><strong>Step 1 </strong><br />
修改/register.php，在最开始加入：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'./include/common.inc.php'</span><span style="color: #339933;">;</span>
 <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;location:http://passport.通行证注册url/register.php?forward=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$boardurl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
 <span style="color: #339933;">.....</span></pre></div></div>

<p>目的是屏蔽discuz的注册入口，让用户调转到统一的通行证注册页面去。</p>
<p>同时不要忘记修改/include/js/common.js中的函数showWindow:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> showWindow<span style="color: #009900;">&#40;</span>k<span style="color: #339933;">,</span> url<span style="color: #339933;">,</span> mode<span style="color: #339933;">,</span> cache<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>k <span style="color: #339933;">==</span> <span style="color: #3366CC;">'register'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
 location.<span style="color: #660066;">href</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'/register.php'</span><span style="color: #339933;">;</span>
 <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 ....</pre></div></div>

<p>这样注册入口就全都跳转到通行证的注册页面了。</p>
<p><strong>Step 2</strong><br />
在include/common.inc.php最后添加上判断代码，假定统一通行证的用户cookie为$_COOKIE["UserInfo"]：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$discuz_uid</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;UserInfo&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #990000;">parse_str</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;UserInfo&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$cookie_info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//解析出用户信息，让dologin.php的处理</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;location:http://&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;HTTP_HOST&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/ dologin.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Step 3</strong><br />
下面是关键内容。在论坛根目录下创建dologin.php,内容及功能解释如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'./include/common.inc.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> DISCUZ_ROOT <span style="color: #339933;">.</span> <span style="color: #0000ff;">'./uc_client/client.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// COOKIE验证</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;UserInfo&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//用户如果已经登录过，下面用统一通行证的cookie处理方法解析出用户信息</span>
<span style="color: #000088;">$username</span> <span style="color: #339933;">=</span> <span style="color: #339933;">.....;</span>
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #339933;">......;</span>
<span style="color: #000088;">$email</span> <span style="color: #339933;">=</span> <span style="color: #339933;">......;</span>
<span style="color: #000088;">$ResultCode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// 如果从论坛登录，则需要统一通行证验证</span>
<span style="color: #000088;">$username</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;password&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 验证</span>
<span style="color: #000088;">$ResultCode</span> <span style="color: #339933;">=</span> <span style="color: #339933;">....</span><span style="color: #666666; font-style: italic;">//如果验证成功返回0</span>
<span style="color: #000088;">$email</span> <span style="color: #339933;">=</span> <span style="color: #339933;">....;</span><span style="color: #666666; font-style: italic;">//从通行证取到用户email</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ResultCode</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// 先看DZ用户表里是否有这条,如果有,且密码不一样，则更新密码（防止出现通行证用户修改密码后,DZ不能登陆）;没有新插入一条</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$loginfield</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$isuid</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$loginfield</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$isuid</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$isuid</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$ucresult</span> <span style="color: #339933;">=</span> uc_user_login<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$isuid</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$questionid</span><span style="color: #339933;">,</span> <span style="color: #000088;">$answer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tmp</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tmp</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tmp</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$duplicate</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> daddslashes<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ucresult</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ucresult</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$duplicate</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$olduid</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">result_first</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT uid FROM <span style="color: #006699; font-weight: bold;">{$tablepre}</span>members WHERE username='&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">require_once</span> DISCUZ_ROOT <span style="color: #339933;">.</span> <span style="color: #0000ff;">'./include/membermerge.func.php'</span><span style="color: #339933;">;</span>
membermerge<span style="color: #009900;">&#40;</span><span style="color: #000088;">$olduid</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
uc_user_merge_remove<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// 用户不存在，或者被删除</span>
<span style="color: #000088;">$uid</span> <span style="color: #339933;">=</span> uc_user_register<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$email</span><span style="color: #339933;">,</span> <span style="color: #000088;">$questionid</span><span style="color: #339933;">,</span> <span style="color: #000088;">$answer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$onlineip</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$uid</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
fail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$inviteconfig</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT * FROM <span style="color: #006699; font-weight: bold;">{$tablepre}</span>settings WHERE variable IN ('bbrules', 'bbrulestxt', 'welcomemsg', 'welcomemsgtitle', 'welcomemsgtxt', 'inviteconfig')&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$setting</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">fetch_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$$setting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'variable'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$setting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'value'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$invitecode</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$regstatus</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$invitecode</span> ? dhtmlspecialchars<span style="color: #009900;">&#40;</span><span style="color: #000088;">$invitecode</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$regstatus</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$inviterewardcredit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$inviteaddcredit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$invitedaddcredit</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #339933;">@</span><span style="color: #990000;">extract</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$inviteconfig</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$groupinfo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">fetch_first</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT groupid, allownickname, allowcstatus, allowcusbbcode, allowsigbbcode, allowsigimgcode, maxsigsize FROM <span style="color: #006699; font-weight: bold;">{$tablepre}</span>usergroups WHERE &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$regverify</span> ? <span style="color: #0000ff;">&quot;groupid='8'&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;creditshigher&lt;=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$initcredits</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; AND &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$initcredits</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;creditslower LIMIT 1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$secques</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$questionid</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> ? random<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$idstring</span> <span style="color: #339933;">=</span> random<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$authstr</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$regverify</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span> ? <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$timestamp</span><span style="color: #000099; font-weight: bold;">\t</span>2<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">$idstring</span>&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span>random<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO <span style="color: #006699; font-weight: bold;">{$tablepre}</span>members (uid, username, password, secques, adminid, groupid, regip, regdate, lastvisit, lastactivity, posts, credits, extcredits1, extcredits2, extcredits3, extcredits4, extcredits5, extcredits6, extcredits7, extcredits8, email, showemail, timeoffset, pmsound, invisible, newsletter)
VALUES ('<span style="color: #006699; font-weight: bold;">$uid</span>', '<span style="color: #006699; font-weight: bold;">$username</span>', '<span style="color: #006699; font-weight: bold;">$password</span>', '<span style="color: #006699; font-weight: bold;">$secques</span>', '0', '<span style="color: #006699; font-weight: bold;">$groupinfo[groupid]</span>', '<span style="color: #006699; font-weight: bold;">$onlineip</span>', '<span style="color: #006699; font-weight: bold;">$timestamp</span>', '<span style="color: #006699; font-weight: bold;">$timestamp</span>', '<span style="color: #006699; font-weight: bold;">$timestamp</span>', '0', <span style="color: #006699; font-weight: bold;">$initcredits</span>, '<span style="color: #006699; font-weight: bold;">$email</span>', '0', '9999', '1', '0', '1')&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;REPLACE INTO <span style="color: #006699; font-weight: bold;">{$tablepre}</span>memberfields (uid, authstr <span style="color: #006699; font-weight: bold;">$fieldadd1</span>) VALUES ('<span style="color: #006699; font-weight: bold;">$uid</span>', '<span style="color: #006699; font-weight: bold;">$authstr</span>' <span style="color: #006699; font-weight: bold;">$fieldadd2</span>)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// 密码错</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>uc_user_edit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$email</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
fail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uid</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$email</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> uc_get_user<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$uid</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uid'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$member</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">fetch_first</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT m.uid AS discuz_uid, m.username AS discuz_user, m.password AS discuz_pw, m.secques AS discuz_secques,
m.email, m.adminid, m.groupid, m.styleid, m.lastvisit, m.lastpost, u.allowinvisible
FROM <span style="color: #006699; font-weight: bold;">{$tablepre}</span>members m LEFT JOIN <span style="color: #006699; font-weight: bold;">{$tablepre}</span>usergroups u USING (groupid)
WHERE m.uid='<span style="color: #006699; font-weight: bold;">$ucresult[uid]</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$member</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// 需要激活</span>
fail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_userss'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_user'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_user'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_user'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$member</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$var</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$ucresult</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE <span style="color: #006699; font-weight: bold;">{$tablepre}</span>members SET email='<span style="color: #006699; font-weight: bold;">$ucresult[email]</span>' WHERE uid='<span style="color: #006699; font-weight: bold;">$ucresult[uid]</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$questionid</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_secques'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'discuz_secques'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> random<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">-&gt;</span> <span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE <span style="color: #006699; font-weight: bold;">{$tablepre}</span>members SET secques='<span style="color: #006699; font-weight: bold;">$GLOBALS[discuz_secques]</span>' WHERE uid='<span style="color: #006699; font-weight: bold;">$ucresult[uid]</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'styleid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'styleid'</span><span style="color: #009900;">&#93;</span> ? <span style="color: #000088;">$member</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'styleid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$_DCACHE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'settings'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'styleid'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$cookietime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cookietime'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cookietime'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
dsetcookie<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'cookietime'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cookietime</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">31536000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
dsetcookie<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth'</span><span style="color: #339933;">,</span> authcode<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$member[discuz_pw]</span><span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">$member[discuz_secques]</span><span style="color: #000099; font-weight: bold;">\t</span><span style="color: #006699; font-weight: bold;">$member[discuz_uid]</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ENCODE'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cookietime</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
dsetcookie<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'loginuser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
dsetcookie<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'activationauth'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
dsetcookie<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pmnum'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sessionexists'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_DCACHE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'settings'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'frameon'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_DCOOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'frameon'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'yes'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'extrahead'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;script&gt;if(top != self) {parent.leftmenu.location.reload();}&lt;/script&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$ucsynlogin</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$allowsynlogin</span> ? uc_user_synlogin<span style="color: #009900;">&#40;</span><span style="color: #000088;">$discuz_uid</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$inajax</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$msgforward</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msgforward</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$mrefreshtime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msgforward</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'refreshtime'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include_once</span> DISCUZ_ROOT <span style="color: #339933;">.</span> <span style="color: #0000ff;">'./forumdata/cache/cache_usergroups.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$usergroups</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_DCACHE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usergroups'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$groupid</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'grouptitle'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">include</span> template<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$groupid</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
showmessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'login_succeed_inactive_member'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'memcp.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
showmessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'login_succeed'</span><span style="color: #339933;">,</span> dreferer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
fail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> fail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
showmessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'undefined_action'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'HALTED'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>Step 4</strong></p>
<p>在用户登录时，要清掉通行证的cookie。需要修改logging.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'logout'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$formhash</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_DCACHE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'settings'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'frameon'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_DCOOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'frameon'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'yes'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000088;">$extrahead</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;script&gt;if(top != self) {parent.leftmenu.location.reload();}&lt;/script&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$formhash</span> <span style="color: #339933;">!=</span> FORMHASH<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
showmessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'logout_succeed'</span><span style="color: #339933;">,</span> dreferer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$ucsynlogout</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$allowsynlogin</span> ? uc_user_synlogout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
clearcookies<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">setcookie</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UserInfo&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3600</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;.xxx.com&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//删除通行证那边的cookie</span></pre></div></div>

<p>上面四步完成后，清掉discuz的数据和模板缓存就大功告成了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/97/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用php进行svn更新代码，支持断点续传</title>
		<link>http://www.71j.cn/archives/91</link>
		<comments>http://www.71j.cn/archives/91#comments</comments>
		<pubDate>Sat, 21 Nov 2009 09:03:12 +0000</pubDate>
		<dc:creator>杜工</dc:creator>
				<category><![CDATA[感悟]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://71j.cn/?p=91</guid>
		<description><![CDATA[本空间用的虚拟主机特别恶心，ftp不好用，又不支持ssh， php的安全级别又设置的比较高，导致杜工每次更新代码都特别费劲。琢磨了半天，想出了一个办法，就是直接从svn下载代码到服务器，... ]]></description>
			<content:encoded><![CDATA[<p>本空间用的虚拟主机特别恶心，ftp不好用，又不支持ssh， php的安全级别又设置的比较高，导致杜工每次更新代码都特别费劲。琢磨了半天，想出了一个办法，就是直接从svn下载代码到服务器，这样就可以更新wordpress了。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #339933;">@</span><span style="color: #990000;">set_time_limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// $svnurl = &quot;http://core.svn.wordpress.org/trunk/&quot;;</span>
<span style="color: #000088;">$svnurl</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://svn.automattic.com/wordpress/trunk/&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$nowversion</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;version.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$basedir</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;../71j/&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>]&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$svnurl</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$v</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/Revision\s*([0-9]+)/&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$nowversion</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;You have the latest version!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
 getdir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;version.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> getdir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$svnurl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$basedir</span><span style="color: #339933;">;</span>
 <span style="color: #000088;">$log</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;log.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$log</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$svnurl</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/&lt;li&gt;&lt;a\s+href=<span style="color: #000099; font-weight: bold;">\&quot;</span>.+?<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;(.+?)&lt;\/a&gt;&lt;\/li&gt;/i&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;..&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;.&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span><span style="color: #339933;">,</span> <span style="color: #000088;">$log</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">end</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$log</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span><span style="color: #339933;">,</span> <span style="color: #208080;">0777</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$svnurl</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;log.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$basedir</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> FILE_APPEND<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
   getdir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pos</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&gt;</span></pre></div></div>

<p>使用前要在本文件目录下放一个version.txt，记录svn版本号，同时要清空log.txt，因为这个记录断点续用的。</p>
<p>代码比较简陋，可以根据自己需要加以改进。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.71j.cn/archives/91/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

