PHP curl(Client URL Library)是一種用來與服務(wù)器進(jìn)行HTTP通信的工具。它能夠模擬一個Web瀏覽器向服務(wù)器發(fā)送請求并處理響應(yīng)。使用curl可以方便地獲取Web上的數(shù)據(jù)和資源,也可以提交表單、上傳文件等操作,使得PHP程序的功能更加完善。
在進(jìn)行Web開發(fā)的過程中,我們經(jīng)常需要獲取外部網(wǎng)站的內(nèi)容,比如天氣預(yù)報(bào)、股票數(shù)據(jù)、新聞內(nèi)容等。通常這些數(shù)據(jù)都需要進(jìn)行驗(yàn)證,只有經(jīng)過驗(yàn)證才能獲取到。而驗(yàn)證的方法之一就是通過ticket。ticket是一種令牌,通常在用戶登錄之后,服務(wù)器會為用戶頒發(fā)一個ticket,只有帶有正確的ticket才能在服務(wù)器端獲取到數(shù)據(jù)。
下面我們來看一個獲取股票數(shù)據(jù)的例子,該例子需要先登錄新浪財(cái)經(jīng),然后帶上ticket才能獲取股票數(shù)據(jù)。
<?php
//登錄的url地址
$url_login = 'https://login.sina.com.cn/sso/login.php';
//獲取數(shù)據(jù)的url地址
$url_stock = 'http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/tpzs/index.phtml';
$username = 'your_username'; //替換為你的新浪賬號
$password = 'your_password'; //替換為你的新浪賬號密碼
$cookie_file = tempnam('./temp','cookie');
//先模擬登錄獲取ticket
$post_fields = array(
'entry' =>'sso',
'gateway' =>'1',
'from' =>'null',
'savestate' =>'30',
'useticket' =>'0',
'pagerefer' =>'',
'vsnf' =>'1',
'su' =>base64_encode($username),
'service' =>'sso',
'sp' =>$password,
'sr' =>'1920*1080',
'encoding' =>'UTF-8',
'cdult' =>'3',
'domain' =>'sina.com.cn',
'prelt' =>mt_rand(20,40),
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_login);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields));
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);
//獲取數(shù)據(jù)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_stock);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
echo $data;
?>
代碼中使用了兩個curl操作。第一個操作模擬用戶登錄,獲取到ticket后將其保存在$cookie_file中。第二個操作使用之前獲取到的$cookie_file,帶上正確的ticket獲取數(shù)據(jù)。
除了獲取數(shù)據(jù)之外,curl還可以上傳文件、發(fā)送郵件等操作。以上傳文件為例,先看上傳文件表單的HTML代碼:
<form name="upload" method="post" action="http://example.com/upload.php" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" name="submit" value="上傳"></form>
上傳文件的PHP代碼如下:
<?php
$file_path = '/path/to/file'; //替換為要上傳的文件路徑
$post_fields = array(
'file' =>'@' . realpath($file_path)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/upload.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$data = curl_exec($ch);
curl_close($ch);
echo $data;
?>
代碼中使用了@符號將要上傳的文件路徑進(jìn)行了包裝。這樣curl就會將文件本身作為上傳內(nèi)容。如果不使用@符號,curl會將路徑字符串作為上傳內(nèi)容。
總之,curl是PHP開發(fā)中經(jīng)常使用的一個工具,可以方便地獲取Web上的數(shù)據(jù)和資源,也可以發(fā)送請求與服務(wù)器進(jìn)行交互,是開發(fā)人員必知必會的工具之一。