萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php CURL函數入門教程詳解

php CURL函數入門教程詳解

在php中 cURL函數有一組相關函數,它是一個非常不錯的函數了,我們經常用它來模仿各種登錄與采集工作,下面我來給各位介紹CURL函數入門吧。

cURL簡介

cURL是一個利用URL語法規定來傳輸數據和文件的工具,支持很多種協議如HTTP、FTP、TELNET等。PHP也支持 cURL 庫。


假如我們要獲取某個網頁的內容,我們可能會使用下面這幾種方法:

 代碼如下 復制代碼


<?php
// 把整個文件讀入一個字符串中
$str = file_get_contents("http://www.111cn.net");

// 把整個文件讀入一個數組中
$arr = file("http://www.111cn.net");

// 讀入一個文件並寫入到輸出緩沖
$out = readfile("http://www.111cn.net");
?>


 

這幾種做法相當簡單,但缺乏靈活性和有效的錯誤處理。而且他們無法完成一些高難度動作,比如處理coockies、驗證、表單提交、文件上傳等等。


cURL簡例

下面給出一段簡單的代碼,從其中你可以學習到使用cURL的大概步驟,php cURL入門教程。

 代碼如下 復制代碼

 

<?php
header("Content-type: text/html; charset=utf-8");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 3. 執行並獲取返回的內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl資源
curl_close($ch);

// 輸出獲得的源代碼
echo $output;
?>


關於第二步的 curl_setopt() 是最為重要的,有一長串cURL參數可供設置,它們能指定URL請求的各個細節。


獲取信息

這是另一個可選的設置項,能夠在cURL執行後獲取這一請求的有關信息:

 代碼如下 復制代碼

 

<?php
header("Content-type: text/html; charset=utf-8");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 3. 執行並獲取HTML文檔內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 獲取 cURL 信息 並輸出
$info = curl_getinfo($ch);
echo '獲取 '. $info['url'] . ' 耗時 '. $info['total_time'] . '秒';

// 5. 釋放curl句柄
curl_close($ch);
?>


返回的數組中包括了以下信息:


"url"     // 資源網絡地址
"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_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 的數據
$post_data = array (
    "hyh" => "man",
    "xlp" => "woman",
    "love" => "yes"
);

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1); // 這裡設置為post方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加准備post的數據

// 3. 執行並獲取返回內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl句柄
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.111cn.net"
?>


 


文件上傳

上傳文件和前面的POST十分相似,因為所有的文件上傳表單都是通過POST方法提交的。

新建 from.php

 代碼如下 復制代碼


<?php
header("Content-type: text/html; charset=utf-8");

// 待 post 的數據
$post_data = array (
    "hyh" => "man",
    "upload" => "@C:/test.zip" // 要上傳的本地文件地址
);

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://localhost/to.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1); // 這裡設置為post方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加准備post的數據

// 3. 執行並獲取返回內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl資源
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");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
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); // 讓 cURL 在重定向後,也能發送用戶名和密碼

// 3. 執行並獲取返回內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl句柄
curl_close($ch);
?>


FTP上傳

PHP 自帶有 FTP 類庫,但你也能用 cURL,也可以參考這篇文章:php使用cURL來實現ftp上傳

 

 代碼如下 復制代碼

<?php
header("Content-type: text/html; charset=utf-8");

// 開一個文件指針
$file = fopen("/path/to/file", "r");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "ftp://username:[email protected]: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"));
// 是否開啟ASCII模式 (上傳文本文件時有用)
curl_setopt($ch, CURLOPT_FTPASCII, 1);

// 3. 執行並獲取返回內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl句柄
curl_close($ch);
?>


 

你可以用代理發起cURL請求:

 代碼如下 復制代碼

<?php
header("Content-type: text/html; charset=utf-8");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // 指定代理地址
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:pass'); // 如果需要的話,提供用戶名和密碼

// 3. 執行並獲取返回內容
$output = curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl句柄
curl_close($ch);
?>


 

回調函數


可以在一個URL請求過程中,讓cURL調用某指定的回調函數。例如,在內容或者響應下載的過程中立刻開始利用數據,而不用等到完全下載完。

 代碼如下 復制代碼

 

<?php
header("Content-type: text/html; charset=utf-8");

// 1. 初始化
$ch = curl_init();

// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "progress_function");

// 3. 執行並獲取返回內容
curl_exec($ch);

// 4. 錯誤判斷,注意這裡是布爾值,而不是空輸出,所以是3個等號
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}

// 5. 釋放curl句柄
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 (!empty($_FILES['upload']['name'])) {
        $ch = curl_init();
        $localfile = $_FILES['upload']['tmp_name'];
        $fp = fopen($localfile, 'r');
        curl_setopt($ch, CURLOPT_URL, 'ftp://username:[email protected]/'.$_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,那麼文件就上傳成功了。


小結

今天我們一起學習了cURL庫的強大功能和靈活的擴展性 原文整理自:3a教程網

copyright © 萬盛學電腦網 all rights reserved