Что имеем: 1) большую бд (порядка) 300 метров 2) 63к записей. Значит в каждой записи имеется несколько ссылок В целях сео оптимизации хотелось бы превратить кликабельные ссылки в простой текст --> как бы с небольшими юд это будет достаточно просто сделать, но .... это не мой случай. Хотел бы выслушать ваши предложения
можно и так: Code: #!usr/bin/perl open(DB, "base.txt"); @db = <DB>; close(DB); open(PARSED, ">>parsed.txt"); foreach $db (@db) { ($a, $url, $b) = split("\"",$db); chomp($url); print PARSED "$url\n"; tr/a-zA-Z//cd } close(PARSED); и больше размеры парсил
Парсили 2 милиона записей и всё в порядке Способ 1: Слить базу на локальный комп и там распарсить. Способ 2: Если локальный комп слабый, то слить базу и распарсить через C++. Способ 3: Распарсить удалённо используя C++.
set_time_limit(0) SET TRANSATION и поехал че хочешь с ней ковырять...заливай на удаленную машину, запускай и иди курить, придешь - соптимизируется... У нас на работе для 2-3кк записей на ночь оставляли
PHP: $result = mysql_query("SELECT * FROM posts LIMIT 10")or die("бля: " . mysql_error()); while ($row=mysql_fetch_array($result)) { echo "$row[full_news]"; } preg_match_all('#href=(?:([\"\'])([^\"\'>]\S*?)\1[^>]*|([^>\"\']+))>(.*?)</a>#is ', $str, $matches); foreach($matches[2] as $key) { echo $key; echo '<br>'; } что то не получается связать это вместе..
#Wolf# По-хорошему, лучше сделать полный дамп базы и обработать, иначе будет слишком много запросов к БД. PHP: <? set_time_limit(0); $begin=0; // С какой позиции начинать $count=10; // Сколько строк БД обрабатывать за раз for($i=$begin;;$i+=$count) { $result=mysql_query("SELECT * FROM posts LIMIT $i,$count"); if (!mysql_num_rows($result)) break; while ($row=mysql_fetch_array($result)) { $tmp=preg_replace('~<a.*href="([^"]+)".*>.*</a>~Usi','$1',$row['full_news']); // В запросе на обновление не уверен насчет экранирования кавычек if ($tmp!=$row['full_news']) $update=mysql_query("UPDATE posts SET full_news='$tmp' WHERE full_news='".$row[full_news]."'"); } @file_put_contents('cur_pos.txt',$i); // Пишем в файл текущую позицию, на всякий случай } Но повторюсь - лучше обрабатывать построчно дамп. Так можно будет проконтролировать, что все обработано правильно и не угробить случайно БД
после $i=$begin у тебя две точки с запятой, чтот там намудрено, там должно быть три аргумента, типа for ($i = 0; $i < $p; $i++), в первом переменные стартовые, потом условие продолжения итераций цикла и 3: действие после каждой итерации(прохода)
draliokero Разницы большой не будет - просто читаем файл дампа построчно (fgets), а потом просто восстанавливаем БД из этого дампа. Выгода - не убьем базу, меньшее количество обращений к БД, не надо следить за кавычками m0Hze Zedi Синтаксис for такой же как в Си. Любые переменные в for($i1;$i2;$i3) - могут быть пропущены. В случае пропуска второго параметра - цикл будет выполняться бесконечно. Поэтому внутри цикла есть break; #Wolf# В скрипт закралась ошибка, вместо $tmp=str_replace нужно $tmp=preg_replace
несколько вопросов: 1) PHP: $i+=$count что это за += 0_0 2) тестил с одной новостью. фор пока убрал. так новость отлично режется но не апдейтится. ругается . вот к примеру выборка из бд PHP: <div align="center"><img src="http://www.test.ru/posts/2008-02/1203842370_1203713115_73ed9d5d865d.jpg" style="border: none;" alt='Alcohol 120% 1.9.7.6221 + Activation Keymaker v3.6' title='Alcohol 120% 1.9.7.6221 + Activation Keymaker v3.6' /></div><br /><br /><b>Название:</b> Alcohol 120% 1.9.7.6221 + Activation Keymaker v3.6<br /><b>Разработчик:</b> <a href="http://rapidshare.com/files/94052968/alcohol_120__1.9.7.6221.rar" target="_blank">Скачать | Download</a> и ругается на PHP: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Alcohol 120% 1.9.7.6221 + Activation Keymaker v3.6' title='Alcohol 120% 1.9.7.62' at line 1 как я понимаю получается какая то херня с кавычками
2#Wolf# 1)http://www.php.ru/manual/language.operators.assignment.html 2) if ($tmp!=$row['full_news']) $update=mysql_query("UPDATE posts SET full_news='$tmp' WHERE full_news='".mysql_real_escape_string($row['full_news'])."'");
#Wolf# Ну я же написал что не уверен в экранировании) У PaCo тоже не совсем правильно. Надо: PHP: if ($tmp!=$row['full_news']) $update=mysql_query("UPDATE posts SET full_news='".mysql_real_escape_string($tmp).'\' WHERE full_news=\''.mysql_real_escape_string($row[full_news])."'");