php удалить Повторное использование одной ручки. Большое увеличение производительности?




strip_tags php su (4)

В php-скрипте я делаю много разных запросов cUrl GET (сотни) для разных URL-адресов.

Повторное использование одного и того же ручка curl от curl_init улучшит производительность или это незначительно по сравнению с временем отклика запросов cURL?

Я прошу, потому что в текущей архитектуре было бы непросто сохранить один и тот же дескриптор cUrl.

Спасибо,

Вениамин


Crossposted from Я должен закрыть cURL или нет? потому что я думаю, что это тоже актуально.

Я попробовал скалолазание с использованием нового дескриптора для каждого запроса и используя тот же дескриптор со следующим кодом:

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
for ($i = 0; $i < 100; ++$i) {
    $rand = rand();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand);
    curl_exec($ch);
    curl_close($ch);
}
$end_time = microtime(true);
ob_end_clean();
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>';

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
$ch = curl_init();
for ($i = 0; $i < 100; ++$i) {
    $rand = rand();
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand);
    curl_exec($ch);
}
curl_close($ch);
$end_time = microtime(true);
ob_end_clean();
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>';

и получил следующие результаты:

Curl без повторного использования ручки: 8.5690529346466
Curl с повторным использованием ручки: 5.3703031539917

Поэтому повторное использование одного и того же дескриптора обеспечивает значительное увеличение производительности при одновременном подключении к одному серверу. Я попытался подключиться к различным серверам:

$url_arr = array(
    'http://www.google.com/',
    'http://www.bing.com/',
    'http://www.yahoo.com/',
    'http://www.slashdot.org/',
    'http://www..com/',
    'http://github.com/',
    'http://www.harvard.edu/',
    'http://www.gamefaqs.com/',
    'http://www.mangaupdates.com/',
    'http://www.cnn.com/'
);
ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
foreach ($url_arr as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_exec($ch);
    curl_close($ch);
}
$end_time = microtime(true);
ob_end_clean();
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>';

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
$ch = curl_init();
foreach ($url_arr as $url) {
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_exec($ch);
}
curl_close($ch);
$end_time = microtime(true);
ob_end_clean();
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>';

И получил следующий результат:

Curl без повторного использования ручки: 3.7672290802002
Curl с повторным использованием ручки: 3.0146431922913

Все еще довольно существенное увеличение производительности.


Это зависит от того, сколько запросов вы будете делать - накладные расходы на закрытие и повторное открытие каждого из них небрежны, но когда вы делаете тысячу? Может быть несколько секунд или больше.

Я считаю, что curl_multi_init будет самым быстрым методом.

Все зависит от того, сколько запросов вам нужно сделать.


проверьте это тоже

try {
    $pool = new HttpRequestPool(
        new HttpRequest($q1),
        new HttpRequest($qn)
    );
    $pool->send();

    foreach($pool as $request) {

      $out[] = $request->getResponseBody();

    }
} catch (HttpException $e) {
    echo $e;
}



Это зависит от того, находятся ли URL-адреса на одном сервере или нет. Если они есть, одновременные запросы на тот же сервер будут повторно использовать соединение. см. CURLOPT_FORBID_REUSE.

Если URL-адреса иногда находятся на одном сервере, вам необходимо отсортировать URL-адреса, поскольку кеш-соединение по умолчанию ограничено десятью или двадцатью соединениями.

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

С curl_multi_exec вы можете одновременно подключаться к различным серверам (параллельно). Даже тогда вам нужно несколько очередей, чтобы не использовать тысячи одновременных подключений.







curl