php 之 cURL
手册是最好的老师 多看手册吧 骚年: Client URL Library
转文 : 基于PHP的cURL使用入门
介绍: cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。PHP提供了对cURL 库的支持。
1. 为什么使用cURL
为了获取网页内容,我们当然可以使用file_get_contents、 file、readfile等函数,但它们缺乏灵活性和有效的错误处理。而且,也不能完成一些高难度任务—如处理coockies、验证、表单提交、文件上传等。PHP获取网页内容的更多方法:http://www.ucooper.com/php-get-webpage-content.html
2. PHP中建立cURL请求的基本步骤
- 初始化
- 设置选项
- 执行并获取结果
- 释放cURL句柄
// 1. 初始化 $ch = curl_init ( ) ; // 2. 设置选项,包括URL curl_setopt ( $ch , CURLOPT_URL, "http://www.ucooper.com" ) ; // 需要获取的URL地址,也可以在 curl_init()函数中设置。 curl_setopt ( $ch , CURLOPT_RETURNTRANSFER, 1 ) ; // 将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt ( $ch , CURLOPT_HEADER, 0 ) ; // 启用时会将头文件的信息作为数据流输出。 // 3. 执行并获取HTML文档内容 $output = curl_exec ( $ch ) ; // 4. 释放curl句柄 curl_close ( $ch ) ;
- CURLOPT_URL:目标URL
- CURLOPT_PORT:目标端口
- CURLOPT_RETURNTRANSFER:把输出转化为字符串,而不是直接输出到屏幕
- CURLOPT_HTTPHEADER:请求头信息,参数是一数组,如“基于浏览器的重定向”例子所示
- CURLOPT_FOLLOWLOCATION: 跟随重定向
- CURLOPT_FRESH_CONNECT:强制重新获取内容,而不是从缓存
- CURLOPT_HEADER:包含头部
- CURLOPT_NOBODY:输出中不包含网页主体内容
- CURLOPT_POST:进行post表单提交
- CURLOPT_POSTFIELDS:POST提交的字段,参数是一数组,如“ 用POST方法发送数据 ”所示
- CURLOPT_PROXY:代理设置,IP 和 端口
- CURLOPT_PROXYUSERPWD:代理设置,用户名和密码
- CURLOPT_PROXYTYPE:代理类型,http 或 socket
3.检查错误
$output = curl_exec ( $ch ) ; if ( $output === FALSE ) { echo "cURL Error: " . curl_error ( $ch ) ; }
4.获取信息
curl_exec ( $ch ) ; $info = curl_getinfo ( $ch ) ; echo '获取' . $info [ 'url' ] . '耗时' . $info [ 'total_time' ] . '秒' ;
返回的数组中包括了以下信息:
1 “url” //资源网络地址 2 “content_type” //内容编码 3 “http_code” //HTTP状态码 4 “header_size” //header的大小 5 “request_size” //请求的大小 6 “filetime” //文件创建时间 7 “ssl_verify_result” //SSL验证结果 8 “redirect_count” //跳转技术 9 “total_time” //总耗时 10 “namelookup_time” //DNS查询耗时 11 “connect_time” //等待连接耗时 12 “pretransfer_time” //传输前准备耗时 13 “size_upload” //上传数据的大小 14 “size_download” //下载数据的大小 15 “speed_download” //下载速度 16 “speed_upload” //上传速度 17 “download_content_length”//下载内容的长度 18 “upload_content_length” //上传内容的长度 19 “starttransfer_time” //开始传输的时间 20 “redirect_time”//重定向耗时
5.基于浏览器的重定向
在第一个例子中,我们将提供一段用于侦测服务器是否有基于浏览器的重定向的代码。例如,有些网站会根据是否是手机浏览器甚至用户来自哪个国家来重定向网页。
我们利用 CURLOPT_HTTPHEADER 选项来设定我们发送出的HTTP请求头信息(http headers),包括user agent信息和默认语言。然后我们来看看这些特定网站是否会把我们重定向到不同的URL。
// 测试用的URL $urls = array ( "http://www.cnn.com" , "http://www.mozilla.com" , "http://www.facebook.com" ) ; // 测试用的浏览器信息 $browsers = array ( "standard" => array ( "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)" , "language" => "en-us,en;q=0.5" ) , "iphone" => array ( "user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3" , "language" => "en" ) , "french" => array ( "user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)" , "language" => "fr,fr-FR;q=0.5" ) ) ; foreach ( $urls as $url ) { echo "URL: $url /n " ; foreach ( $browsers as $test_name => $browser ) { $ch = curl_init ( ) ; // 设置 url curl_setopt ( $ch , CURLOPT_URL, $url ) ; // 设置浏览器的特定header curl_setopt ( $ch , CURLOPT_HTTPHEADER, array ( "User-Agent: {$browser['user_agent']} " , "Accept-Language: {$browser['language']} " ) ) ; // 页面内容我们并不需要 curl_setopt ( $ch , CURLOPT_NOBODY, 1 ) ; // 启用时将不对HTML中的BODY部分进行输出。 // 只需返回HTTP header curl_setopt ( $ch , CURLOPT_HEADER, 1 ) ; // 返回结果,而不是输出它 curl_setopt ( $ch , CURLOPT_RETURNTRANSFER, 1 ) ; // 将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
$output = curl_exec ( $ch ) ; curl_close ( $ch ) ; // 有重定向的HTTP头信息吗?
if ( preg_match ( "!Location: (.*)!" , $output , $matches ) ) {
echo "$test_name : redirects to $matches[1] /n " ;
} else {
echo "$test_name : no redirection/n " ;
}
}
echo "/n /n " ;
}