phpcurl入门与实例应用与常用用法资料_第1页
phpcurl入门与实例应用与常用用法资料_第2页
phpcurl入门与实例应用与常用用法资料_第3页
phpcurl入门与实例应用与常用用法资料_第4页
phpcurl入门与实例应用与常用用法资料_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、hp curl入门与实例应用与常用用法curl_setopt- 为 CURL 调用设置一个选项描述bool curl_setopt (int ch, string option, mixed value)curl_setopt()函数将为一个CURL 会话设置选项。option参数是你想要的设置,value是这个选项给定的值。下列选项的值将被作为长整形使用(在option参数中指定):CURLOPT_INFILESIZE:当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。CURLOPT_VERBOSE:CURLOPT_HEADER:如果你想CURL 报告每一件意外的事情,设置这个

2、选项为一个非零值。如果你想把一个头包含在输出中,设置这个选项为一个非零值。CURLOPT_NOPROGRESS:如果你不会PHP 为 CURL 传输显示一个进程条,设置这个选项为一个非零值。注意: PHP 自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。CURLOPT_NOBODY:如果你不想在输出中包含body 部分,设置这个选项为一个非零值。CURLOPT_FAILONERROR:如果你想让 PHP 在发生错误 (HTTP 代码返回大于等于300) 时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。CURLOPT_UPLOAD:如果你想让PHP 为

3、上传做准备,设置这个选项为一个非零值。CURLOPT_POST:如果你想 PHP 去做一个正规的HTTP POST ,设置这个选项为一个非零值。这个 POST 是普通的 application/x-www-from-urlencoded类型,多数被HTML 表单使用。CURLOPT_FTPLISTONLY:设置这个选项为非零值,PHP将列出 FTP的目录名列表。CURLOPT_FTPAPPEND:设置这个选项为一个非零值,PHP 将应用远程文件代替覆盖它。CURLOPT_NETRC:设置这个选项为一个非零值,PHP 将在你的 ./netrc 文件中查找你要建立连接的远程站点的用户名及密码。CU

4、RLOPT_FOLLOWLOCATION:设置这个选项为一个非零值(象 Location: ) 的头,服务器会把它当做 HTTP 头的一部分发送(注意这是递归的,PHP 将发送形如 Location: 的头 )。CURLOPT_PUT:设置这个选项为一个非零值去用HTTP 上传一个文件。要上传这个文件必须设置 CURLOPT_INFILE和 CURLOPT_INFILESIZE选项 .CURLOPT_MUTE:设置这个选项为一个非零值,PHP 对于 CURL 函数将完全沉默。CURLOPT_TIMEOUT:设置一个长整形数,作为最大延续多少秒。CURLOPT_LOW_SPEED_LIMIT:设

5、置一个长整形数,控制传送多少字节。CURLOPT_LOW_SPEED_TIME:设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。CURLOPT_RESUME_FROM:传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单 )。CURLOPT_SSLVERSION:传递一个包含SSL 版本的长参数。默认PHP 将被它自己努力的确定,在更多的安全中你必须手工设置。CURLOPT_TIMECONDITION:传递一个长参数, 指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE或TIMECO

6、ND_ISUNMODSINCE。这仅用于 HTTP 。CURLOPT_TIMEVALUE:传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。下列选项的值将被作为字符串:CURLOPT_URL:这是你想用PHP 取回的URL 地址。你也可以在用curl_init() 函数初始化时设置这个选项。CURLOPT_USERPWD:传递一个形如username:password风格的字符串,作用 PHP 去连接。CURLOPT_PROXYUSERPWD:传递一个形如username:passw

7、ord格式的字符串去连接HTTP 代理。CURLOPT_RANGE:传递一个你想指定的范围。它应该是 X-Y 格式,X 或 Y 是被除外的。 HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。CURLOPT_POSTFIELDS:传递一个作为HTTP “ POST”操作的所有数据的字符串。CURLOPT_REFERER:在 HTTP 请求中包含一个referer 头的字符串。CURLOPT_USERAGENT:在 HTTP 请求中包含一个user-agent 头的字符串。CURLOPT_FTPPORT:传递一个包含被ftp POST指令使用的IP 地址。这个 POST 指令告诉远程

8、服务器去连接我们指定的IP 地址。这个字符串可以是一个IP 地址,一个主机名,一个网络界面名 (在 UNIX下 ),或是 ,-( 使用系统默认 IP 地址 )。CURLOPT_COOKIE:传递一个包含HTTP cookie的头连接。CURLOPT_SSLCERT:传递一个包含PEM 格式证书的字符串。CURLOPT_SSLCERTPASSWD:传递一个包含使用 CURLOPT_SSLCERT证书必需的密码。CURLOPT_COOKIEFILE:传递一个包含cookie 数据的文件的名字的字符串。这个 cookie 文件可以是 Netscape 格式,或是堆存在文件中的HTTP 风格的头。CU

