Доброго времени суток уважаемые форумчане. Прошу помощи в решении задачи. Суть : есть скрипт который проверяет ссылки на статус (200 или ссылка битая и отдает статус отличный от 200). Ссылок много (овер дофига, окала 3 лямов). Для задачи используется библиотека php RollingCurl (многопоточность используя MultiCurl ). Скрипт по кругу в цикле берет из БД n количество записей , разбрасывает ссылки что бы было минимум повторений и потом отдает в либу для отправки запросов. Однако вот в чем беда : если к примеру есть массив с ссылками для проверки и какого-то домена много (допустим что есть массив с 1000 элементов и в нем 400 ссылок на один и тот же домен), то получается что скрипт долбит один и тот же хост 400 раз и рано или поздно может попасть под бан хостинга (хостинг может воспринять скрипт за Ддос и как бы заблочить). Собственно пробовал поставить таймаут - но в таком случае скрипт выполняется овер дофига (если предположить что скрипт должен сделать 12 итераций с выборками то одна итерация может выполняться более 8 часов). Очевидно что вариант таймаутом добавления ссылок на проверку , при дублях адреса, не подходит. Но пока что не вижу иного решения. Прошу помощи - подскажите, что можно предпринять что бы формировать массив с запросами для проверки таким образом что бы минимизировать одинаковые урл подряд ? PS: Прошу воздеражться от ответов типа "пиши на питон и тд "
Может в базу добавить поле для домена (к каждой записи на основе url) и статус проверен/не проверен, потом выбирать с группировкой по домену которые еще не проверены
Идея с пометкой для пройденных урлов есть, но это не решает траблу. Таймстамп нужен будет потом, для того что бы проверять когда был проверен урл и проверить его не ранее какого - либо интервала. С таймстемпом так же есть вопрос : а не ляжет ли 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 домена, или же то на то и выйдет что и с таймингом.
Отсортировать массив, подсчитав наибольшее количество урлов с одним доменом. Создать новый массив из полученного, выбирая элементы с интервалом, равным (или больше, чтобы получить целое число итераций) наибольшему количеству урлов с одним доменом.
ммммм вариант интересный . Правда трабла если в массиве будет к примеру 40 - 60 % ссылок на один и тот же домен ... хотя тут наверное уже ничего не изменишь и не сделаешь
Этот вариант будет работать норм при количестве повторений не более 10% одного домена, если Вам надо не чаще 1 домена в 10-ти запросах. В противном случае никак не отсортировать. Другой вариант - дождаться ответа от сервера и отправить следующий запрос. Тогда не будет похоже на ддос.
это можно будет в условие выборки добавить, чтобы получать только "старые" ссылки, то есть, давно проверенные Надо тестировать