Big Bug Ban

兴趣 践行 创新

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

  1. 模块安装

复制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

  1. 命令行版的CURL的使用参考

a)        http://www.ruanyifeng.com/blog/2011/09/curl.html

b)        http://curl.haxx.se/docs/httpscripting.html

  1. 超时设置

CURLOPT_CONNCETTIMEOUT_MS支持毫秒级别的超时

不过只有在CURL7.16.2和5.2.3同时满足的情况下才可用


Written by princehaku

11月 15th, 2011 at 7:48 下午

Posted in php

with 3 comments

3 Responses to 'phpcurl模块'

Subscribe to comments with RSS or TrackBack to 'phpcurl模块'.

  1. 这个好像就是用来做坏事的,以前用过一次,倒是抓出东西了,但是我不知道怎么转编码……

    熊猫

    15 11月 11 at 8:29 下午

  2. 有个函数iconv

    princehaku

    15 11月 11 at 9:05 下午

  3. 这个好,比起很多新手拿着那个那个坑爹的fopen(url)来得实际

    p.jiaxu

    7 1月 12 at 10:31 下午

Leave a Reply