- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Примерно неделю назад я интересовался о реализации одной задачи. С помощью человека с ником crapa удалось запустить скирпт.
Суть скрипта в следующем: есть 2 таблицы: sites и links
таблица sites содержит список урлов сайтов, например
ya.ru
mail.ru
rambler.ru
всего штук 10
таблица links содержит полные ссылки страниц:
http://news.mail.ru/society/2951352/
таких должно быть около 600
Так вот мне нужно проверить чтобы на всех элементах из таблицы links присутствовала хотя бы одна ссылка из таблицы sites. Если проще, то это просто проверка бэклинков.
Сейчас скрипт имеет вид такой:
$query=mysql_query("SELECT * from links");while ($links=mysql_fetch_array($query)) {
$query1=mysql_query("SELECT * from sites where id=".$links['site_id']);
while ($res=mysql_fetch_array($query1)) {
$page = file_get_contents($links['slink']);
if ( strpos ( $page, $res['link']) === false ) {
echo '0';
$res0 = mysql_query ("UPDATE links SET find='0' WHERE id='$links[id]'");
} else {
$res1 = mysql_query ("UPDATE links SET find='1' WHERE id='$links[id]'");
echo '1';
}
}
}
Собственно, код рабочий, но есть одно НО - он просто вешается когда я увеличиваю количество элементов в таблицах, то есть, насколько я понимаю, увеличивается число запросов, которые не выполняются в заданное вермя так?
Можно ли как-то модифицировать скрипт, чтобы подобной проблемы не возникало? По сути сейчас я имею в таблице sites - 8 элементов, а в таблице links - чуть больше ста..
Может кто-нть чем-то помочь?
MrBernz, кешируйте резальтаты вашей работы.
Можно вынести данные из файлов в БД и апдейтить всё одним большим запросом, вероятно
ну цикл уж явно меньше будет - в смысле - по времени
Можно вынести данные из файлов в БД и апдейтить всё одним большим запросом, вероятно
ну цикл уж явно меньше будет - в смысле - по времени
вы в корне не поняли проблему
Либо кешировать, либо пересмотреть структуру скрипта. В начале забираем страницу, а потом ищем ссылку на них.
bearman А у вас плохая манера общения - я об этом уже писал как-то, впрочем.
Меня смутил file_get_contents - не сразу дошло что так сайт получается, а не файл с сервера.
Неважно - без вашего замечания я бы и не перечитал пост.
По теме -
http://ru.php.net/manual/en/function.pcntl-fork.php
или
http://ru.php.net/manual/en/function.curl-multi-exec.php и пачками обрабатывать результаты, перед этим загнав все данные в многомерный массив и обращаясь к нему по мере надобности. Будет жрать память и проц, зато быстро отработает любое количество данных.
Зависит от потенциального количества этих самых данных - если их будет оч много - то лучше сделать многопоточность - не на пхп, разумеется, а на чём-нибудь нормально с потоками работающем типа перла хотя бы.
Если же стоит задача на лету отдавать конечному пользователю результат - то или терпеть мультикурл, или перестроить логику так, чтобы получив страницу, на которой могут быть и другие ссылки, проверять сразу их тоже - я так понимаю, что именно это bearman имел в виду.
jumash добавил 07.10.2009 в 16:48
Ну и эта, этот код тоже не оптимален+)
Из базы можно выбирать только нужные поля, а страницу не обязательно N раз запрашивать в цикле)
В общем получается так:
скрипт выбирает 1ю ссылку из таблицы links и проверяет её на наличие ссылок из таблицы sites.. по сути здесь уже 8 запросов получается, насколько я понимаю..
Спасибо всем ответившим. Для начала всё ж попытаюсь с кэшированием разобраться, думаю..
"таких должно быть около 600"
вы за один запуск скрипта хотите сграбить 600 страниц? конечно скрипт "повесится"
Делайте частями запросы, по 2-3 урла за раз, а в конце чекера добавьте код типа
$time_sec=1000;
echo '<script language="JavaScript" type="text/javascript">setTimeout(function() {document.location="'.$_SERVER['PHP_SELF'].'"}, '.$time_sec.');</script>';}
этот яваскрипт запустит ваш чекер заново через одну секунду ( $time_sec=1000; ) после грабинга очередной партии урлов
ну иль если можете, то сделайте задание для крона - будет запускать скрипт по расписанию
"таких должно быть около 600"
вы за один запуск скрипта хотите сграбить 600 страниц? конечно скрипт "повесится"
Так вот я и спрашую совета... я понимаю что он повесится - он и вешается, собственно..
Делайте частями запросы
а каким образом запросы разбить можно? Я рассматривал такой вариант уже, но пока не дошёл до решения..
сделайте задание для крона
В идеале я и хочу сделать работу скрипта автономной.. только его сначала нужно отрегулировать для работы в ручном режиме хотя-бы..
а каким образом запросы разбить можно? Я рассматривал такой вариант уже, но пока не дошёл до решения..
Сохраняйте время проверки для каждой проверяемой страницы. А далее делаете WHERE по времени и ставьте LIMIT. А потом вешаете всё на CRON каждые N минут.