返回

如何跳过 PHP HTTP 请求响应?3 种实用方法

php

如何通过 PHP 发起 HTTP 请求并跳过等待响应

介绍

在 PHP 中,我们经常需要发起 HTTP 请求,但有时我们对响应并不感兴趣,只希望请求发出后继续执行后续代码。这在触发应用程序中的事件或启动长时间进程时非常有用。

方法

有几种方法可以实现此目的:

cURL 多线程

使用 cURL 多线程,可以并发执行多个请求而不阻塞脚本。

非阻塞套接字

通过创建非阻塞套接字,可以在后台发起请求,而不阻塞当前线程。

流上下文

利用流上下文,可以配置请求的行为,包括忽略错误,从而允许请求发出后继续执行后续代码。

代码示例

cURL 多线程

// 初始化多线程句柄
$mh = curl_multi_init();

// 添加要执行的请求
$ch1 = curl_init('https://example.com/endpoint1');
$ch2 = curl_init('https://example.com/endpoint2');

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 执行请求
do {
    curl_multi_exec($mh, $running);
} while ($running);

非阻塞套接字

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);

// 连接到服务器
socket_connect($socket, 'example.com', 80);

// 发送请求
$request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
socket_write($socket, $request);

流上下文

// 创建流上下文
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => 'Host: example.com',
        'ignore_errors' => true,
    ],
]);

// 发起请求
file_get_contents('https://example.com/', false, $context);

结论

通过使用 cURL 多线程、非阻塞套接字或流上下文,我们可以通过 PHP 发起 HTTP 请求并跳过等待响应。这对于创建更有效率的应用程序非常有用,可以触发事件和启动长时间进程,而不会阻塞脚本的执行。选择最适合你的方法,取决于你的特定需求和环境。

常见问题解答

Q1:使用哪种方法效率最高?
A: 取决于请求的数量和服务器的响应时间。

Q2:非阻塞套接字是否有任何缺点?
A: 需要自己处理响应读取和错误处理。

Q3:流上下文中的“ignore_errors”选项有什么作用?
A: 忽略 HTTP 错误,允许请求发出后继续执行后续代码。

Q4:cURL 多线程与非阻塞套接字有什么区别?
A: cURL 多线程在用户空间中处理并发,而非阻塞套接字在内核空间中处理并发。

Q5:这些方法是否适用于 PHP 所有版本?
A: cURL 多线程需要 PHP 5.6 或更高版本,非阻塞套接字需要 PHP 7.2 或更高版本,流上下文在所有 PHP 版本中都可用。