您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > 基于PHP的cURL快速入门
基于PHP的cURL快速入门cURL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持cURL库。本文将介绍cURL的一些高级特性,以及在PHP中如何运用它。为什么要用cURL?是的,我们可以通过其他办法获取网页内容。大多数时候,我因为想偷懒,都直接用简单的PHP函数:以下为引用的内容:$content=file_get_contents();//or$lines=file();//orreadfile();不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理coockies、验证、表单提交、文件上传等等。引用:cURL是一种功能强大的库,支持很多不同的协议、选项,能提供URL请求相关的各种细节信息。基本结构在学习更为复杂的功能之前,先来看一下在PHP中建立cURL请求的基本步骤:1.初始化2.设置变量3.执行并获取结果4.释放cURL句柄以下为引用的内容://1.初始化$ch=curl_init();//2.设置选项,包括URLcurl_setopt($ch,CURLOPT_URL,);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_HEADER,0);//3.执行并获取HTML文档内容$output=curl_exec($ch);//4.释放curl句柄curl_close($ch);第二步(也就是curl_setopt())最为重要,一切玄妙均在此。有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。检查错误你可以加一段检查错误的语句(虽然这并不是必需的):以下为引用的内容://...$output=curl_exec($ch);if($output===FALSE){echocURLError:.curl_error($ch);}//...请注意,比较的时候我们用的是“===FALSE”,而非“==FALSE”。因为我们得区分空输出和布尔值FALSE,后者才是真正的错误。获取信息这是另一个可选的设置项,能够在cURL执行后获取这一请求的有关信息:以下为引用的内容://...curl_exec($ch);$info=curl_getinfo($ch);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”//重定向耗时基于浏览器的重定向在第一个例子中,我们将提供一段用于侦测服务器是否有基于浏览器的重定向的代码。例如,有些网站会根据是否是手机浏览器甚至用户来自哪个国家来重定向网页。我们利用CURLOPT_HTTPHEADER选项来设定我们发送出的HTTP请求头信息(httpheaders),包括useragent信息和默认语言。然后我们来看看这些特定网站是否会把我们重定向到不同的URL。以下为引用的内容://测试用的URL$urls=array(://://);//测试用的浏览器信息$browsers=array(standard=array(user_agent=Mozilla/5.0(Windows;U;WindowsNT6.1;en-US;rv:1.9.1.6)Gecko/20091201Firefox/3.5.6(.NETCLR3.5.30729),language=en-us,en;q=0.5),iphone=array(user_agent=Mozilla/5.0(iPhone;U;CPUlikeMacOSX;en)AppleWebKit/420+(KHTML,likeGecko)Version/3.0Mobile/1A537aSafari/419.3,language=en),french=array(user_agent=Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;GTB6;.NETCLR2.0.50727),language=fr,fr-FR;q=0.5));foreach($urlsas$url){echoURL:$url\n;foreach($browsersas$test_name=$browser){$ch=curl_init();//设置urlcurl_setopt($ch,CURLOPT_URL,$url);//设置浏览器的特定headercurl_setopt($ch,CURLOPT_HTTPHEADER,array(User-Agent:{$browser['user_agent']},Accept-Language:{$browser['language']}));//页面内容我们并不需要curl_setopt($ch,CURLOPT_NOBODY,1);//只需返回HTTPheadercurl_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:redirectsto$matches[1]\n;}else{echo$test_name:noredirection\n;}}echo\n\n;}首先,我们建立一组需要测试的URL,接着指定一组需要测试的浏览器信息。最后通过循环测试各种URL和浏览器匹配可能产生的情况。因为我们指定了cURL选项,所以返回的输出内容则只包括HTTP头信息(被存放于$output中)。利用一个简单的正则,我们检查这个头信息中是否包含了“Location:”字样。运行这段代码应该会返回如下结果:用POST方法发送数据当发起GET请求时,数据可以通过“查询字串”(querystring)传递给一个URL。例如,在google中搜索时,搜索关键即为URL的查询字串的一部分:=nettuts这种情况下你可能并不需要cURL来模拟。把这个URL丢给“file_get_contents()”就能得到相同结果。不过有一些HTML表单是用POST方法提交的。这种表单提交时,数据是通过HTTP请求体(requestbody)发送,而不是查询字串。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:你可以用PHP脚本来模拟这种URL请求。首先,新建一个可以接受并显示POST数据的文件,我们给它命名为post_output.php:print_r($_POST);接下来,写一段PHP脚本来执行cURL请求:以下为引用的内容:$url==array(foo=bar,query=Nettuts,action=Submit);$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//我们在POST数据哦!curl_setopt($ch,CURLOPT_POST,1);//把post的变量加上curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);$output=curl_exec($ch);curl_close($ch);echo$output;执行代码后应该会得到以下结果:这段脚本发送一个POST请求给post_output.php,这个页面$_POST变量并返回,我们利用cURL捕捉了这个输出。文件上传上传文件和前面的POST十分相似。因为所有的文件上传表单都是通过POST方法提交的。首先新建一个接收文件的页面,命名为upload_output.php:print_r($_FILES);以下是真正执行文件上传任务的脚本:以下为引用的内容:$url==array(foo=bar,//要上传的本地文件地址upload=@C:/wamp/);$ch=curl_init();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);$output=curl_exec($ch);curl_close($ch);echo$output;如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号。执行这段脚本应该会得到如下输出:cURL批处理(multicURL)cURL还有一个高级特性——批处理句柄(handle)。这一特性允许你同时或异步地打开多个URL连接。下面是来自来自php.net的示例代码:以下为引用的内容://创建两个cURL资源$ch1=curl_init();$ch2=curl_init();//指定URL和适当的参数curl_setopt($ch1,CURLOPT_URL,);curl_setopt($ch1,CURLOPT_HEADER,0);curl_setopt($ch2,CURLOPT_URL,);curl_setopt($ch2,CURLOPT_HEADER,0);//创建cURL批处理句柄$mh=curl_multi_init();//加上前面两个资源句柄curl_multi_add_handle($mh,$ch1);curl_multi_add_h
本文标题:基于PHP的cURL快速入门
链接地址:https://www.777doc.com/doc-2571236 .html