使用HttpClient类库
有些时候,我们需要在一个页面中引用自己站点中的一个页面或外部网站上的一个页面,但这个页面又要求必须以POST方式向其发送参数。这一技术实现起来比较麻烦,大致使用Curl、socket、file_get_contents技术来实现,但最常用的是file_get_contents()函数,但,它默认是以GET方式提交数据,想改成POST方式,实现起来相当的麻烦,所以,我们就不得不想“歪门斜道”了——使用现在比较流行的一个类(HttpClient),这个类文件可以到http://scripts.incutio.com/httpclient/index.php下载最新版本。我已经下载好了这个类文件,我用的文件名称是HttpClient.class.php,把它引用到需要用PHP直接以POST方式提交数据的页面中,然后按照下面的实例操作即可。
例一:用HttpClient类POST数据到另一页面(注意,这里不使用表单)
$pageContents = HttpClient::quickPost(‘http://www.abc.com/news.php’, array(
‘add’ =>’河南省’,
‘name’ =>’张三’,
‘sex’=>’男’
));
//此时,$pageContents中存放的就是news.php页面中的内容。
说明:quickPost方法需要两个参数,第一个参数给出需要引用页面的URL地址。第二个参数是一个数组,用以设置POST数据时的参数,这里传递了三个参数add,name,sex。
例二:静态方法获取另一网页中的内容
$pageContents = HttpClient::quickGet(‘http://example.com/’);
例三:Get方法获取
$client = new HttpClient(‘example.com’);
if (!$client->get(‘/’))
{
die(‘An error occurred: ‘.$client->getError());
}
$pageContents = $client->getContent();
例四:带调试的Get方法获取
$client = new HttpClient(‘example.com’);
$client->setDebug(true);
if (!$client->get(‘/’))
{
die(‘An error occurred: ‘.$client->getError());
}
$pageContents = $client->getContent();
例五:带自动转向的Get方法
$client = new HttpClient(‘www.amazon.com’);
$client->setDebug(true);
if (!$client->get(‘/’))
{
die(‘An error occurred: ‘.$client->getError());
}
$pageContents = $client->getContent();
例六:检查页面是否存在
$client = new HttpClient(‘example.com’);
$client->setDebug(true);
if (!$client->get(‘/thispagedoesnotexist’))
{
die(‘An error occurred: ‘.$client->getError());
}
if ($client->getStatus() == ‘404’)
{
echo ‘Page does not exist!’;
}
$pageContents = $client->getContent();
二、PHP curl实现服务器端http、ftp等操作
curl 是一个利用url语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等,PHP作为一种日益普通和流行使用的网站后台编写语言,也同样支持 curl库。
在PHP中使用curl功能,必须让PHP开启curl功能,即加载php_curl.dll模块,打开PHP的ini文件,打开文件,找到extension=php_curl.dll扩展,如果extension前面有英文的分号,把分号删除后保存,然后重启IIS或APACHE。如果没有分号,则说明你的PHP已经支持curl功能。
curl的使用步骤是:
1、初始化curl;
2、设置curl相关设置;
3、执行curl远程请求操作,并获取所需结果;
4、释放curl句柄。
使用DEMO:
<?php
$curl=curl_init();
//初始化curl,并把句柄给变量$curl
//下面开始设置curl功能的相关设置
curl_setopt($curl,CURLOPT_URL, “http://www.demo.com/content.php”);
//设置请求的目标地址
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
//把获取到的内容以文件流的形式返回,而不是直接输出,值为0是直接输出。
curl_setopt($curl,CURLOPT_HEADER,0);
//只需要返回http头信息,并不把头信息输出
$result=curl_exec($curl);
//执行curl请求操作,并把请求的结果存入变量$result。如果请求失败,curl_exec()函数返回逻辑值false
if($result===false)//如果请求失败,给出错误信息,注意这里使用了三个=符号
{
echo”curl请求失败:”.curl_error($curl);
//输出错误信息
}
else
{
echo $result;
//将结果输出到客户端浏览器
}
curl_close($curl);
//关闭curl句柄
?>
上例只是一个非常简单的curl功能使用,其实curl还有很多非常实用的功能,比如模拟浏览请求,服务器端文件上传等。curl功能的一切玄机都在curl_setopt()这个参数配置参数上。比如,在编写网页内容采集程序时,有些网站的服务器设置为必须是浏览请求再给予正确的应答,此时就用到了curl功能的模拟浏览器功能。下面给出一个模拟浏览器的DEMO。
<?php
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL, “http://www.demo.com/content.php”);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,1);
//从证书中检查SSL加密算法是否存在
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
//是否开启对认证证书的来源进行检查
curl_setopt($curl,CURLOPT_POST,1);
//用POST方法向目标地址传递数据
curl_setopt($curl,CURLOPT_POSTFIELDS,array(“tid”=>1020, “page”=>1));
//需要向目标地址传递的参数及值,支持数组形式
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,0);
//不开启自动跳转模拟
curl_setopt($curl,CURLOPT_REFERER, “referrer string”);
//http请求的referer请求字符串,根据需要设置,不需要传递referer字符串时,此设置可为空为不设置此项。
curl_setopt($curl,CURLOPT_USERAGENT,”Mozilla/5.0 (Windows NT 5.1;
rv:9.0.1) Gecko/20100101 Firefox/9.0.1″);
//模拟火狐浏览器
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
//得到的结果不直接输出
curl_setopt($curl,CURLOPT_HEADER,false);
//不发送请求头信息
$result=curl_exec($curl);
//将请求结果放入变量$result
curl_close($curl);
//关闭curl句柄
?>
此DEMO模拟了火狐浏览器的数据请求。如果想要模拟客户端使用的浏览器,此,浏览器配置项可以使用curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER[‘HTTP_USER_AGENT’])。
curl_setopt()还有很多其它的配置选项,请参考PHP手册。