DnAp
self::setDebugMode(true);
- Регистрация
- 30.04.2005
- Сообщения
- 490
Вобщем описание задачи:
Есть 2 хостинга с идеентичной структурой базы и ~3000 записей в каждой...
Задача: Сравнить базы по полю main_url и вернуть ид тех записей которых нету в второй базе...
Предположительная реализация:
Кладем на один сервер код который отдает нам ряды(в том коде ошибок нету)
и пытаемся делать так:
Вобщем с маленькой базой справляеться на ура, но как выходит несколько тысяч записей скрипт уверено говорит что базы идеентичны, хотя это точно нетак!
Может я уставший и не соображаю но непонимаю нифига почему не пашет?!?
ЗЫ
Всетаки пхп до солидного языка програмирования далеко, 2 извращения пришлось писать(
Есть 2 хостинга с идеентичной структурой базы и ~3000 записей в каждой...
Задача: Сравнить базы по полю main_url и вернуть ид тех записей которых нету в второй базе...
Предположительная реализация:
Кладем на один сервер код который отдает нам ряды(в том коде ошибок нету)
и пытаемся делать так:
Код:
<?// сравнение баз
function write_log($text) // записываем лог(чтоб отслеживать ход событий)
{
$f=fopen("log.log","a");
fwrite($f,"\n".date("r")."\n".$text."\n");
fclose($f);
}
set_time_limit(0); // чтоб не сваливался через 30 сек
write_log("Начало сравнения");
$bd1=mysql_connect('localhost','root');
mysql_select_db('test',$bd1); // подключились к локальной базе
$table_name='linkcontrol_all';
//... более хитрый код
$fp=fopen("http://site.ru/link_export.php?count",'r'); // получаем сколько всего рядов в базе
$count=fread($fp,1000);
fclose($fp);
// зацикливаем и получаем по 60 тк unserialize всю базу не вытягивает за один раз!
$rows=array();
for($i=0;$i<ceil($count/60);$i++)
{
if($fp=fopen("http://site.ru/link_export.php?p=".$i,'r'))
{
$array='';
// читаем по кусочкам из-за особеностией функции fread которая не может прочитать больше 4380 символов.
while (!feof($fp)) {
$array.=fread($fp,4380);
}
$tmp_rows=unserialize($array);
// мержим
foreach ($tmp_rows as $row) {
$rows[]=$row;
}
unset($array,$tmp_rows); // следим за чистотой;)
}
}
// первая часть извращения кончилась
// выкидываем все лишнее
$url_arr[]=array();
foreach ($rows as $row) {
$url_arr[]=$row['url_main'];
}
unset($rows); // экономим все еще;)
$id_arr=array();
$result=mysql_query("SELECT id,url_main FROM ".$table_name,$bd1); // получаем все записи и ид.
write_log(mysql_num_rows($result)." - ".count($url_arr)); // надо порадоать что все ок.
while ($assoc = mysql_fetch_assoc($result)) {
if(array_search($assoc['url_main'],$url_arr)===false) // ищем все значения
{
write_log("Нашел различие");
$id_arr[]=$assoc['id'];
}
}
$rows=array();
$export_arr=array();
// получаем все записи для экспорта
foreach ($id_arr as $current_id) {
$result=mysql_query("SELECT * FROM ".$table_name." WHERE id='".$current_id."'",$bd1);
$rows[]=mysql_fetch_assoc($result);
}
$fp=fopen("compare.bd","w");
fwrite($fp,serialize($rows)); // последний штрих
fclose($fp);
// Порадумся чуть чуть все:))
write_log("Сравнение базы зкончено");
?>
Вобщем с маленькой базой справляеться на ура, но как выходит несколько тысяч записей скрипт уверено говорит что базы идеентичны, хотя это точно нетак!
Может я уставший и не соображаю но непонимаю нифига почему не пашет?!?
ЗЫ
Всетаки пхп до солидного языка програмирования далеко, 2 извращения пришлось писать(