php CURL函數入門教程詳解
來源:程序員人生 發布時間:2014-06-07 20:38:55 閱讀次數:3180次
在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,那么文件就上傳成功了。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