Php的curl库介绍
Curl是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FEP、TELNET等。很多小偷程序都是使用这个函数。
Curl是一种功能强大的库,支持很多不同的协议、选项,能提供URL请求相关的各种细节信息。
首先,我们得先要确定我们的php是否开启了这个库,你可以使用phpinfo()函数来得到这一信息。
<?php phpinfo();
如果你可以在网页上看到下面的输出,那么表示curl库已被开启。
如果你没有看到的话,那么你需要设置你的php并开启这个库。如果你是在windows平台下,那么非常的简单,你需要改一改你的php.ini文件的设置,并找到php_curl.dll,并取消前面的分号注释就行了。
//取消下面的注释
extension=php_curl.dll
如果你是在linux下面,那么,你需要重新编译你的php了,编辑时,你需要打开编译参数,在configure命令上加上“--with-curl-”参数。
为什么要用curl?
是的,我们可以通过其他办法获取网页内容。大多数时候,都直接用简单的php函数:
$content = file_get_contents("http://127.0.0.1/demo1.txt"); $content = file("http://127.0.0.1/demo1.txt"); $content = readfile("http://127.0.0.1/demo1.txt");
不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理cookies、验证、表单提交、文件上传等等。
在学习更为复杂的功能之前,先来看一下在PHP中建立curl请求的基本步骤:
//初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch,CURLOPT_URL,"http://127.0.0.1/demo1.php"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); //执行并获取HTML文档内容 $output = curl_exec($ch); curl_close($ch); echo $output;
第二步(也就是curl_setopt())最为重要,一切玄妙均在此。有一长串的curl参数可供设置,他们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。
你可以加一段检查错误的语句:
$output = curl_exec($ch); if ($output === FALSE) { echo "cURL Error: " . curl_error($ch); }
请注意,比较的时候我们用的是“===FALSE”,而非“==FALSE”。因为我们得区分空输出和布尔值FALSE,后者才是真正的错误。
获取信息:这是另一个可选的设置项,能够在curl执行后获取这一请求相关信息:
$info = curl_getinfo($ch); //var_dump($info); echo '获取'. $info['url'] . '耗时'. $info['total_time'] . '秒';
返回的数组中包括了一下信息:
"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"//重定向耗时
用POST方法发送数据:
当发起GET请求时,数据可以通过“查询字串”(query string)传递给一个URL。
header("content-type:text/html;charset=utf-8"); $url = "http://127.0.0.1/demo1.php"; $post_data = array( 'foo'=>"bar", 'query'=>'Nettuts' ); //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data); //执行并获取HTML文档内容 $output = curl_exec($ch); if($output === FALSE){ echo "curl error:".curl_error($ch); }else{ echo $output; } curl_close($ch);
文件上传和前面的POST十分相似,因为文件上传表单都是通过POST方法提交的。
header("content-type:text/html;charset=utf-8"); $url = "http://127.0.0.1/demo1.php"; $post_data = array( 'foo'=>"bar", 'upload'=>'@C:/wamp/www/test.zip' ); //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data); //执行并获取HTML文档内容 $output = curl_exec($ch); if($output === FALSE){ echo "curl error:".curl_error($ch); }else{ echo $output; } curl_close($ch);
如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加班@符号。
|
请发表评论