Регулирование curl_multi_exec до 3-4 процессов вместо всех без выхода из цикла

Я, кажется, сбой моего сайта, запрашивая слишком много соединений одновременно (600 ~),
Я хотел бы уменьшить это до, возможно, 3-4 соединения, спать до освобождения, а затем добавить больше по мере необходимости.

Код, который я думал об использовании …

// execute the handles
$running = null;
do
{

if ($running <= 4) curl_multi_exec($mh, $running); //add handle

usleep(100); //sleep

} while($running > 0);

Я не думаю, что это правильный / вменяемый способ сделать это, хотя, может кто-нибудь порекомендовать лучший способ, пожалуйста?

2

Решение

Собственные решения в PHP 5.5

Существует опция для ограничения количества соединений в PHP> = 5.5 с помощью curl_multi_setopt и CURLMOPT_MAXCONNECTS вариант.

http://php.net/manual/en/function.curl-multi-setopt.php

CURLMOPT_MAXCONNECTS
Передайте число, которое будет использоваться как максимальное количество одновременно открытых соединений, которые libcurl может кешировать. По умолчанию 10. Когда кэш заполнен, curl закрывает самый старый в кэше, чтобы предотвратить увеличение количества открытых соединений.

например.:

curl_multi_setopt ( $mh , CURLMOPT_MAXCONNECTS, 4);

Предостережения — сообщается о проблемах со стабильностью в CentOS, и требуется PHP 5.5 или выше.

В ответ на ваш вопрос о здравомыслии:

То, как вы это делаете, в принципе разумно … но может очень легко застрять в бесконечном цикле.

Понятно, что $running обновляется только когда curl_multi_exec($mh, $running) вызывается, потому что $ running передается в качестве ссылочной переменной в curl_multi_exec;

Решения

Попробуйте эти бесплатные библиотеки, которые достигают того, что вы хотите сделать в удобном для проглатывания формате.

  1. RollingCURL: https://github.com/takinbo/rolling-curl
  2. Жрать — используя Бассейны: http://guzzle.readthedocs.org/en/latest/quickstart.html#concurrent-requests

Оба из них хорошо протестированы и имеют максимальные возможности подключения.

1

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

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

По вопросам рекламы [email protected]