Вопрос по коду

[Удален]
565

Примерно неделю назад я интересовался о реализации одной задачи. С помощью человека с ником 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 - чуть больше ста..

Может кто-нть чем-то помочь?

[Удален]
#1

MrBernz, кешируйте резальтаты вашей работы.

J
На сайте с 02.02.2009
Offline
53
#2

Можно вынести данные из файлов в БД и апдейтить всё одним большим запросом, вероятно

ну цикл уж явно меньше будет - в смысле - по времени

[Удален]
#3
jumash:
Можно вынести данные из файлов в БД и апдейтить всё одним большим запросом, вероятно
ну цикл уж явно меньше будет - в смысле - по времени

вы в корне не поняли проблему

Дмитрий
На сайте с 07.12.2007
Offline
136
#4

Либо кешировать, либо пересмотреть структуру скрипта. В начале забираем страницу, а потом ищем ссылку на них.

J
На сайте с 02.02.2009
Offline
53
#5

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 раз запрашивать в цикле)

[Удален]
#6

В общем получается так:

скрипт выбирает 1ю ссылку из таблицы links и проверяет её на наличие ссылок из таблицы sites.. по сути здесь уже 8 запросов получается, насколько я понимаю..

Спасибо всем ответившим. Для начала всё ж попытаюсь с кэшированием разобраться, думаю..

TS
На сайте с 26.06.2008
Offline
36
#7

"таких должно быть около 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; ) после грабинга очередной партии урлов

ну иль если можете, то сделайте задание для крона - будет запускать скрипт по расписанию

CenaMashin.ru (http://cenamashin.ru) - Сколько стоит твоя машина?
[Удален]
#8
TYUS:
"таких должно быть около 600"
вы за один запуск скрипта хотите сграбить 600 страниц? конечно скрипт "повесится"

Так вот я и спрашую совета... я понимаю что он повесится - он и вешается, собственно..

TYUS:
Делайте частями запросы

а каким образом запросы разбить можно? Я рассматривал такой вариант уже, но пока не дошёл до решения..

TYUS:
сделайте задание для крона

В идеале я и хочу сделать работу скрипта автономной.. только его сначала нужно отрегулировать для работы в ручном режиме хотя-бы..

Дмитрий
На сайте с 07.12.2007
Offline
136
#9
MrBernz:

а каким образом запросы разбить можно? Я рассматривал такой вариант уже, но пока не дошёл до решения..

Сохраняйте время проверки для каждой проверяемой страницы. А далее делаете WHERE по времени и ставьте LIMIT. А потом вешаете всё на CRON каждые N минут.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий