Php 在不等待响应的情况下执行HTTP GET请求

Php 在不等待响应的情况下执行HTTP GET请求,php,curl,php-7,Php,Curl,Php 7,我有一个PHP脚本,用户通过短信发送OTP。我使用的SMS网关大约需要5-8秒才能响应。我不能等那么久。我需要发出请求并立即向用户发送HTML响应。 我使用了curl,它花费的时间太长,短的超时会断开连接,使网关无法预测。我需要一种方法来发出请求,执行一些例程,最好能选择验证请求您使用的是stream\u socket\u client()。执行GET请求,然后稍后获取结果 使用stream_socket_client()发出请求 更新 您可以随时提出请求,并在请求后随时获得响应。创建套接字时,

我有一个PHP脚本,用户通过短信发送OTP。我使用的SMS网关大约需要5-8秒才能响应。我不能等那么久。我需要发出请求并立即向用户发送HTML响应。


我使用了curl,它花费的时间太长,短的超时会断开连接,使网关无法预测。我需要一种方法来发出请求,执行一些例程,最好能选择验证请求

您使用的是
stream\u socket\u client()
。执行GET请求,然后稍后获取结果

使用stream_socket_client()发出请求 更新 您可以随时提出请求,并在请求后随时获得响应。创建套接字时,$sockets数组的键是$id。

如果要使用其他控制方法,则不必使用while循环。示例中的缓冲区是8K。如果响应超过8K,则需要多次读取。

如果不想检索响应,只需关闭套接字,不要使用$sockets数组。fclose()之前可能需要也可能不需要延迟。这取决于主机如何响应断开的连接

$host = 'www.example.com';
$path = '/?param=value';
$http = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
$stream = stream_socket_client("$host:80", $errno,$errstr, 120,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); 

if ($stream) {
  fwrite($stream, $http);
  fclose($stream); 

}
else { 
  $err .=  "$id Failed<br>\n";
}     
$host='www.example.com';
$path='/?param=value';
$http=“GET$path http/1.0\r\n主机:$host\r\n\r\n”;
$stream=stream_socket_client($host:80,$errno,$errstr,120,stream_client_ASYNC_CONNECT | stream_client_CONNECT);
如果($stream){
fwrite($stream,$http);
fclose($流);
}
否则{
$err.=“$id失败
\n”; }
是的,您正在寻找curl\u multi<代码>它们都不能正常工作-不,你只是没有正确使用。哦,让我再试一次。它能在不到一秒钟的时间内执行get请求而不等待吗?您能为您的PHP异步实现发布一个示例吗?我不想等待响应。那么我可以跳过第二个代码吗?如果我想传递一些get参数呢?我应该把它们放在哪里?没问题。将查询字符串添加到$path的末尾
/?param1=value1&parm2=value2
顺便说一句,我多年来一直在使用它,原因与您相同。您还可以调用自己的PHP脚本并只传递参数。然后,您的脚本执行请求和任何可能需要的内部管理。那么延迟不会影响主脚本。以上代码我从未失败过。
$timeout = 120;
$buffer_size = 8192;
while (count($sockets)) {
  $read = $sockets; 
  stream_select($read, $write = NULL, $except = NULL, $timeout);
  if (count($read)) {
    foreach ($read as $r) { 
      $id = array_search($r, $sockets); 
      $data = fread($r, $buffer_size); 
      if (strlen($data) == 0) {  // done
        fclose($r); 
        unset($sockets[$id]);
      } 
      else {
        $result[$id] .= $data; // append buffer to result
      }
    }
  }
  else { 
 //   echo 'Timeout: ' . date('h:i:s') . "\n\n\n";
    break;
  }
}
$host = 'www.example.com';
$path = '/?param=value';
$http = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
$stream = stream_socket_client("$host:80", $errno,$errstr, 120,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); 

if ($stream) {
  fwrite($stream, $http);
  fclose($stream); 

}
else { 
  $err .=  "$id Failed<br>\n";
}