您使用stream_socket_client()。执行您的 GET 请求,然后稍后获取结果。
使用 stream_socket_client() 发出请求
$host = 'www.example.com';
$path = '/';
$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) {
$sockets[] = $stream; // supports multiple sockets
fwrite($stream, $http);
}
else {
$err .= "$id Failed<br>\n";
}
使用 stream_select() 获取响应
$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;
}
}
更新
您可以随时提出请求,并在请求后随时得到响应。创建套接字时,$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";
}