Заблокируйте один URL / запрос, который занимает слишком много времени в multi_curl, и продолжайте работу с оставшимися запросами.

Как мы можем заблокировать / тайм-аут одного запроса в multi_curl в PHP, который занимает слишком много времени, не влияя на оставшиеся запросы

2

Решение

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

Я делаю это при запуске инструментов проверки W3C.
Я делаю проверку CSS, проверку HTML и проверку XHTML. (Мне нравится, что мой код использует столько же, сколько XHTML, и использует HTML5 только при необходимости. Старая практика W3C для мобильных устройств.)

Прежде чем я передаю stream_socket_client ().

Это почти так же близко к многозадачности, как PHP.

Инициализируйте переменные.

$ url — это полный URL-адрес тестируемой страницы, например http://example.com/index.html

  $url = $_POST['url'];
$webPageTestKey = ' [key for WebPageTest.org goes here] ';
$timeout = 120;
$result = array();
$sockets = array();
$buffer_size = 8192;
$id = 0;
$urls = array();
$path = $url;
$url = urlencode("$url");

Сделайте запросы с помощью stream_socket_client ()

URL-адреса запроса хранятся в массиве $ urls [].

  $urls[] = array('host' => "jigsaw.w3.org",'path' => "/css-validator/validator?uri=$url&profile=css3&usermedium=all&warning=no&lang=en&output=text");
$urls[] = array('host' => "validator.w3.org",'path' => "/check?uri=$url&charset=%28detect+automatically%29&doctype=Inline&group=0&output=json");
$urls[] = array('host' => "validator.w3.org",'path' => "/check?uri=$url&charset=%28detect+automatically%29&doctype=XHTML+Basic+1.1&group=0&output=json");
$urls[] = array('host' => "www.webpagetest.org",'path' => "/runtest.php?f=xml&bwDown=10000&bwUp=1500&latency=40&fvonly=1&k=$webPageTestKey&url=$url");

сокеты нужны хост и путь.
Если вы не можете легко увидеть формат URL, сбросьте массив с помощью

var_export($urls);

продолжал:

  $err = '';
foreach($urls as $path){
$host = $path['host'];
$path = $path['path'];
$http = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
$stream = stream_socket_client("$host:80", $errno,$errstr, 120,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
if ($stream) {
$sockets[] = $stream;  // supports multiple sockets
$start[] = microtime(true);
fwrite($stream, $http);
}
else {
$err .=  "$id Failed<br>\n";
}
}

Сокеты запроса хранятся в массиве $ sockets []

Затем я передаю HTML в ожидании завершения запросов.сильный текст

Получать ответы на запросы с помощью stream_select ()

Ответы возвращаются в том порядке, в котором они были получены. Порядок, в котором были сделаны запросы, не имеет значения.

Ответы считываются через буфер 8K. Если ответ превышает 8 КБ, то извлекаются несколько фрагментов по 8 КБ одновременно.

while (count($sockets)) {
$read = $sockets;
stream_select($read, $write = NULL, $except = NULL, $timeout);
if (count($read)) {
foreach ($read as $r) {
$id = array_search($r, $sockets);
$data = fread($r, $buffer_size);
if (strlen($data) == 0) {
//   echo "$id Closed: " . date('h:i:s') . "\n\n\n";
$closed[$id] = microtime(true);  // not necessary
fclose($r);
unset($sockets[$id]);
}
else {
$result[$id] .= $data;
}
}
}
else {
//   echo 'Timeout: ' . date('h:i:s') . "\n\n\n";
break;
}
}

Ответы HTTP хранятся в массиве $ result [].

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector