使用PHP得到所有的HTTP请求头_还有应答头

1)如何获取 客户端请求的头部

参考网站:

http://www.neatstudio.com/show-377-1.shtml

PHP中一般采用getallheaders来获取头部,但事实上,有些模式下是获取不到的(以前真没有注意过在fastcgi下这个函数不能用,当然我现在也没有测试。是老王说的)

他说:

在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说我们还需要考虑别的方法,幸运的是$_SERVER里有我们想要的东西,它里面键名以HTTP_开头的就是HTTP请求头:

$headers = array(); 
foreach ($_SERVER as $key => $value) { 
    if ('HTTP_' == substr($key, 0, 5)) { 
        $headers[str_replace('_', '-', substr($key, 5))] = $value; 
    } 
}

代码很简单,需要说明的是RFC里明确指出了信息头的名字是不区分大小写的。

 

2)如果php脚本作为http客户端,用curl去请求远端 服务器,那么如何获取 http响应消息 的应答头!
代码如下:

<?php
$xml = <<<'EOF'
<?xml version="1.0" encoding="UTF-8" ?>
<body>
<keyword>3333</keyword>
<order>0</order>
<pagesize>10</pagesize>
<pagenum>1</pagenum>
<corporation_id>3398351028</corporation_id>
</body>
EOF;
$PublicAccountServerIP = "218.205.81.33";

$header[]="Host: $PublicAccountServerIP";
$header[]="Accept-Encoding: gzip";
$header[]="Content-Type: text/xml";
//自定义头部--start
$header[]="msgname: getpubliclist";
$header[]="version: 1.0.0";
$header[]="userid: +8618867101652_3398351028@li726-26";
$header[]="AuthType:httpdigest";
//自定义头部--end
$header[]="Content-Length: ".strlen($xml);

$url = "http://$PublicAccountServerIP/padata/eclient/msg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_HEADER, 0);  #必须把应答头开启
curl_setopt($ch, CURLOPT_HEADER, 1); #头部有result: 000000 字段,表示应答请求信息,参考接口说明
$ret = curl_exec($ch);
$headSize = curl_getinfo($ch,CURLINFO_HEADER_SIZE); #获取头部数据大小,此项必须增加进来
curl_close($ch);

$strHead = substr($ret,0,$headSize-2); # \r\n多余
$strBody = substr($ret,$headSize);
echo $strHead;
echo "\r\n";
echo $strBody;
echo "\r\n";
echo getHttpField($strHead,'result');

//获取http请求头部的某个头域的值
function getHttpField($strHead,$strField){
if(!$strHead || !$strField){return null;}
$arr = explode("\r\n",$strHead);
foreach($arr AS $v){
$pos = strpos($v,':');
if($pos){
$field = substr($v,0,$pos);
$value = trim(substr($v,$pos+1));
if( $field == $strField){
return $value;
}
}
}
return null;
}


?>

重要说明:

转载于:https://www.cnblogs.com/voiphudong/p/4168693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现808协议服务端接收注册请求,你需要了解一些基本的网络编程知识,以及808协议的相关规定。下面是一个简单的PHP代码示例,可以用来接收808协议的注册请求: ```php <?php $host = '0.0.0.0'; // 监听的IP地址 $port = 8080; // 监听的端口号 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建socket socket_bind($socket, $host, $port); // 绑定地址和端口 socket_listen($socket); // 开始监听连接请求 while (true) { $client = socket_accept($socket); // 接收到客户端的连接请求 $data = socket_read($client, 1024); // 读取客户端发送的数据 // 解析808协议数据包 $header = substr($data, 0, 12); // 数据包部 $body = substr($data, 12); // 数据包正文部分 // 检查数据包校验码 $checksum = 0; for ($i = 0; $i < strlen($body); $i++) { $checksum ^= ord($body[$i]); } $checksum = sprintf('%02X', $checksum); if ($checksum == substr($header, -2)) { // 校验码正确,处理注册请求 $phone = substr($body, 0, 11); // 手机号码 $password = substr($body, 11, 6); // 密码 // TODO: 处理注册请求 // 返回应答数据 $response = "8100" . substr($header, 4, 4) . "0000"; socket_write($client, hex2bin($response)); } else { // 校验码错误,忽略该请求 continue; } socket_close($client); // 关闭连接 } socket_close($socket); // 关闭socket ``` 这段代码创建一个TCP服务端,监听8080端口上的连接请求。当客户端连接上来并发送数据包时,服务端会解析数据包,并根据数据包的内容进行相应的处理。最后,服务端会返回一个应答数据包给客户端。在实际使用中,你需要根据具体业务需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值