php - 使用 PECL HTTP 类在 PHP 中进行并行 HTTP 请求 [答案 : HttpRequestPool class]

标签 php http parallel-processing pecl simultaneous


<强> HttpRequestPool类提供了解决方案。非常感谢指出这一点的人。

可以在以下位置找到一个简短的教程:http://www.phptutorial.info/?HttpRequestPool-construct


问题

我想在 PHP 中发出并发/并行/同时的 HTTP 请求。我想避免连续请求:

  • 一组请求需要很长时间才能完成;请求越多,时间越长
  • 一个请求在一组中途超时可能会导致后面的请求无法发出(如果脚本有执行时间限制)

我设法找到制作 simultaneuos [sic] HTTP requests in PHP with cURL 的详细信息, 但是我想明确地使用 PHP 的 HTTP functions如果可能的话。

具体来说,我需要同时将数据发布到一组 URL。发布数据的 URL 不在我的控制范围内;它们是用户设置的。

我不介意是否需要等待所有请求完成才能处理响应。如果我为每个请求设置 30 秒的超时并且请求是并发的,我知道我必须等待最多 30 秒(可能多一点)才能完成所有请求。

我找不到有关如何实现这一目标的详细信息。然而,我最近确实注意到 PHP 手册中提到 PHP5+ 能够处理并发 HTTP 请求 - 我当时打算记下它,忘记了,再也找不到了。

单个请求示例(工作正常)

<?php
$request_1 = new HttpRequest($url_1, HTTP_METH_POST);
$request_1->setRawPostData($dataSet_1);
$request_1->send();
?>

并发请求示例(不完整,清楚)

<?php
$request_1 = new HttpRequest($url_1, HTTP_METH_POST);
$request_1->setRawPostData($dataSet_1);

$request_2 = new HttpRequest($url_2, HTTP_METH_POST);
$request_2->setRawPostData($dataSet_2);

// ...

$request_N = new HttpRequest($url_N, HTTP_METH_POST);
$request_N->setRawPostData($dataSet_N);

// Do something to send() all requests at the same time
?>

如有任何想法,我们将不胜感激!

澄清 1:我想坚持使用 PECL HTTP 函数:

  • 他们提供了一个很好的 OOP 接口(interface)
  • 它们在所讨论的应用程序中被广泛使用,从维护的角度来看,坚持使用已经使用的应该是有益的
  • 与使用 cURL 相比,使用 PECL HTTP 函数发出 HTTP 请求通常需要编写更少的代码行 - 从维护的角度来看,更少的代码行也应该是有益的

澄清 2:我意识到 PHP 的 HTTP 函数不是内置的,也许我在那里的措辞有误,我会更正。我不担心人们必须安装额外的东西——这不是一个要分发的应用程序,它是一个带有服务器的网络应用程序。

澄清 3:如果有人权威地声明 PECL HTTP 不能这样做,我将非常高兴。

最佳答案

我很确定HttpRequestPool正是您要找的。

详细一点,您可以使用 fork 来实现您正在寻找的东西,但这似乎不必要地复杂并且在 HTML 上下文中不是很有用。虽然我还没有测试过,但这段代码应该是这样的:

// let $requests be an array of requests to send
$pool = new HttpRequestPool();
foreach ($requests as $request) {
  $pool->attach($request);
}
$pool->send();
foreach ($pool as $request) {
  // do stuff
}

关于php - 使用 PECL HTTP 类在 PHP 中进行并行 HTTP 请求 [答案 : HttpRequestPool class],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/168951/

相关文章:

php - 指示来自 MySQL/PHP 的复选框值

javascript - Ajax返回页面Html代码返回(相同代码)

c++ - 如何在不使用文件指针的情况下在 libcurl 中发送长 PUT 数据?

parallel-processing - 何时使用 MPI、OpenMP 和 PBS Pro 进行超线程?

php - mysql - 表分区与 "manual"表分区

PHP While 循环从多个 'Joined' 表中分离唯一类别

javascript - 使用 JavaScript 将数据发布到 iFrame

java - BufferedReader 没有读取过去的空行

python - 使用 numpy 数组和共享内存并行化 python 循环

python - 在 pandas groupby 之后并行化应用