CURL 是 Client URL Library Functions 的缩写,由 Daniel Stenberg 创建,更多内容可以参考他的网站。最近几天突然对 HTTP 采集有了兴趣。之前我在做这方面程序,一般通过两种方法,一个是利用 PHP 自身的文件操作函数。PHP 的 fopen,readfile ,file_get_contents都是可以支持 http 协议的,这样可以很方便的获取互联网上的内容。另一种方法是通过 PHP 的 Socket 函数,这个方法的好处是对各种协议都可以支持,缺点是使用起来比较麻烦,要对协议有一定的了解。在 HTTP 获取方面,运用 Socket 的 Snoopy 类是一个非常好用的 PHP  HTTP 客户端,也是我原来最常用的方法。

随便翻翻 PHP 手册就会发现,PHP 本身可以支持 libcurl。用 C/C++ 写成的 libcurl 相比 Snoopy 更快速更可靠,而且除了 HTTP 协议外,还广泛支持其他协议( https, ftp, ladp 等等)。libcurl 并不是 PHP 默认加载的模块,具体如何启用可以参考 PHP 手册,这里就不多说了。PHP libcurl 使用非常简单,例如:

<?php
$ch = curl_init("http://www.php.net");
curl_exec($ch);
curl_close($ch);
?>

三行简单的程序就可以完成对 http://www.php.net 页面的读取并输出。当然更多的用法可以参考 PHP 手册。这里只说说我在写程序时遇到的一个问题,例如下面的程序:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容
curl_exec($ch); //执行 (1)
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容
curl_exec($ch); //执行 (2)
curl_close($ch);
?>

按照我的想法,程序应该可以分别返回 HTTP 响应报头和页面的内容。可是上面这段程序执行结果为:(1)处正常返回 HTTP 响应报头,(2)不会返回任何内容。查了很多资料都没有提到这个问题。最终无奈,只好在读取

(2)之前重新执行 curl_init(),即将上程序改成这样:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容
curl_exec($ch); //执行 (1)
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容
curl_exec($ch); //执行 (2)
curl_close($ch);
?>

返回结果正常。虽然可以通过这种方法解决问题,但对这个现象我感觉非常的奇怪。是 libcurl 本身的问题,还是我使用的方法不当呢?还希望熟悉 curl 的朋友帮忙指正一下。

PHP采集curl应用的一点小疑惑的更多相关文章

  1. 大一上学期的一点小疑惑,代码验证ok

    #include<iostream> using namespace std; class test { int *p; int pn; public: test(int n) { p = ...

  2. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

  3. 关于PHP魔术方法__call的一点小发现

    好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...

  4. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  5. C与C++在形參的一点小差别

    先看一下以下的代码: int fun(a,b) int a; int b; { return 10; } void main(int argc, char ** argv) { fun(10); re ...

  6. Django开发简单采集用户浏览器信息的小功能

    Django开发简单采集用户浏览器信息的小功能 Centos环境准备 yum install –y python-pip export http_proxy=http://10.11.0.148:80 ...

  7. BUI Webapp用于项目中的一点小心得

    接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...

  8. 这几天帮一个朋友解决了一点小问题(RF的有些小问题及解决过程)

    最近涉猎自动化太少了,以至于都不经常更新了.最近一个朋友在做移动端自动化的时候遇到了一些小问题来找我解决.本人也不是很精通,只是接触的时间长了一点了.下面就是一些问题和解决过程: 1.她刚过来的时候, ...

  9. 关于openssl几个API的一点小收获

    今天心血来潮突然想搞搞openssl了,趁着端午小假,刚好有空可以鼓捣孤岛自己喜欢的东西,出去东奔西跑的实在太造孽了,还是宅起来给自己充充电吧.下载openssl最新代码1.0.1g,修复了" ...

随机推荐

  1. 更改计算机名称后 导致 sql server 2008 R2 用windows账户不能附加的错误解决办法

    出错背景:本人想用sql server 2008 R2 附加sql server 2005数据库出现拒绝访问,后查询网站得知,要用windows身份验证方式登录进去附加, 然后我就用windows身份 ...

  2. 发一份shiro标准配置,特此记录

    主要还是整合了本地ehcache,集群session管理过段时间放出 <?xml version="1.0" encoding="UTF-8"?> ...

  3. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  4. Sublime中Markdown的安装与使用

    摘要:为什么用它,因为用markdown写出来的东西很好看,展示下:isujin.com(差不多就是这个样子啦,好看不?) 网页版Markdown编辑器有: 简书 jianshu.com等 客户端Ma ...

  5. js阿拉伯数字转中文大写

    function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法"; var unit = "千百 ...

  6. ajax给全局变量赋值问题解决示例

    今天在做项目时,遇到了一个问题.我用的是ajax,要在 ajax里面给一个全局变量赋值,结果死活赋值不上,纠结了好半天,后来上网查了查,才 知道,ajax默认是异步请求,(当要赋值时,此时的值没有拿到 ...

  7. iframe多层嵌套时获取元素总结

    父页面获取子页面元素: 注意:onload事件 jQuery获取: $("iframe").contents().find("holder")......; ( ...

  8. VS2012的调试插件Image Watch,opencv编程神器

    今天配置 opencv3.0 时无意中看到 Image Watch 这样一个VS2012的调试插件,适用了下,特别好用. 部分链接: Image Watch 的 下载链接 OpenCV关于ImageW ...

  9. .NET Web API 新手遇到的那些“坑”

    以前一直做web项目,用的mvc.最近公司需要上线APP,准备用webAPI做接口,用习惯了MVC,API还是有好多细节的地方感觉很“坑”... 第一个坑,webAPI的默认路由规则不一样,通过命名来 ...

  10. 详解AsyncTask的使用

    转载自:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. ...