如何只获取php套接字请求的结果?
How to get only the result of php socket request?
我尝试在没有 HTTP header 的情况下从套接字请求中获取结果,但是脚本 return 整个 HTTP header 如下所示:
$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,0,-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”,没有 headers 信息。
Socket 将为您提供接收到的任何数据,无论它是什么协议。
因此,您有义务自己处理所有 HTTP headers。
HTTP headers 与 body 由两个换行符(空行)分隔。您可以将两个空行之前的所有数据剪切掉:
$body = preg_replace('/^.*?\r?\n\r?\n/s', '', $result_pause);
如果您想使用 HTTP 协议进行通信,请考虑使用例如 cURL 而不是普通套接字
我尝试在没有 HTTP header 的情况下从套接字请求中获取结果,但是脚本 return 整个 HTTP header 如下所示:
$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,0,-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”,没有 headers 信息。
Socket 将为您提供接收到的任何数据,无论它是什么协议。 因此,您有义务自己处理所有 HTTP headers。
HTTP headers 与 body 由两个换行符(空行)分隔。您可以将两个空行之前的所有数据剪切掉:
$body = preg_replace('/^.*?\r?\n\r?\n/s', '', $result_pause);
如果您想使用 HTTP 协议进行通信,请考虑使用例如 cURL 而不是普通套接字