<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿Tim日志]]></title> 
<link>https://atim.cn/index.php</link> 
<description><![CDATA[专业的php开发者.开发团队的带队人]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿Tim日志]]></copyright>
<item>
<link>https://atim.cn/post//</link>
<title><![CDATA[关于 CURL 的几点心得]]></title> 
<author>bkkkd &lt;partybase@gmail.com&gt;</author>
<category><![CDATA[开发应用]]></category>
<pubDate>Mon, 06 Feb 2006 10:47:56 +0000</pubDate> 
<guid>https://atim.cn/post//</guid> 
<description>
<![CDATA[ 
	<p>CURL 是 Client URL Library Functions 的缩写，由 Daniel Stenberg 创建，更多内容可以参考<a href="http://curl.haxx.se/">他的网站</a>。最近几天突然对 HTTP 采集有了兴趣。之前我在做这方面程序，一般通过两种方法，一个是利用 PHP 自身的文件操作函数。PHP 的 fopen，readfile 都是可以支持 http 协议的，这样可以很方便的获取互联网上的内容。另一种方法是通过 PHP 的 Socket 函数，这个方法的好处是对各种协议都可以支持，缺点是使用起来比较麻烦，要对协议有一定的了解。在 HTTP 获取方面，运用 Socket 的 Snoopy 类是一个非常好用的 PHP HTTP 客户端，也是我原来最常用的方法。</p><p>随便翻翻 PHP 手册就会发现，PHP 本身可以支持 libcurl。用 C/C++ 写成的 libcurl 相比 Snoopy 更快速更可靠，而且除了 HTTP 协议外，还广泛支持其他协议（ https, ftp, ladp 等等）。libcurl 并不是 PHP 默认加载的模块，具体如何启用可以参考 PHP 手册，这里就不多说了。PHP libcurl 使用非常简单，例如：</p><p><code><br />&lt;?php<br />$ch = curl_init(&quot;http://www.php.net&quot;);<br />curl_exec($ch);<br />curl_close($ch);<br />?&gt;<br /></code></p><p>三行简单的程序就可以完成对 http://www.php.net 页面的读取并输出。当然更多的用法可以参考 PHP 手册。这里只说说我在写程序时遇到的一个问题，例如下面的程序：</p><p><code><br />&lt;?php<br />$ch = curl_init();<br />curl_setopt($ch, CURLOPT_URL, &quot;http://www.php.net&quot;); //指定读取 php.net<br />curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头<br />curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容<br />curl_exec($ch); //执行 (1)<br />curl_setopt($ch, CURLOPT_URL, &quot;http://www.php.net&quot;); //指定读取 php.net<br />curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头<br />curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容<br />curl_exec($ch); //执行 (2)<br />curl_close($ch);<br />?&gt;<br /></code></p><p>按照我的想法，程序应该可以分别返回 HTTP 响应报头和页面的内容。可是上面这段程序执行结果为：（1）处正常返回 HTTP 响应报头，（2）不会返回任何内容。查了很多资料都没有提到这个问题。最终无奈，只好在读取（2）之前重新执行 curl_init()，即将上程序改成这样：</p><p><code><br />&lt;?php<br />$ch = curl_init();<br />curl_setopt($ch, CURLOPT_URL, &quot;http://www.php.net&quot;); //指定读取 php.net<br />curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头<br />curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容<br />curl_exec($ch); //执行 (1)<br />curl_close($ch);<br />$ch = curl_init();<br />curl_setopt($ch, CURLOPT_URL, &quot;http://www.php.net&quot;); //指定读取 php.net<br />curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头<br />curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容<br />curl_exec($ch); //执行 (2)<br />curl_close($ch);<br />?&gt;<br /></code></p><p>返回结果正常。虽然可以通过这种方法解决问题，但对这个现象我感觉非常的奇怪。是 libcurl 本身的问题，还是我使用的方法不当呢？还希望熟悉 curl 的朋友帮忙指正一下。</p>
]]>
</description>
</item><item>
<link>https://atim.cn/post//#blogcomment</link>
<title><![CDATA[[评论] 关于 CURL 的几点心得]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://atim.cn/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>