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

Jon*_*ram 11 php parallel-processing http pecl simultaneous


所述HttpRequestPool类提供了一个解决方案.非常感谢那些指出这一点的人.

可以在以下网址找到简要教程:http://www.phptutorial.info/?HttpRequestPool-construct


问题

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

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

我已经设法找到使用cURL在PHP中制作simultaneousuos [sic] HTTP请求的详细信息,但是如果可能的话,我想明确地使用PHP的HTTP函数.

具体来说,我需要将数据同时发布到一组URL.发布数据的网址超出了我的控制范围; 他们是用户设置的.

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

我找不到如何实现这一目标的细节.但是,我最近注意到在PHP手册中提到PHP5 +能够处理并发HTTP请求 - 我打算在当时记下它,忘记了,再也找不到它了.

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

<?php
$request_1 = new HttpRequest($url_1, HTTP_METH_POST);
$request_1->setRawPostData($dataSet_1);
$request_1->send();
?>
Run Code Online (Sandbox Code Playgroud)

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

<?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
?>
Run Code Online (Sandbox Code Playgroud)

任何想法都将非常感激!

澄清1:我想坚持PECL HTTP功能:

  • 他们提供了一个很好的OOP界面
  • 它们在相关应用中被广泛使用,并且从维护的角度来看,坚持已经使用的应该是有益的
  • 与使用cURL相比,我通常必须编写更少行代码来使用PECL HTTP函数发出HTTP请求 - 从维护角度来看,更少的代码行也应该是有益的

澄清2:我意识到PHP的HTTP功能没有内置,也许我在那里做错了,我会更正.我不担心人们不得不安装额外的东西 - 这不是一个要分发的应用程序,它是一个带有服务器的Web应用程序.

澄清3:如果有人权威地说PECL HTTP无法做到这一点,我会非常高兴.

Edw*_*ang 10

我很确定HttpRequestPool是你正在寻找的.

为了详细说明,您可以使用分叉来实现您正在寻找的东西,但这似乎不必要地复杂并且在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
}