php
/**
*/
class Httplib{
// 目标网站无法打开时返回的错误代码
// 自定义 UserAgent 字符串
var $_url,$_method,$_timeout;
var $_scheme,$_host,$_port,$_path,$_query,$_referer;
var $_header;
var $_response;
*
* @param 同下面的参数
@set_time_limit(0);
if (!empty($url)) {
$this-connect($url,$method,$timeout);
}
return $this;
* 初始化对象
* @param string $url
* @param string $method
* @param int $timeout
* @return object
return $this-__construct($url,$method,$timeout);
* 改变连接url
$this-_header = null;
$this-_response = null;
$this-_url = $url;
$this-_method = strtoupper(empty($method) ? 'GET' : $method);
$this-_parseURL($url);
* 发送请求
* @param array $params
* @return bool
function send($params=array()) {
$header = null; $response = null; $QueryStr = null;
if (!empty($params)) { $this-_method = 'POST'; }
if (function_exists('fsockopen')) {
$fp = @fsockopen($this-_host,$this-_port,$errno,$errstr,$this-_timeout);
if (!$fp) { return false; }
$SendStr = "{$this-_method} {$this-_path}{$this-_query} HTTP/1.0\r\n";
$SendStr.= "Host:{$this-_host}{$_port}\r\n";
$SendStr.= "Accept: */*\r\n";
$SendStr.= "Referer:{$this-_referer}\r\n";
$SendStr.= "User-Agent: ".$this-_SEND_USER_AGENT."\r\n";
$SendStr.= "Pragma: no-cache\r\n";
$SendStr.= "Cache-Control: no-cache\r\n";
//如果是POST方法,分析参数
if ($this-_method=='POST') {
//判断参数是否是数组,循环出查询字符串
if (is_array($params)) {
$QueryStr = http_build_query($params);
} else {
$QueryStr = $params;
$length = strlen($QueryStr);
$SendStr.= "Content-Type: application/x-www-form-urlencoded\r\n";
$SendStr.= "Content-Length: {$length}\r\n";
$SendStr.= "Connection: Close\r\n\r\n";
if(strlen($QueryStr) 0){
$SendStr.= $QueryStr."\r\n";
fputs($fp,$SendStr);
// 读取 header
do{ $header.= fread($fp,1); } while (!preg_match("/\r\n\r\n$/",$header));
// 遇到跳转,执行跟踪跳转
if ($this-_redirect($header)) { return true; }
// 读取内容
while(!feof($fp)) {
fclose($fp);
} elseif (function_exists('curl_exec')) {
$ch = curl_init($this-_url);
curl_setopt_array($ch,array(
CURLOPT_TIMEOUT = $this-_timeout,
CURLOPT_HEADER = true,
CURLOPT_RETURNTRANSFER = true,
CURLOPT_USERAGENT = $this-_SEND_USER_AGENT,
CURLOPT_REFERER = $this-_referer,
));
if ($this-_method=='GET') {
curl_setopt($ch,CURLOPT_HTTPGET,true);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$QueryStr);
$fp = curl_exec($ch);
curl_close($ch);
$i = 0; $length = strlen($fp);
do{ $header.= substr($fp,$i,1); $i◆◆; } while (!preg_match("/\r\n\r\n$/",$header));
do {
} while ($length=$i);
unset($fp,$length,$i);
$this-_header = $header;
$this-_response = $response;
return true;
* 跟踪跳转
* @param string $header
function _redirect($header){
if(preg_match("/Location\:(.◆)\r\n/i",$header,$regs)){
$this-connect(trim($regs[1]),$this-_method,$this-_timeout);
$this-send();
return false;
* 取得请求的header
* @return string
function header(){
return $this-_header;
* 请求返回的html
function response(){
return $this-_response;
* 返回状态
* @return int
function status($header=null){
if (empty($header)) {
$header = $this-_header;
if(preg_match("/(.◆) (\d◆) (.◆)\r\n/i",$header,$status)){
return $this-_ERROR_CONNECT_FAILURE;
* 解析url
* @param string $url
function _parseURL($url){
$aUrl = parse_url($url);
$aUrl['query'] = isset($aUrl['query']) ? $aUrl['query'] : null;
$scheme = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : null;
$this-_scheme = ($scheme=='off' || empty($scheme)) ? 'http' : 'https';
$this-_host = isset($aUrl['host']) ? $aUrl['host'] : null;
$this-_path = empty($aUrl['path']) ? '/' : (string)$aUrl['path'];
$this-_query = strlen($aUrl['query']) 0 ? '?'.$aUrl['query'] : null;
$this-_referer = $this-_scheme.'://'.$aUrl['host'];
$http = new Httplib('');
$http-send();
$body = $http-response();
echo $body;
PHP
ob_start();
一种使用fsockopen,所有的头信息全部手动连接成字符串即可.
一种使用curl,可以直接将头信息写成数组,调用curl_setopt设定头信息即可.
PHP中一般采用getallheaders来获取头部,但事实上,有些模式下是获取不到的(以前真没有注意过在fastcgi下这个函数不能用)
在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说我们还需要考虑别的方法,幸运的是$_SERVER里有我们想要的东西,它里面键名以HTTP_开头的就是HTTP请求头:
$headers = array();
foreach ($_SERVER as $key = $value) {
代码很简单,需要说明的是RFC里明确指出了信息头的名字是不区分大小写的.
不过并不是所有的HTTP请求头都是以HTTP_开头的的键的形式存在与$_SERVER里,比如说Authorization,Content-Length,Content-Type就不是这样,所以说为了取得所有的HTTP请求头,还需要加上下面这段代码:
if (isset($_SERVER['PHP_AUTH_DIGEST'])) {
$header['AUTHORIZATION'] = $_SERVER['PHP_AUTH_DIGEST']);
} elseif (isset($_SERVER['PHP_AUTH_USER']) isset($_SERVER['PHP_AUTH_PW'])) {
if (isset($_SERVER['CONTENT_LENGTH'])) {
$header['CONTENT-LENGTH'] = $_SERVER['CONTENT_LENGTH'];
if (isset($_SERVER['CONTENT_TYPE'])) {
$header['CONTENT-TYPE'] = $_SERVER['CONTENT_TYPE'];
var_dump(apache_request_headers());
//服务器是apache的话?(我没试过别的服务器能否用)
http_get_request_headers()//需安装?pecl_http?扩展
oCurl?=?curl_init();
//?设置请求头
$header[]?=?"Content-type:?application/x-www-form-urlencoded";
curl_setopt($oCurl,?CURLOPT_URL,?$sUrl);
curl_setopt($oCurl,?CURLOPT_HTTPHEADER,$header);
//?返回?response_header,?该选项非常重要,如果不为?true,?只会获得响应的正文
curl_setopt($oCurl,?CURLOPT_HEADER,?true);
//?是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
curl_setopt($oCurl,?CURLOPT_NOBODY,?true);
//?使用上面定义的?ua
curl_setopt($oCurl,?CURLOPT_USERAGENT,$user_agent);
curl_setopt($oCurl,?CURLOPT_RETURNTRANSFER,?1?);
//?不用?POST?方式请求,?意思就是通过?GET?请求
curl_setopt($oCurl,?CURLOPT_POST,?false);
$sContent?=?curl_exec($oCurl);
//?获得响应结果里的:头大小
$headerSize?=?curl_getinfo($oCurl,?CURLINFO_HEADER_SIZE);
//?根据头大小去获取头信息内容
$header?=?substr($sContent,?0,?$headerSize);
curl_close($oCurl);
以上就是土嘎嘎小编为大家整理的关于php的头信息的简单介绍关于php的头信息的简单介绍相关咨询咨询主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!