9、RLOPT_CUSTOMREQUEST:当进行HTTP 请求时, 传递一个字符被 GET 或 HEAD 使用。为进行 DELETE 或其它操作是有益的,更Pass a string to be used instead of GET or HEADwhen doing an HTTP request . This is useful for doing or another, more obscure, HTTP request.注意 : 在确认你的服务器支持命令先不要去这样做。下列的选项要求一个文件描述(通过使用 fopen () 函数获得 ):CURLOPT_FILE:这个文件将是你放置传

10、送的输出文件,默认是CURLOPT_INFILE:这个文件是你传送过来的输入文件。CURLOPT_WRITEHEADER:这个文件写有你输出的头部分。STDOUT.CURLOPT_STDERR:这个文件写有错误而不是stderr实例php 教程header(Expires: Mon, 26 Jul 1997 05:00:00 GMT); / Date in the pastheader(Last-Modified: . gmdate(D, d M Y H:i:s) . GMT);/ always modifiedheader(Cache-Control: no-store, no-cache,

11、 must-revalidate); / HTTP/1.1header(Cache-Control: post-check=0, pre-check=0, false);header(Pragma: no-cache);header(content-type:text/html; charset=utf-8);$url = ;$querystring = $_SERVERQUERY_STRING;$currentUrl = $_SERVERSERVER_NAME;if($querystring != ) $querystring = $querystring . &;$querystring

12、= $querystring . SiteURL= . $currentUrl;if($querystring != )$url = $url . ? . $querystring;$ch = curl_init();$timeout = 60; / set to zero for no timeoutcurl_setopt ($ch, CURLOPT_URL, $url);curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);$handles = cur

13、l_exec($ch);/下面是替换,可以结合服务器伪静态 设置$handles =preg_replace(/?page=(0-9+)&categoryId=(0-9+)/i,/fenlei/category-$1-$2.html,$handles); $handles = preg_replace(/?categoryId=(0-9+)/i,/fenlei/category-$1.html,$handles); $handles = preg_replace(/?page=(0-9+)/i,/fenlei/category-$1.html,$handles);$handles = preg

14、_replace(/infodetail. asp 教程 x?ID=(0-9+)/i,/fenlei/$1.html,$handles); $handles = str_replace(infolist.aspx,/fenlei/index.html,$handles);$handles = str_replace(unionlist.aspx,unionlist.html,$handles); echo $handles;?为什么要用cURL?是的,我们可以通过其他办法获取网页内容。大多数时候, 我因为想偷懒,都直接用简单的PHP函数:$content = file_get_contents

15、();/ or$lines = file();or readfile();不过,这种做法缺乏灵活性和有效的错误处理。如处理 coockies 、验证、表单提交、 文件上传而且,你也不能用它完成一些高难度任务等等。 比引用:cURL是一种功能强大的库,支持很多不同的协议、选项,能提供URL请求相关的各种细节信息。基本结构在学习更为复杂的功能之前,先来看一下在PHP 中建立 cURL 请求的基本步骤:初始化设置变量执行并获取结果释放 cURL 句柄1. 初始化$ch = curl_init();2. 设置选项,包括 URLcurl_setopt($ch, CURLOPT_URL, );curl_s

16、etopt($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 = cu

17、rl_exec($ch);if ($output = FALSE) echo cURL Error: . curl_error($ch);/ .请注意,比较的时候我们用的是 “= FALSE”,而非 “= FALSE”。因为我们得区分尔值 FALSE ,后者才是真正的错误。空输出和布获取信息这是另一个可选的设置项,能够在cURL 执行后获取这一请求的有关信息:/ .curl_exec($ch);$info = curl_getinfo($ch);echo 获取 . $infourl . 耗时 . $infototal_time . 秒 ;/ .返回的数组中包括了以下信息:“ url ”资源/网

18、络地址“ 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_do

19、wnload ”下/载数据的大小 “ speed_download ” 下/载速度“ speed_upload ”上/传速度“ download_content_length ”下载/内容的长度 “ upload_content_length ”上传/内容的长度 “ starttransfer_time 开”始传/输的时间“ redirect_time 重”定/向耗时基于浏览器的重定向在第一个例子中,我们将提供一段用于侦测服务器是否有基于浏览器的重定向的代码。些网站 会根据是否是手机浏览器甚至用户来自哪个国家来重定向网页。例如, 有我们利用CURLOPT_HTTPHEADER选项来设定我们发送

20、出的HTTP 请求头信息(httpheaders ),包括 user agent信息和默认语言。然后我们来看看这些特定网站是否会把我们重定向到不同的URL 。测试用的 URL$urls = array(,);测试用的浏览器信息$browsers = array(standard = array (user_agent = Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:)Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729),language = en-us,en;q=0.5),iphone =

