Параллельные HTTP-запросы в PHP с использованием HTTP-классов PECL [Ответ: класс HttpRequestPool]

Вы пропустили вставить Double Quotes. Точный запрос -

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
11
задан Jon Cram 7 November 2008 в 15:56
поделиться

6 ответов

Я вполне уверен, 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
}
10
ответ дан 3 December 2019 в 08:31
поделиться

Вы пробовали HttpRequestPool (это - часть Http)? Похоже, что это объединило бы объекты запроса и работало бы их. Я знаю, что считал где-нибудь, что Http будет поддерживать одновременные запросы, и кроме пула я ничего не могу найти также.

2
ответ дан 3 December 2019 в 08:31
поделиться

Я когда-то должен был решить подобную проблему: выполнение нескольких запросов, не накапливая время отклика.

Решение закончило тем, что было сделанной на заказ функцией, которая использовала неблокирующиеся сокеты. Это работает что-то вроде этого:

$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.

Это намного быстрее с тех пор преобразовывается, reponses выбираются в полупараллели, так как socket_read не ожидает ответа, но возвращается, если буфер сокета еще не полон.

Можно перенести это в соответствующие интерфейсы ООП. Необходимо будет создать строку Запроса HTTP сами и обработать ответ сервера, конечно.

2
ответ дан 3 December 2019 в 08:31
поделиться

Вы могли использовать pcntl_fork () для создания отдельного процесса для каждого запроса, затем ожидать их для окончания:

http://www.php.net/manual/en/function.pcntl-fork.php

Есть ли какая-либо причина, Вы не хотите использовать ЗАВИХРЕНИЕ? Функции curl_multi_* допускали бы несколько запросов одновременно.

-1
ответ дан 3 December 2019 в 08:31
поделиться

Функции HTTP PHP не встроены, ни один - они - расширение PECL. Если Ваше беспокойство будет людьми, имеющими необходимость устанавливать дополнительный материал, то оба решения будут иметь ту же проблему - и ЗАВИХРЕНИЕ, более вероятно, будет установлено, я вообразил бы, как это прибывает значение по умолчанию с каждым веб-хостом, я когда-либо шел.

0
ответ дан 3 December 2019 в 08:31
поделиться

Друг указал на меня на 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-> запрашивает как $request) {...}

1
ответ дан 3 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: