相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡(jiǎn)單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說(shuō)明
- thinkPHP5框架實(shí)現(xiàn)分頁(yè)查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
PHP對(duì)CURL函數(shù)的使用
PHP在LINUX上可以利用CURL程序進(jìn)行一些http的交互,甚至包括網(wǎng)站登錄,POST請(qǐng)求等。當(dāng)然要求系統(tǒng)帶CURL,其次版本還要7以上,具體可參考手冊(cè)。
首先看下最簡(jiǎn)單的獲取一個(gè)HTTP頁(yè)面的寫法:

$url = "http://www.163.com"; //以163為例
$session = curl_init($url);
curl_exec($session);
if (curl_errno($session)) //出錯(cuò)處理
echo curl_error($session);
curl_close($session);
功能就是GET 163的主頁(yè)。然后更進(jìn)一步,使用curl_setopt函數(shù)做些調(diào)整。
然后看個(gè)復(fù)雜點(diǎn)的,作用是登錄網(wǎng)站。

$url = "http://www.abc.com/login.php";
$postargs = "name=jack&password=123456";
$session = curl_init($url);
//設(shè)置postargs參數(shù),就POST出去
curl_setopt($session, CURLOPT_POST, true);
curl_setopt($session, CURLOPT_POSTFIELDS, $postargs);
//是否返回header信息,一般可用于檢查http返回狀態(tài)值
curl_setopt($session, CURLOPT_HEADER, true);
//使用cookie,可以用于登錄操作,注意需要對(duì)應(yīng)的目錄權(quán)限
curl_setopt($session,CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($session,CURLOPT_COOKIEJAR, "cookie.txt");
//將返回結(jié)果寫入變量
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($session);
if (curl_errno($session)) {
echo curl_error($session);
}
curl_close($session);
//輸出結(jié)果,在這之后可以相應(yīng)的parse自己需要的東西
echo $ret;
需要注意的就是header頭,我們可以用來(lái)檢查HTTP狀態(tài)結(jié)果,例如服務(wù)器返回302讓客戶端做跳轉(zhuǎn)等的操作。另外還可以發(fā)送HEADER信息,用來(lái)認(rèn)證。
CURL還能用于并發(fā)操作,多線程的并發(fā),比C#那個(gè)偽的強(qiáng)哦。。并發(fā)處理的例子:

$url1 = "http://www.abc.com/test1.php";
$url2 = "http://www.abc.com/test2.php";
$cl1 = curl_init(); //初始化2個(gè)用于線程操作的
$cl2 = curl_init();
curl_setopt($cl1,CURLOPT_URL,$url1);
curl_setopt($cl2,CURLOPT_URL,$url2);
//繼續(xù)用cookie文件,假設(shè)我們剛才已經(jīng)登錄,需要保持會(huì)話的話
curl_setopt($cl1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cl1, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($cl1, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($cl2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cl2, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($cl2, CURLOPT_COOKIEJAR, "cookie.txt");
$mh = curl_multi_init(); //主要靠這個(gè)初始化多線程的
curl_multi_add_handle($mh,$cl1);
curl_multi_add_handle($mh,$cl2);
$running = null;
do{
curl_multi_exec($mh,$running);
} while($running > 0); //跑完后running會(huì)被置0
//獲取返回結(jié)果
$ret = array();
$ret[] = curl_multi_getcontent($cl1);
$ret[] = curl_multi_getcontent($cl2);
//關(guān)閉
curl_multi_remove_handle($mh,$cl1);
curl_multi_remove_handle($mh,$cl2);
curl_multi_close($mh);
說(shuō)明一下,這里繼續(xù)用到cookie,可以讓CURL在發(fā)送請(qǐng)求的同時(shí)把cookie的內(nèi)容也header上去,這樣就保持了會(huì)話。多個(gè)并發(fā)的操作其實(shí)也類似,就是把幾個(gè)分別設(shè)置完,然后一起加到multi那個(gè)函數(shù)里,然后一并發(fā)送。
補(bǔ)充:
使用代理的方法,可以通過(guò)