您好,欢迎访问一九零五行业门户网

php中比file_get_contents()更优的cURL的实例详解

php 可以使用 file_get_content() 函数抓取网页内容,但却无法进行更复杂的处理,譬如文件的上传或下载、 cookie 操作等等。而 php 的 curl 提供了这些功能。
一、curl简介curl 是 php 的一个扩展库。它可以与各种类型的服务器、使用各种类型的协议进行连接和通讯。
它目前支持 http、https、ftp、gopher、telnet、dict、file 和 ldap 协议,同时也支持 https 认证、http post、 ftp 上传、代理、cookies 和 用户名 + 密码的认证等。
二、curl函数库常用函数
函数 描述
 curl_init()  初始化 curl 会话
 curl_setopt()  设置 curl 选项
 curl_exec()
 执行 curl 会话
 curl_getinfo()   获取当前会话信息
 curl_errno()  返回最后一次的错误代码  
 curl_error()  返回当前会话最后一次的错误字符串
 curl_close()  关闭 curl 会话
其他函数
函数 描述
curl_copy_handle() 复制一个 curl 句柄和它的所有选项。
curl_escape() 返回转义字符串,对给定的字符串进行url编码。
curl_file_create() 创建一个 curlfile 对象。
curl_multi_add_handle() 向 curl 批处理会话中添加单独的curl句柄。
curl_multi_close() 关闭一组 curl 句柄。
curl_multi_exec() 运行当前 curl 句柄的子连接。
curl_multi_getcontent() 如果设置了 curlopt_returntransfer ,则返回获取的输出的文本流。
curl_multi_info_read() 获取当前解析的 curl 的相关传输信息。
curl_multi_init() 返回一个新 curl 批处理句柄。
curl_multi_remove_handle()  移除 curl 批处理句柄资源中的某个句柄资源。
curl_multi_select() 等待所有 curl 批处理中的活动连接。
curl_multi_setopt() 设置一个批处理 curl 传输选项。
curl_multi_strerror() 返回描述错误码的字符串文本。
curl_pause() 暂停及恢复连接。
curl_reset() 重置 libcurl 的会话句柄的所有选项。
curl_setopt_array() 为 curl 传输会话批量设置选项。
curl_share_close() 关闭 curl 共享句柄。
curl_share_init() 初始化 curl 共享句柄。
curl_share_setopt() 设置一个共享句柄的 curl 传输选项。
curl_strerror() 返回错误代码的字符串描述。
curl_unescape() 解码 url 编码后的字符串。
curl_version() 获取 curl 版本信息。
三、实现流程1. 初始化 curl 会话
2. 设置 curl 选项
3. 执行 curl 会话
4. 获取 curl 信息和(或)错误信息(这一步可以没有)
5. 关闭 curl 句柄
这里面最复杂的是第 2 步,curl 的设置选项有很多,下面会结合实例来了解。
四、实例1:get请求get 请求的流程就是 curl 的一般流程。
在本地服务器 localserver.com 根目录准备一个测试脚本 index.php,内容如下:
<?php $url = 'http://www.baidu.com'; // 初始化,获得一个curl句柄 $ch = curl_init(); // 设置选项 curl_setopt($ch, curlopt_url, $url); // 请求url curl_setopt($ch, curlopt_returntransfer, 1); //返回数据流,而不直接输出 curl_setopt($ch, curlopt_header, 0); // 无需响应的header头 curl_setopt($ch, curlopt_connecttimeout, 30); //连接超时,秒为单位 // 执行并获取返回内容 $output = curl_exec($ch); if($output === false){ $output = 'curl error: ' . curl_error($ch); } // 释放 curl 句柄资源 curl_close($ch); print_r($output); ?>
浏览器访问本地服务器首页 localserver.com/index.php,显示百度首页。
五、实例2. post请求post 请求需要设置两个选项:
curl_setopt($ch, curlopt_post, 1); // 表明post请求 curl_setopt($ch, curlopt_postfields, $postdata)); // post提交数据
先在远程服务器 remoteserver.com 根目录准备一个用于接收的脚本 index.php,内容如下:
<?php $input = file_get_contents('php://input'); echo $input; ?>
然后在本地服务器 localserver.com 根目录来写用于 post 请求的脚本 index.php,内容如下:
<?php $url = 'http://remoteserver.com/index.php'; $data = array( 'fname'=> 'daniel', 'lname' => 'stenberg' ); // 初始化 $ch = curl_init(); // 设置选项 curl_setopt($ch, curlopt_url, $url); curl_setopt($ch, curlopt_returntransfer, 1); curl_setopt($ch, curlopt_header, 0); curl_setopt($ch, curlopt_connecttimeout, 30); curl_setopt($ch, curlopt_post, 1); // post请求 curl_setopt($ch, curlopt_postfields, http_build_query($data)); //post数据。用http_build_query()转换为“&”拼接的字符串 // 执行并获取返回内容 $output = curl_exec($ch); if($output === false){ $output = 'curl error: ' . curl_error($ch); } // 释放 curl 句柄资源 curl_close($ch); print_r($output); ?>
浏览器访问 localserver.com/index.php,显示如下:
fname=daniel&lname=stenberg
六、实例3. 上传文件curl 上传文件的思路是:在文件路径的前面添加"@"符号,并装在请求字段里实现上传。后台可以通过 $_files 获取上传文件信息。但 php5.6 以后,废除了"@"符号,可以使用 curlfile 类实现上传。
先在远程服务器 remoteserver.com 根目录准备一个用于接收的脚本 index.php,内容如下:
<?php $action = $_post['action']; if($action == 'uploadimage'){ $name = $_files['file']['name']; $tmpname = $_files['file']['tmp_name']; // 保存到当前脚本所在目录 move_uploaded_file($tmpname, dirname(__file__).'/'.$name); $error = $_files['file']['error']; switch ($error) { case 0: echo '上传成功'; break; case 1: echo '文件大小超出 php.ini 限制'; break; case 2: echo '文件大小超出 表单 max_file_size 限制'; break; case 3: echo '文件部分被上传'; break; case 4: echo '没有文件被上传'; break; case 6: echo '找不到临时文件夹'; break; case 7: echo '文件写入失败'; break; default: $output = '未知错误'; } } ?>
然后在本地服务器 localserver.com 根目录准备一个图片文件 test.jpg 和 curl 上传脚本 index.php, 脚本内容如下:
<?php $url = 'http://remoteserver.com/index.php'; $file = realpath(getcwd() . '/test.jpg'); $data = array( 'action' => 'uploadimage', 'file' => '@' . $file ); if(version_compare(php_version, '5.6.0') > 0){ $data['file'] = new curlfile($file); } // 初始化 $ch = curl_init(); // 设置选项 curl_setopt($ch, curlopt_url, $url); curl_setopt($ch, curlopt_returntransfer, 1); curl_setopt($ch, curlopt_header, 0); curl_setopt($ch, curlopt_connecttimeout, 30); curl_setopt($ch, curlopt_post, 1); curl_setopt($ch, curlopt_postfields, $data); // 执行并获取返回内容 $output = curl_exec($ch); if($output === false){ $output = 'curl error: ' . curl_error($ch); } // 释放 curl 句柄资源 curl_close($ch); print_r($output); ?>
浏览器访问 localserver.com/index.php,显示如下:
上传成功
查看远程服务器根目录,发现多了一张刚才上传的图片。
七、实例4. 下载文件curl 下载文件的一个思路是:设置 curl 选项 curlopt_file 为一个文件指针,以此将请求的资源文件关联到一个文件流里,这个文件流一般是 fopen()函数的返回值。使用文件流将远程文件写到本地,可以避免写(下载)大文件时可能的内存出错。
在本地服务器 localserver.com 根目录来写测试脚本 index.php,内容如下:
<?php $url = 'http://remoteserver.com/test.jpg'; $file = './test.jpg'; $fp = fopen($file, 'w'); // 初始化 $ch = curl_init(); // 设置选项 curl_setopt($ch, curlopt_url, $url); curl_setopt($ch, curlopt_returntransfer, 1); curl_setopt($ch, curlopt_header, 0); curl_setopt($ch, curlopt_connecttimeout, 30); curl_setopt($ch, curlopt_file, $fp); // 用于传输的文件流,默认是stdout // 执行并获取返回内容 $output = curl_exec($ch); if($output === false){ $output = 'curl error: ' . curl_error($ch); } // 获取已下载大小 $size_download = curl_getinfo($ch, curlinfo_size_download); // 释放资源 fclose($fp); curl_close($ch); if ($size_download && $size_download == filesize($file)) { echo "下载成功"; } else { echo "下载失败或不完整"; } ?>
浏览器访问 localserver.com/index.php,显示如下:
下载成功
查看本地服务器根目录,发现下载到了远程的图片。 
八、实例5. 批处理curl 有一个批处理句柄,通过打开多个 curl 句柄,并将这些句柄绑定到一个批处理句柄,然后在循环中依次处理每个 curl 连接,可以实现异步的批处理,类似“多线程”。
在本地服务器 localserver.com 根目录来写测试脚本 index.php,内容如下:
<?php $urls = array( 'http://www.baidu.com', 'http://www.qidian.com' ); $count = count($urls); $ch = array(); // 创建批处理curl句柄 $mh = curl_multi_init(); // 初始化每个curl,并设置选项,绑定给批处理句柄 for ($i = 0; $i < $count; $i++) { $ch[$i] = curl_init(); curl_setopt($ch[$i], curlopt_url, $urls[$i]); curl_setopt($ch[$i], curlopt_returntransfer, 1); curl_setopt($ch[$i], curlopt_header, 0); curl_setopt($ch[$i], curlopt_connecttimeout, 30); curl_multi_add_handle($mh, $ch[$i]); } // 执行批处理 $running = null; do { usleep(10000); // 延迟0.01秒,单位为百万分之一秒 curl_multi_exec($mh, $running); // 异步实现批处理,类似“多线程” } while($running > 0); // 获取每个curl的响应 $res = array(); for ($i = 0; $i < $count; $i++) { $res[$i] = curl_multi_getcontent($ch[$i]); } // 关闭全部句柄 for ($i = 0; $i < $count; $i++) { curl_multi_remove_handle($mh, $ch[$i]); } curl_multi_close($mh); print_r($res); ?>
浏览器访问 localserver.com/index.php,显示“连接”的百度首页和起点网首页。
以上就是php中比file_get_contents()更优的curl的实例详解的详细内容。
其它类似信息

推荐信息