cURL是什么?
cURL是利用URL语法在命令行方式下工作的开源文件传输工具。它支持很多协议:FTP,FTPS,HTTPS,GOPHER,TELNET,DICT,FILE以及LDAP等
CURL可以说是一个下载工具,因为支持多种网络形式的上传下载以及各种网络传输方式来在网络中获取你想要获取的任何东西;
比如PHP支持CURL库,免去了安装CURL的麻烦,具体使用如下:
我们可以使用简单的PHP函数来获取网页内容,代码如下:
$content=file_get_contents('http://www.test.com');//将整个文件读入一个字符串中
//或者使用
$contents=file('http://www.test.com');//返回数组,数组中每个单元都是文件中相应的一行,包括换行符在内。
//或者使用
readfile('http://www.test.com');//将文件写入输出缓冲,使用echo可以输出
以上方法只能被动的读取文件,别不能灵活和有效拿来使用。那么怎么又能拿到内容,又能进行操作呢?cURL的强大之处就显示出来了,一一道来。
cURL是一种功能强大的库,支持网络传输过程中的不同协议,选项,能提供URL请求相关的各种细节信息。
PHP使用cURL基本步骤如下:
1.初始化
2.设置变量
3.执行并获取结果
4.释放cURL句柄
//初始化
$ch=curl_init();
//设置选项,包括URL
curl_setopt($ch,CUPLOPT_UTL,'http://www.test.com');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
//3.执行并获取HTML文档内容
$output=cur_exec($ch);
//4.释放curl句柄
curl_close($ch);
curl_setopt常用参数,请参考:点击打开链接
curl_setopt设置是最为重要的,cURL参数可供设置,它们能指定URL请求的各个细节;
比如:
//检查错误,你可以加一段检查错误的语句
$output=curl_exec($ch);
if($output===false){
echo 'cURL Error:'.curl_error($ch);//cur_error()方法为返回一条最近一次cURL操作明确的文本的错误信息,不同的错误代码有不同的含义
}//注意使用'===',而不是'=='我们要判断返回不是空输出而是CURL报错的布尔值false;才是真正的报错信息。
CURL错误代码及含义,请参考: 点击打开链接
//获取信息,该设置项能够在cURL执行后获取这一请求的有关信息;
curl_exec($ch);
$info=curl_getinfo($ch);
echo '获取'.$info['url'].'耗时'.$info['total_time'].'秒';
$cur_getinfo返回的数组包括了一下信息:
- “url” //资源网络地址
- “content_type” //内容编码
- “http_code” //HTTP状态码
- “header_size” //header的大小
- “request_size” //请求的大小
- “filetime” //文件创建时间
- “ssl_verify_result” //SSL验证结果
- “redirect_count” //跳转技术
- “total_time” //总耗时
- “namelookup_time” //DNS查询耗时
- “connect_time” //等待连接耗时
- “pretransfer_time” //传输前准备耗时
- “size_upload” //上传数据的大小
- “size_download” //下载数据的大小
- “speed_download” //下载速度
- “speed_upload” //上传速度
- “download_content_length”//下载内容的长度
- “upload_content_length” //上传内容的长度
- “starttransfer_time” //开始传输的时间
- “redirect_time”//重定向耗时
实例:
这段实例是用于侦测服务器是否有基于浏览器的重定向的代码。例如,有些网站会根据是否是手机浏览器甚至用户来自哪个国家来重定向页面。
我们可以利用CURLOPT_HTTPHEADER选项来设定我们发送出去请求头信息,包括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);
// 只需返回HTTP header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回结果,而不是输出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$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";
}
首先,我们建立一组需要测试的URL,接着指定一组需要测试的浏览器信息。最后通过循环测试各种URL和浏览器匹配可能产生的情况。
因为我们指定了cURL选项,所以返回的输出内容则只包括HTTP头信息(被存放于 $output 中)。利用一个简单的正则,我们检查这个头信息中是否包含了“Location:”字样。
运行这段代码应该会返回如下结果:
我们用了三个网站做了测试,并模拟了三种浏览器,用curl设置了不同的请求头,不同的请求头来访问网站后,不同的网站对不同的浏览器类型进行了重定向操作,curl通过
curl_setopt($ch,CURLOPT_HEADER,1)设置获取了响应头,其中就包含了重定向信息。
实例2:用POST方法发送数据
当发起GET请求时,数据可以通过‘查询字串’传递给一个URL(如:www.test.com/index.php?ac=upload);
这种情况不需要用cURL来模拟,把这个url用file_get_contents()l就能得到相同结果。
不过有些HTML表单时用post方法提交的。这种表单提交时,数据是通过http请求体发送的,而不是查询字符串。post方式参数是不可见的。
你可以用php脚本模拟这种URL请求,首先,新建一个可以接受并显示POST数据的文件,命名为post_output.php:
print_r($_POST);
以下是一段PHP来执行CURL请求:
$url='http://localhost/put_output.php'
$post_data=array(
'foo'=>'bar',
'query'=>'nettuts',
'action'=>'submit'
);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//这里在POST数据了,设置这里是要POST数据的
curl_setopt($ch,CURLOPT_POST,1);
//将Post参数放置到curl请求中
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
$output=curl_exec($ch);
cur_close($ch);
echo $output;
执行以上代码会得到以下结果:
![]()