21、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 ($

22、urls as $url) echo URL: $urln;foreach ($browsers as $test_name = $browser) $ch = curl_init();/ 设置urlcurl_setopt($ch, CURLOPT_URL, $url);设置浏览器的特定 headercurl_setopt($ch, CURLOPT_HTTPHEADER, array(User-Agent: $browseruser_agent,Accept-Language: $browserlanguage);页面内容我们并不需要curl_setopt($ch, CURLOPT_NOBOD

23、Y, 1);/ 只需返回HTTP headercurl_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 $matches1n; else echo $test_name: no redirecti

24、onn;echo nn;首先,我们建立一组需要测试的 URL ,接着指定一组需要测试的浏览器信息。最后通过循环测试各种 URL 和浏览器匹配可能产生的情况。因为我们指定了 cURL 选项,所以返回的输出内容则只包括中)。利用一个简单的正则,我们检查这个头信息中是否包含了HTTP 头信息(被存放于“Location: 字”样。$output运行这段代码应该会返回如下结果:用 POST 方法发送数据当发起 GET 请求时, 数据可以通过 “查询字串 ”( query string 中搜索时,搜索关键即为 URL 的查询字串的一部分:)传递给一个URL 。例如, 在 google/search?q=

25、nettuts这种情况下你可能并不需要cURL来模拟。把这个URL丢给 “file_get_contents()就”能得到相同结果。不过有一些HTML 表单是用POST 方法提交的。这种表单提交时,数据是通过HTTP 请求体(request body) 发送,而不是查询字串。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:/forums/do_search/你可以用PHP 脚本来模拟这种URL 请求。首先,新建一个可以接受并显示POST数据的文件,我们给它命名为post_output.php:print_r($_POST);接下来,写一段PHP 脚

26、本来执行cURL 请求:$url = http:/localhost/post_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 数据哦!curl_setopt($ch, CURLOPT_POST, 1);把 post 的变量加上curl_setopt($ch, CURLOPT_POST

27、FIELDS, $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 = http:/localhost/upload_

28、output.php;$post_data = array (foo = bar,要上传的本地文件地址upload = C:/wamp/www/test.zip);$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($

29、ch);echo $output;如果你需要上传一个文件,只需要把文件路径像一个post 变量一样传过去,不过记得在前面加上 符号。执行这段脚本应该会得到如下输出:cURL 批处理( multi cURL )cURL 还有一个高级特性 批处理句柄( handle )。这一特性允许你同时或异步地打开多个 URL 连接。下面是来自来自的示例代码:创建两个 cURL 资源$ch1 = curl_init();$ch2 = curl_init();指定 URL 和适当的参数curl_setopt($ch1, CURLOPT_URL, /);curl_setopt($ch1, CURLOPT_HEADE

30、R, 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_handle($mh,$ch2);预定义一个状态变量$active = null;执行批处理do $mrc = curl_multi_exec($mh, $active); while ($mrc = CURLM_CALL_MULTI_PERFORM); w

31、hile ($active & $mrc = CURLM_OK) if (curl_multi_select ($mh) != -1) do $mrc = curl_multi_exec($mh, $active); while ($mrc = CURLM_CALL_MULTI_PERFORM);关闭各个句柄curl_multi_remove_handle($mh, $ch1);curl_multi_remove_handle($mh, $ch2);curl_multi_close($mh);这里要做的就是打开多个cURL句柄并指派给一个批处理句柄。然后你就只需在一个while循环里等它执行完

32、毕。这个示例中有两个主要循环。第一个 do-while 循环重复调用 curl_multi_exec() 。这个函数是无隔断( non-blocking )的,但会尽可能少地执行。它返回一个状态值,只要这个值等于常量CURLM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做(例如, 把对应URL的 http 头信息发送出去)。也就是说,我们需要不断调用该函数,直到返回值发生改变。而接下来的while循环,只在$active变量为true时继续。这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动连接。接着,我们调用curl

33、_multi_select(),在活动连接(例如接受服务器响应)出现之前,它都是被“屏蔽 ”的。这个函数成功执行后,我们又会进入另一个do-while循环,继续下一条URL 。还是来看一看怎么把这一功能用到实处吧:WordPress连接检查器想象一下你有一个文章数目庞大的博客,这些文章中包含了大量外部网站链接。一段时间之后,因为这样那样的原因,这些链接中相当数量都失效了。要么是被和谐了,要么是整个站点都被功夫网了 .我们下面建立一个脚本,分析所有这些链接,找出打不开或者404 的网站/网页,并生成一个报告。请注意,以下并不是一个真正可用的 WordPress 插件,仅仅是一段独立功能的脚本而已,仅供演示,谢谢。好,开始吧。首先,从数据库教程 中读取所有这些链接:/ CONFIG$db_host = localhost;$db_user = root;$db_pass = ;$db_name = wordpress;$excluded_domains = array(localhost, );$max_connections = 10;初始化一些变量$url_list = array();$working_urls = array();$dead_urls = array();$not_found_urls = array();$active = null;/ 连

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论