程序员人生 网站导航

php CURL函数入门教程详解

栏目:php教程时间:2014-06-07 20:38:55

在php中 cURL函数有一组相关函数,它是一个非常不错的函数了,我们经常用它来模仿各种登录与采集工作,下面我来给各位介绍CURL函数入门吧。

cURL简介

cURL是一个利用URL语法规定来传输数据和文件的工具,支持很多种协议如HTTP、FTP、TELNET等。PHP也支持 cURL 库。

假如我们要获取某个网页的内容,我们可能会使用下面这几种方法:

  1. <?php 
  2. // 把整个文件读入一个字符串中 
  3. $str = file_get_contents("http://www.phpfensi.com"); 
  4. // 把整个文件读入一个数组中 
  5. $arr = file("http://www.phpfensi.com"); 
  6. // 读入一个文件并写入到输出缓冲 
  7. $out = readfile("http://www.phpfensi.com"); 
  8. ?> 

这几种做法相当简单,但缺乏灵活性和有效的错误处理,而且他们无法完成一些高难度动作,比如处理coockies、验证、表单提交、文件上传等等。

cURL简例

下面给出一段简单的代码,从其中你可以学习到使用cURL的大概步骤,php cURL入门教程,实例代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 1. 初始化 
  4. $ch = curl_init(); 
  5. // 2. 设置选项 
  6. curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net"); 
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  8. curl_setopt($ch, CURLOPT_HEADER, 0); 
  9. // 3. 执行并获取返回的内容 
  10. $output = curl_exec($ch); 
  11. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  12. if ($output === FALSE) { 
  13.     echo "cURL Error: " . curl_error($ch); 
  14. // 5. 释放curl资源 
  15. curl_close($ch); 
  16. // 输出获得的源代码 
  17. echo $output
  18. ?> 
关于第二步的 curl_setopt() 是最为重要的,有一长串cURL参数可供设置,它们能指定URL请求的各个细节。

获取信息

这是另一个可选的设置项,能够在cURL执行后获取这一请求的有关信息,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 1. 初始化 
  4. $ch = curl_init(); 
  5. // 2. 设置选项 
  6. curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net"); 
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  8. curl_setopt($ch, CURLOPT_HEADER, 0); 
  9. // 3. 执行并获取HTML文档内容 
  10. $output = curl_exec($ch); 
  11. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  12. if ($output === FALSE) { 
  13.     echo "cURL Error: " . curl_error($ch); 
  14. // 获取 cURL 信息 并输出 
  15. $info = curl_getinfo($ch); 
  16. echo '获取 '$info['url'] . ' 耗时 '$info['total_time'] . '秒'
  17. // 5. 释放curl句柄 
  18. curl_close($ch); 
  19. ?> 

返回的数组中包括了以下信息:

  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"     // 重定向耗时 

用POST方法发送数据,新建 from.php,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 待 post 的数据 
  4. $post_data = array ( 
  5.     "hyh" => "man"
  6.     "xlp" => "woman"
  7.     "love" => "yes" 
  8. ); 
  9. // 1. 初始化 
  10. $ch = curl_init(); 
  11. // 2. 设置选项 
  12. curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php"); 
  13. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  14. curl_setopt($ch, CURLOPT_POST, 1); // 这里设置为post方式 
  15. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加准备post的数据 
  16. // 3. 执行并获取返回内容 
  17. $output = curl_exec($ch); 
  18. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  19. if ($output === FALSE) { 
  20.     echo "cURL Error: " . curl_error($ch); 
  21. // 5. 释放curl句柄 
  22. curl_close($ch); 
  23. // 输出内容 
  24. echo $output
  25. ?> 

新建to.php,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. echo "从 from.php POST数据到 to.php 成功!以下为 to.php 返回的数据:<br><br>"
  4. print_r($_POST); 
  5. echo "<br><br>I'm come from http://www.phpfensi.com" 
  6. ?> 

文件上传

上传文件和前面的POST十分相似,因为所有的文件上传表单都是通过POST方法提交的。

新建 from.php,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 待 post 的数据 
  4. $post_data = array ( 
  5.     "hyh" => "man"
  6.     "upload" => "@C:/test.zip" // 要上传的本地文件地址 
  7. ); 
  8. // 1. 初始化 
  9. $ch = curl_init(); 
  10. // 2. 设置选项 
  11. curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php"); 
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  13. curl_setopt($ch, CURLOPT_POST, 1); // 这里设置为post方式 
  14. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加准备post的数据 
  15. // 3. 执行并获取返回内容 
  16. $output = curl_exec($ch); 
  17. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  18. if ($output === FALSE) { 
  19.     echo "cURL Error: " . curl_error($ch); 
  20. // 5. 释放curl资源 
  21. curl_close($ch); 
  22. // 输出内容 
  23. echo $output
  24. ?> 

新建 to.php,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. print_r($_FILES); 
  4. ?> 

如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号。

另一些有用的cURL范例

HTTP认证

如果某个URL请求需要基于 HTTP 的身份验证,你可以使用下面的代码:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 1. 初始化 
  4. $ch = curl_init(); 
  5. // 2. 设置选项 
  6. curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net"); 
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  8. curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // 发送用户名和密码 
  9. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 你可以允许其重定向 
  10. curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); // 让 cURL 在重定向后,也能发送用户名和密码 
  11. // 3. 执行并获取返回内容 
  12. $output = curl_exec($ch); 
  13. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  14. if ($output === FALSE) { 
  15.     echo "cURL Error: " . curl_error($ch); 
  16. // 5. 释放curl句柄 
  17. curl_close($ch); 
  18. ?> 

FTP上传

PHP 自带有 FTP 类库,但你也能用 cURL,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 开一个文件指针 
  4. $file = fopen("/path/to/file""r"); 
  5. // 1. 初始化 
  6. $ch = curl_init(); 
  7. // 2. 设置选项 
  8. curl_setopt($ch, CURLOPT_URL, "ftp://username:password@3aj.cn:21/path/to/new/file"); 
  9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  10. // 上传相关的选项 
  11. curl_setopt($ch, CURLOPT_UPLOAD, 1); 
  12. curl_setopt($ch, CURLOPT_INFILE, $fp); 
  13. curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); 
  14. // 是否开启ASCII模式 (上传文本文件时有用) 
  15. curl_setopt($ch, CURLOPT_FTPASCII, 1); 
  16. // 3. 执行并获取返回内容 
  17. $output = curl_exec($ch); 
  18. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  19. if ($output === FALSE) { 
  20.     echo "cURL Error: " . curl_error($ch); 
  21. // 5. 释放curl句柄 
  22. curl_close($ch); 
  23. ?> 

你可以用代理发起cURL请求,代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 1. 初始化 
  4. $ch = curl_init(); 
  5. // 2. 设置选项 
  6. curl_setopt($ch, CURLOPT_URL, "http://www.phpfensi.com"); 
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  8. curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // 指定代理地址 
  9. curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:pass'); // 如果需要的话,提供用户名和密码 
  10. // 3. 执行并获取返回内容 
  11. $output = curl_exec($ch); 
  12. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  13. if ($output === FALSE) { 
  14.     echo "cURL Error: " . curl_error($ch); 
  15. // 5. 释放curl句柄 
  16. curl_close($ch); 
  17. ?> 

回调函数

可以在一个URL请求过程中,让cURL调用某指定的回调函数,例如,在内容或者响应下载的过程中立刻开始利用数据,而不用等到完全下载完,实例代码如下:

  1. <?php 
  2. header("Content-type: text/html; charset=utf-8"); 
  3. // 1. 初始化 
  4. $ch = curl_init(); 
  5. // 2. 设置选项 
  6. curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net"); 
  7. curl_setopt($ch, CURLOPT_WRITEFUNCTION, "progress_function"); 
  8. // 3. 执行并获取返回内容 
  9. curl_exec($ch); 
  10. // 4. 错误判断,注意这里是布尔值,而不是空输出,所以是3个等号 
  11. if ($output === FALSE) { 
  12.     echo "cURL Error: " . curl_error($ch); 
  13. // 5. 释放curl句柄 
  14. curl_close($ch); 
  15. // 回调函数 
  16. function progress_function($ch$str) { 
  17.     echo $str
  18.     return strlen($str); 
  19. ?> 

这个回调函数必须返回字串的长度,不然此功能将无法正常使用,在URL响应接收的过程中,只要收到一个数据包,这个函数就会被调用。

讲到了半天我们再来一个高级实用点的功能cURL来实现ftp上传

web服务器的上传限制:

php的默认上传限制为2M,如果你要上传超过2M的文件的话,你必须修改你的PHP配置 或者 用下面的代码建立一个 .htaceess文件,代码如下:

php_value upload_max_filesize 16M

php_value post_max_size 20M

这里设置最大的文件上传限制为16M,post_max_size 的值为20M,因为可能在上传文件的同时,我们还需要POST表单里的其他表单项的值。

建立的 .htaccess 要放在你的上传脚本同一个目录下。

使用 cURL 进行文件上传

cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多种协议,如HTTP、FTP、TELNET等。它能完成很多高难度任务——如处理coockies、验证、表单提交、文件上传、ftp上传等等。

这里,我们准备通过使用web表单来上传一个文件到ftp空间上,这里的ftp空间是有密码保护的,代码如下:

  1. <form action="curlupload.php" method="post" enctype="multipart/form-data"> 
  2.     <div> 
  3.         <label for="upload">Select file</label> 
  4.         <input name="upload" type="file" /> 
  5.         <input type="submit" name="Submit" value="Upload" /> 
  6.     </div> 
  7. </form> 

这个表单页面比较简单,仅仅是拥有一个文件上传的功能,然后我们需要下面的php代码来接收上传过来的文件,使用 cURL 打开一个文件流并传送到远程ftp服务器上去,实例代码如下:

  1. if (isset($_POST['Submit'])) { 
  2.     if (!emptyempty($_FILES['upload']['name'])) { 
  3.         $ch = curl_init(); 
  4.         $localfile = $_FILES['upload']['tmp_name']; 
  5.         $fp = fopen($localfile'r'); 
  6.         curl_setopt($ch, CURLOPT_URL, 'ftp://username:password@3aj.cn/'.$_FILES['upload']['name']); 
  7.         curl_setopt($ch, CURLOPT_UPLOAD, 1); 
  8.         curl_setopt($ch, CURLOPT_INFILE, $fp); 
  9.         curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile)); 
  10.         curl_exec($ch); 
  11.         $error_no = curl_errno($ch); 
  12.         curl_close($ch); 
  13.         if ($error_no == 0) { 
  14.             $error = 'File uploaded succesfully.'
  15.         } else { 
  16.             $error = 'File upload error.'
  17.             echo "i come from "
  18.         } 
  19.     } else { 
  20.         $error = 'Please select a file.'
  21.     } 

当用户选择了并上传了一个文件,文件先保存在web服务器上,我们使用 fopen 打开这个临时文件并初始一个cURL会话,在发送的url中,把ftp的账号和密码填上,然后再设置cURL的其他必备参数即可,如果返回的错误数量为0,那么文件就上传成功了。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