phpcurl模块
1 概述
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
为什么不用socket?
curl,是client url的简写,用来模拟浏览器的功能,浏览器能做的它基本都能实现,登陆,上传文件,下载…
socket可以理解为通信链的句柄,比CURL更底层一点
某些时候我们可能更需要简单模拟下浏览器功能即可,所以用CURL
到底能干什么??
sample : http://haku.hk/?p=2177 飞信API
2 安装
1. 编译方式安装
./configure –prefix=%PHP_DIR% –with-curl
make
make install
- 模块安装
复制mod_curl.so到module目录
修改php.ini
加入module=mod_curl.so
然后重启apache服务器
用phpinfo如果能看到就说明安装成功
3 使用例子
$curl= curl_init();
curl_setopt($curl, CURLOPT_URL, “http://baidu.com”);
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页
$data = curl_exec($curl);
在执行curl_exec的时候会阻塞线程,直到返回结果
cookie的使用可以用
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
或者从响应头拆分set-cookie出来
7.4 关于CURL_MULTI
考虑如下情形,你需要从google.com.hk和baidu.com拿到他们的首页资料
前面已经说过执行curl_exec(的时候会阻塞线程。如果使用它,相当于分两次请求,每次1个网站。
平均执行时间如下
用wiresharp抓包可以发现系统的两个请求,第二个等待第一个返回后才发出的
curl_ multi的功能是并发地执行几个请求
curl_multi_exec($mh,$running);
这个函数是非阻塞的,返回的$running是表示当前是否还有正在处理的curl进程
之前的代码改用multi_exec实现
平均结果为
用wiresharp抓包可以看到系统同时发出了两个请求
5 附录:TIPS
- 命令行版的CURL的使用参考
a) http://www.ruanyifeng.com/blog/2011/09/curl.html
b) http://curl.haxx.se/docs/httpscripting.html
- 超时设置
CURLOPT_CONNCETTIMEOUT_MS支持毫秒级别的超时
不过只有在CURL7.16.2和5.2.3同时满足的情况下才可用
这个好像就是用来做坏事的,以前用过一次,倒是抓出东西了,但是我不知道怎么转编码……
熊猫
15 11月 11 at 8:29 下午
有个函数iconv
princehaku
15 11月 11 at 9:05 下午
这个好,比起很多新手拿着那个那个坑爹的fopen(url)来得实际
p.jiaxu
7 1月 12 at 10:31 下午