php CURL函数入门教程详解

在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. }
  15. // 5. 释放curl资源
  16. curl_close($ch);
  17. // 输出获得的源代码
  18. echo $output;
  19. ?>
关于第二步的 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. }
  15. // 获取 cURL 信息 并输出
  16. $info = curl_getinfo($ch);
  17. echo '获取 '. $info['url'] . ' 耗时 '. $info['total_time'] . '秒';
  18. // 5. 释放curl句柄
  19. curl_close($ch);
  20. ?>

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

  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. }
  22. // 5. 释放curl句柄
  23. curl_close($ch);
  24. // 输出内容
  25. echo $output;
  26. ?>

新建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. }
  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. 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. }
  17. // 5. 释放curl句柄
  18. curl_close($ch);
  19. ?>

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. }
  22. // 5. 释放curl句柄
  23. curl_close($ch);
  24. ?>

你可以用代理发起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. }
  16. // 5. 释放curl句柄
  17. curl_close($ch);
  18. ?>

回调函数

可以在一个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. }
  14. // 5. 释放curl句柄
  15. curl_close($ch);
  16. // 回调函数
  17. function progress_function($ch, $str) {
  18. echo $str;
  19. return strlen($str);
  20. }
  21. ?>

这个回调函数必须返回字串的长度,不然此功能将无法正常使用,在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. }
  22. }

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