平行HTTP请求在PHP使用PECL HTTP类[回答:HttpRequestPool class]
-
05-07-2019 - |
题
的 HttpRequestPool 类提供一个解决方案。非常感谢那些人指出这一点。
一个简短的教程,可以发现: http://www.phptutorial.info/?HttpRequestPool-construct
的问题
我想让并/并/同时HTTP请求在PHP.我想要避免连续请求为:
- 一组要求,将需要很长时间才能完成;更多的请求的时间越长
- 超时的一项请求中的一组可能导致以后的请求不能由(如果一个脚本有一个执行时间限制)
我已经找到细节,用于制作 simultaneuos[原文]HTTP请求在PHP with cURL, 然而,我想明确地使用PHP的 HTTP功能 如果在所有可能的。
具体地说,我需要发布数据同时设置的网址。该网址向数据的发布是超出我的控制;他们是用户设定的。
我不介意如果我需要等待所有请求之前完成的答复可以被处理。如果我设定一个超时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职能为:
- 他们提供了一个很好的面向对象的接口
- 他们在广泛使用的应用程序中的问题和坚持什么是已经在使用的应该是有益的,从维持的角度
- 我一般都编写较少的代码行编HTTP请求使用PECL HTTP职能相比,使用卷曲较少的行代码也应该是有益的,从维持的角度
澄清2:我意识到PHP's HTTP的功能并不是建立在也许我的措辞的事情错误地没有,我将正确的。我没有担心的人具有安装额外的东西-这不是一个应用程序,是要分布,这是一个网络应用程序服务器本身。
澄清3:我会很乐意,如果有人有权威的国家的PECL HTTP不能这样做。
解决方案
我很确定 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 }
其他提示
你有没有尝试 HttpRequestPool (它的一部分,Http)?它看起来就像会游泳池了该请求的目的和工作。我知道,我读的地方,Http会支持,同时请求和其他酒 游泳池 我找不到任何东西。
我曾经为了解决类似的问题:这样做的多次请求没有累积的响应时间。
该方案最终被定建立的功能,它使用的非阻挡 插座.它的工作原理是这样的:
$request_list = array(
# address => http request string
#
'127.0.0.1' => "HTTP/1.1 GET /index.html\nServer: website.com\n\n",
'192.169.2.3' => "HTTP/1.1 POST /form.dat\nForm-data: ...",
);
foreach($request_list as $addr => $http_request) {
# first, create a socket and fire request to every host
$socklist[$addr] = socket_create();
socket_set_nonblock($socklist[$addr]); # Make operation asynchronious
if (! socket_connect($socklist[$addr], $addr, 80))
trigger_error("Cannot connect to remote address");
# the http header is send to this host
socket_send($socklist[$addr], $http_request, strlen($http_request), MSG_EOF);
}
$results = array();
foreach(array_keys($socklist) as $host_ip) {
# Now loop and read every socket until it is exhausted
$str = socket_read($socklist[$host_ip], 512, PHP_NORMAL_READ);
if ($str != "")
# add to previous string
$result[$host_ip] .= $str;
else
# Done reading this socket, close it
socket_close($socklist[$host_ip]);
}
# $results now contains an array with the full response (including http-headers)
# of every connected host.
它的速度更快,因为thunked下列现在的半平行自socket_read不会等待的反应,但如果返回座缓冲区不完整的。
你可以把这个在适当面向对象的接口。你的 将 需要创建HTTP请求串自己,并处理服务器的响应。
一个朋友指出我CurlObjects( http://trac.curlobjects.com/trac )最近,我发现很有用于使用curl_multi.
$curlbase = new CurlBase;
$curlbase->defaultOptions[ CURLOPT_TIMEOUT ] = 30;
$curlbase->add( new HttpPost($url, array('name'=> 'value', 'a' => 'b')));
$curlbase->add( new HttpPost($url2, array('name'=> 'value', 'a' => 'b')));
$curlbase->add( new HttpPost($url3, array('name'=> 'value', 'a' => 'b')));
$curlbase->perform();
foreach($curlbase->requests as $request) {
...
}
PHP's HTTP功能 不是建立在, ,他们是一个PECL扩展。如果你关心的是人有安装额外的东西,这两个解决方案将有同样的问题,卷曲的是更可能被安装了,我想象的,因为它涉及默认每个网主机,我曾经去过。
你可以使用pcntl_fork()创建一个单独的进程对每个请求,然后等待他们来结束:
http://www.php.net/manual/en/function.pcntl-fork.php
是否有任何原因你不想使用卷发?该curl_multi_*功能将允许多次请求,在同一时间。