Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка и отправка большого кол-ва данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Dzen
Отправлено: 02 Декабря, 2012 - 03:53:58
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Добрый день,

Подскажите пожалуйста. У нас есть локальная база.
И глобальная база на удаленном сервере.
На локальной базе в таблице клиентов, находится грубо говоря более 1000 клиентов.
Нам нужно отправить информацию о каждом клиенте в глобальную базу из локальной.
На сервере локальной базы, кроном запускается скрипт, делает запрос к локальной базе, получаем нужные ID этих 1000 клиентов и информацию по ним, дальше в цикле while ($result = mysql_fetch_array($query)) идём по клиентам и отправляем информацию к глобальной базе по всем 1000 клиентам. С этим всё ок, когда клиентов мало.
Но когда их большое кол-во, то скрипт просто не успеет отработать всех 1000 клиентов. Наткнемся на максимальное время работы скрипта.

Каким образом можно это правильно реализовать? Нужно использовать многопоточность/многопроцессорно сть или надо делать какой-нибудь Крон менеджер или еще как-то?
 
 Top
sKaa
Отправлено: 02 Декабря, 2012 - 04:01:44
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Dzen пишет:
Наткнемся на максимальное время работы скрипта.

Изменить максимальное время выполнения скрипта в php.ini max_execution_time = N (sec)

Или в скрипте, который запускает крон :

Или...
Можно создать её одну таблицу и в ней помечать тех, кого уже "отправили". А скрипт, ограничить, скажем максимум 100 отправлений за раз.
 
 Top
Dzen
Отправлено: 02 Декабря, 2012 - 04:16:21
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




sKaa помечать это интересно, а можно по подробнее немного как бы это сделали?

Как вариант, еще пришел в голову, отправляем по 100, а в новую таблицу просто пишем/апдейтим айди клиента, при успшеной его отправке. И каждые 3 минуты запускаем скрипт отсылки клиентов, но который сначала читает последнее айди отправленного клиента из таблицы мониторинга, и после из основной таблицы берёт клиентов с айди => чем то которое указно в таблице мониторинга. Да?)

Только как бы второй запуск скрипта не наложился на первый.
 
 Top
sKaa
Отправлено: 02 Декабря, 2012 - 04:34:20
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Да никак. Если в локальной таблице они уже больше не нужны после отправки в "глобальную" базу, я бы их просто удалял.

(или)
При первом запуске скрипта, пусть он создаст копию таблицы в вашей локальной базе, а при последующих просто удаляет оттуда по 50 или сколько вам нужно. Вот и всё.

(Отредактировано автором: 02 Декабря, 2012 - 04:35:20)

 
 Top
Dzen
Отправлено: 02 Декабря, 2012 - 14:02:32
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




sKaa ну хотя если после каждой отправки клиента, дёргать запросом базу для апдейта или удаления, а клиентов много, то задёргаем ведь базу-то :-\
 
 Top
sKaa
Отправлено: 02 Декабря, 2012 - 14:27:03
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Всего 2 запроса.
В начале :
SELECT .. FROM `users` ORDER BY `id` DESC LIMIT 0, 50;
В конце :
DELETE FROM `users` ORDER BY `id` DESC LIMIT 0, 50;

Что вы там задергаете?
 
 Top
isvetlichniy
Отправлено: 02 Декабря, 2012 - 14:44:21
Post Id



Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Дек. 2012  
Откуда: Украина


Помог: 0 раз(а)




Цитата:
скрипт просто не успеет отработать всех 1000 клиентов

А если клиентов будет 10 000 или 100 000? Как рабочий временный вариант можно использовать ini_set('max_execution_time', 0);

Но я бы серьезно взглянул на оптимизацию базы данных ну и запросов к ней прежде всего

P.S. В данный момент обслуживаю трекер с 2 лимонами пользователей и со 100К униками день - хватает значений по умолчанию для выполнения всех скриптов, а все дело в оптимизации поисковых запросов и самой базы данных
 
 Top
Dzen
Отправлено: 02 Декабря, 2012 - 16:58:05
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




sKaa ну если по Вашему примеру, то да, так ок.
Но если какой-то клиент не передастся из-за какого-либо таймаута при соединении с глобальной базой, или еще чего-либо, то по такой технологии мы его удалим, а он не передался.
Поэтому рассматривал удаление после удачной передачи каждого клиента, но это не верно имхо.

isvetlichniy ну а какая оптимизация? там просто берутся все клиенты select * и по обходу массива отправляются в глобальную базу с обновлениями.

Цитата:
2 лимонами пользователей и со 100К униками день - хватает значений по умолчанию


ну это трекер, там вроде бы иные задачи, а тут надо чтоб скрипт работал долго, да еще и sleep небольшой сделать видимо, чтобы не задёргать глобальную базу, хотя может и не нужно.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB