За последние 24 часа нас посетил 60671 программист и 1743 робота. Сейчас ищут 907 программистов ...

Алгоритм сортировки массива для MultiCurl

Тема в разделе "Сделайте за меня", создана пользователем voron121, 3 июл 2017.

  1. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Доброго времени суток уважаемые форумчане. Прошу помощи в решении задачи. Суть : есть скрипт который проверяет ссылки на статус (200 или ссылка битая и отдает статус отличный от 200). Ссылок много (овер дофига, окала 3 лямов). Для задачи используется библиотека php RollingCurl (многопоточность используя MultiCurl ). Скрипт по кругу в цикле берет из БД n количество записей , разбрасывает ссылки что бы было минимум повторений и потом отдает в либу для отправки запросов. Однако вот в чем беда : если к примеру есть массив с ссылками для проверки и какого-то домена много (допустим что есть массив с 1000 элементов и в нем 400 ссылок на один и тот же домен), то получается что скрипт долбит один и тот же хост 400 раз и рано или поздно может попасть под бан хостинга (хостинг может воспринять скрипт за Ддос и как бы заблочить). Собственно пробовал поставить таймаут - но в таком случае скрипт выполняется овер дофига (если предположить что скрипт должен сделать 12 итераций с выборками то одна итерация может выполняться более 8 часов). Очевидно что вариант таймаутом добавления ссылок на проверку , при дублях адреса, не подходит. Но пока что не вижу иного решения. Прошу помощи - подскажите, что можно предпринять что бы формировать массив с запросами для проверки таким образом что бы минимизировать одинаковые урл подряд ?

    PS: Прошу воздеражться от ответов типа "пиши на питон и тд :) "
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Может в базу добавить поле для домена (к каждой записи на основе url) и статус проверен/не проверен, потом выбирать с группировкой по домену которые еще не проверены
     
  3. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Идея с пометкой для пройденных урлов есть, но это не решает траблу. Таймстамп нужен будет потом, для того что бы проверять когда был проверен урл и проверить его не ранее какого - либо интервала. С таймстемпом так же есть вопрос : а не ляжет ли SQL при записи для каждого пройденного урла таймстемпа ? Ну то есть если в выборке будет 200 000 урлов к примеру, не будет ли это излишней нагрузкой на SQL ?

    Тут трабла в другом. Вот примет : есть к примеру массив вида

    array (
    [0] => [yandex.ru],
    [1] => [yandex.ru],
    [1] => [yandex.ru],
    [3] => [google],
    ...
    )

    Когда подобный массив с большим количество урлов отдается на выполнение то сталкиваемся с траблой : на яндекс будет 3 запроса сразу (за счет многопоточности + элементы идут один за другим) . В связи с этим ситуация с проверкой урлов напоминает ДДОС т.к к одному домену с одного ip будет много много запросов. Как бы очередь можно чуть размыть но если есть к примеру 1000 урлов для проверки и из них 400 - 500 урлов к одному домену, то как не размываю очередь а ситуация, при которой будут дубли в очереди все равно повторится.
    Допустим , в процессе добавления урлов в очередь на проверку я могу откинуть остаточные одинаковые урлы ( что бы не было ситуации при которой в процессе добавления урлов в очередь в конце очереди останутся урлы одного и того же домена ), но тогда, если учесть что будет стоять тайминг на добавления урла в очередь (что бы к примеру обращение к одному и тому же домену было не чаще 1 раза в секунду или две), то все равно может быть ситуация при которой останется к примеру 2 - 3 сайта, с большим количеством урлов и получится что 2 или три урла отправятся на проверку, ждем по таймингу, опять 2 - 3 урла отправляем на проверку. При большом количестве урлов это сильно влияет на время выполнения скрипта .

    Я думал сделать что то типа сортировки урлов при наполнении очереди с шагом выборки. То есть добавлять 1 урл не чаше чем 1 раз в 10 или 20 шагов (как то пройтись по масииву и считая добавленные урлы в очередь проверять, если домен уже добавлен и после него добавленно еще 10 разных урлов - добавить дублирущийся домен) . Однако есть опасение что при таком подходе скрипт будет или уходить в бенсконечный цикл когда останеться 1 или 2 домена, или же то на то и выйдет что и с таймингом.
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Отсортировать массив, подсчитав наибольшее количество урлов с одним доменом.
    Создать новый массив из полученного, выбирая элементы с интервалом, равным (или больше, чтобы получить целое число итераций) наибольшему количеству урлов с одним доменом.
     
    voron121 нравится это.
  5. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    ммммм вариант интересный . Правда трабла если в массиве будет к примеру 40 - 60 % ссылок на один и тот же домен ... хотя тут наверное уже ничего не изменишь и не сделаешь
     
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Этот вариант будет работать норм при количестве повторений не более 10% одного домена, если Вам надо не чаще 1 домена в 10-ти запросах. В противном случае никак не отсортировать.
    Другой вариант - дождаться ответа от сервера и отправить следующий запрос. Тогда не будет похоже на ддос.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это можно будет в условие выборки добавить, чтобы получать только "старые" ссылки, то есть, давно проверенные

    Надо тестировать
     
    voron121 нравится это.