在php中 cURL函数有一组相关函数,它是一个非常不错的函数了,我们经常用它来模仿各种登录与采集工作,下面我来给各位介绍CURL函数入门吧。
cURL简介
cURL是一个利用URL语法规定来传输数据和文件的工具,支持很多种协议如HTTP、FTP、TELNET等。PHP也支持 cURL 库。
假如我们要获取某个网页的内容,我们可能会使用下面这几种方法:
- <?php
-
- $str = file_get_contents("http://www.phpfensi.com");
-
- $arr = file("http://www.phpfensi.com");
-
- $out = readfile("http://www.phpfensi.com");
- ?>
这几种做法相当简单,但缺乏灵活性和有效的错误处理,而且他们无法完成一些高难度动作,比如处理coockies、验证、表单提交、文件上传等等。
cURL简例
下面给出一段简单的代码,从其中你可以学习到使用cURL的大概步骤,php cURL入门教程,实例代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HEADER, 0);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
-
- echo $output;
- ?>
关于第二步的 curl_setopt() 是最为重要的,有一长串cURL参数可供设置,它们能指定URL请求的各个细节。
获取信息
这是另一个可选的设置项,能够在cURL执行后获取这一请求的有关信息,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HEADER, 0);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- $info = curl_getinfo($ch);
- echo '获取 '. $info['url'] . ' 耗时 '. $info['total_time'] . '秒';
-
- curl_close($ch);
- ?>
返回的数组中包括了以下信息:
- "url"
- "content_type"
- "http_code"
- "header_size"
- "request_size"
- "filetime"
- "ssl_verify_result"
- "redirect_count"
- "total_time"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- "size_download"
- "speed_download"
- "speed_upload"
- "download_content_length"
- "upload_content_length"
- "starttransfer_time"
- "redirect_time"
用POST方法发送数据,新建 from.php,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $post_data = array (
- "hyh" => "man",
- "xlp" => "woman",
- "love" => "yes"
- );
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
-
- echo $output;
- ?>
新建to.php,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
- echo "从 from.php POST数据到 to.php 成功!以下为 to.php 返回的数据:<br><br>";
- print_r($_POST);
- echo "<br><br>I'm come from http://www.phpfensi.com"
- ?>
文件上传
上传文件和前面的POST十分相似,因为所有的文件上传表单都是通过POST方法提交的。
新建 from.php,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $post_data = array (
- "hyh" => "man",
- "upload" => "@C:/test.zip"
- );
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
-
- echo $output;
- ?>
新建 to.php,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
- print_r($_FILES);
- ?>
如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号。
另一些有用的cURL范例
HTTP认证
如果某个URL请求需要基于 HTTP 的身份验证,你可以使用下面的代码:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
- ?>
FTP上传
PHP 自带有 FTP 类库,但你也能用 cURL,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $file = fopen("/path/to/file", "r");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "ftp://username:password@3aj.cn:21/path/to/new/file");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-
- curl_setopt($ch, CURLOPT_UPLOAD, 1);
- curl_setopt($ch, CURLOPT_INFILE, $fp);
- curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
-
- curl_setopt($ch, CURLOPT_FTPASCII, 1);
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
- ?>
你可以用代理发起cURL请求,代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://www.phpfensi.com");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:pass');
-
- $output = curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
- ?>
回调函数
可以在一个URL请求过程中,让cURL调用某指定的回调函数,例如,在内容或者响应下载的过程中立刻开始利用数据,而不用等到完全下载完,实例代码如下:
- <?php
- header("Content-type: text/html; charset=utf-8");
-
- $ch = curl_init();
-
- curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
- curl_setopt($ch, CURLOPT_WRITEFUNCTION, "progress_function");
-
- curl_exec($ch);
-
- if ($output === FALSE) {
- echo "cURL Error: " . curl_error($ch);
- }
-
- curl_close($ch);
-
- function progress_function($ch, $str) {
- echo $str;
- return strlen($str);
- }
- ?>
这个回调函数必须返回字串的长度,不然此功能将无法正常使用,在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空间是有密码保护的,代码如下:
- <form action="curlupload.php" method="post" enctype="multipart/form-data">
- <div>
- <label for="upload">Select file</label>
- <input name="upload" type="file" />
- <input type="submit" name="Submit" value="Upload" />
- </div>
- </form>
这个表单页面比较简单,仅仅是拥有一个文件上传的功能,然后我们需要下面的php代码来接收上传过来的文件,使用 cURL 打开一个文件流并传送到远程ftp服务器上去,实例代码如下:
- if (isset($_POST['Submit'])) {
- if (!emptyempty($_FILES['upload']['name'])) {
- $ch = curl_init();
- $localfile = $_FILES['upload']['tmp_name'];
- $fp = fopen($localfile, 'r');
- curl_setopt($ch, CURLOPT_URL, 'ftp://username:password@3aj.cn/'.$_FILES['upload']['name']);
- curl_setopt($ch, CURLOPT_UPLOAD, 1);
- curl_setopt($ch, CURLOPT_INFILE, $fp);
- curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
- curl_exec($ch);
- $error_no = curl_errno($ch);
- curl_close($ch);
- if ($error_no == 0) {
- $error = 'File uploaded succesfully.';
- } else {
- $error = 'File upload error.';
- echo "i come from ";
- }
- } else {
- $error = 'Please select a file.';
- }
- }
当用户选择了并上传了一个文件,文件先保存在web服务器上,我们使用 fopen 打开这个临时文件并初始一个cURL会话,在发送的url中,把ftp的账号和密码填上,然后再设置cURL的其他必备参数即可,如果返回的错误数量为0,那么文件就上传成功了。