如何只获取php socket请求的结果?

问题描述

我尝试从套接字请求中获取没有HTTP标头的结果,但是脚本返回整个HTTP标头,如下所示:

$api_pause = parse_url('http://server/api.php');            

$requestArray_pause = array('user' => 'someuser','pass' => 'somepasse','source' => 'PAUSE','function' => 'field_info','field_name' => 'status','user_id'=> $user_id );
    $sock_pause = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    socket_connect($sock_pause,$api_pause['host'],((isset($api_pause['port'])) ? $api_pause['port'] : 80));
    if (!$sock_pause) {
        throw new Exception('Connexion echouee!');
    }
    $request_pause = '';
    if (!empty($requestArray_pause)) {
        foreach ($requestArray_pause as $k_p => $v_p) {
            if (is_array($v_p)) {
                foreach($v_p as $v2_p) {
                    $request_pause .= urlencode($v_p).'[]='.urlencode($v2_p).'&';
                }
            }
            else {
                $request_pause .= urlencode($k_p).'='.urlencode($v_p).'&';
            }
        }
        $request_pause = substr($request_pause,-1);
    }
    $data_pause = "POST ".$api_pause['path'].((!empty($api_pause['query'])) ? '?'.$api_pause['query'] : '')." HTTP/1.0\r\n"
    ."Host: ".$api_pause['host']."\r\n"
    ."Content-type: application/x-www-form-urlencoded\r\n"
    ."User-Agent: PHP\r\n"
    ."Content-length: ".strlen($request_pause)."\r\n"
    ."Connection: close\r\n\r\n"
    .$request_pause."\r\n\r\n";
    socket_send($sock_pause,$data_pause,strlen($data_pause),0);
    $result_pause = '';
    do {
        $piece_pause = socket_read($sock_pause,1024);
        $result_pause .= $piece_pause;
    }
    while($piece_pause != '');
    socket_close($sock_pause);
   
   
   echo $result_pause;  

代码的结果是:

HTTP/1.1 200 OK
Date: Wed,16 Sep 2020 10:51:35 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Cache-Control: no-cache,must-revalidate
Pragma: no-cache
Content-Length: 1
Connection: close
Content-Type: text/html; charset=utf-8

A

在我的情况下,我想仅获得此示例中没有标题信息的最后一个值“ A”。

解决方法

套接字将为您提供接收到的任何数据,无论它是什么协议。 因此,您必须自己处理所有HTTP标头。

HTTP标头通过两个换行符(空行)与正文分开。您可以只剪切两条空行之前的所有数据:

   $body = preg_replace('/^.*?\r?\n\r?\n/s','',$result_pause);

如果要使用HTTP协议进行通信,请考虑使用例如cURL而不是普通套接字

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...