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 :: cron : перебор огромного количества данных

 PHP.SU

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


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

> Без описания
Вездеход
Отправлено: 21 Декабря, 2009 - 21:11:12
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




помогите плз с кроном =)

дано от 1 до 100 тысяч записей.
необходимо их выбрать из базы.
после этого необходимо их обработать (каждую запись) (немного математики)
затем на основе каждой записи снова пройтись по другим таблицам и обновить данные.

итого получается несколько тысяч запросов...
отсюда вопрос - как выжить серверу? =)

проще говоря, хочу запустить вот такой вот крон на сервере, чтобы он выполнялся раз в 12 часов и обновлял за день информацию. есть опасения что во время обработки так как идет сразу много запросов к базе - база будет недоступна...
верны ли мои опасения?
и стоит ли сделать задержку в выполнении скрипта - например делать паузу (sleep(2)) после обработки каждый 500 записей например

а если еще скажите чего и куда прописывать для запуска крона будет вопще идеально =)
я просто с ним раньше не работал никада... хоть и наслышан


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Мелкий Супермодератор
Отправлено: 21 Декабря, 2009 - 22:17:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




На мой взгляд - надо делать паузу, при том я бы сделал наверное 1-2 секунды через каждые 250 записей.

а задания крона прописываются в /etc/crontab в формате: http://ru[dot]wikipedia[dot]org/wiki/Cron


-----
PostgreSQL DBA
 
 Top
Вездеход
Отправлено: 21 Декабря, 2009 - 23:16:29
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




Мелкий пишет:
а задания крона прописываются в /etc/crontab в формате: http://ru.wikipedia.org/wiki/Cron

я ооочень смутно представляю себе как это все делается...
поэтому буду рад подробной инструкции)
инструкции которые нашел у хоста не особо разобрал..

Мелкий пишет:
На мой взгляд - надо делать паузу, при том я бы сделал наверное 1-2 секунды через каждые 250 записей.

частые паузы блин тоже не сильно допустимы - ограничение по времени выполнения скрипта никто не отменял...
так что подумываю о том, чтобы разделить скрипт на несколько частей (несколько запусков)
например по 5.000-10.000 записей - и тогда думаю нормально будет...
(Добавление)
хотя может и без крона можно...
кто либо сталкивался с играми типа ogame или травиан?
вот как лучше сделать чтобы шла добыча ресов и обновлялось показатели у пользователя?


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
JustUserR
Отправлено: 22 Декабря, 2009 - 01:12:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




Вездеход Я так понял надо в течение времени выполнять длительную но плановую работу
1 В cronе через некоторые промежуток времени вызываем искомый PHP-скрипт - далее все зависит от того можно ли установить параметр set_time_limit в ноль для бесконечного выполнения
2 Вообще пусть запуск PHP-скрипта происходит из cronа кажые 10 минут и при запуске создается специальный файл который хранит в себе информацию о процессе выполнения работы - после чего происходит выполнение некоторой части работы
3 Когда часть работы PHP-скриптом выполнена то он изменяет файл с состояние выполненя и делает sleep после чего либо продолжает работу либо запускает заново сам себя (Зависит от параметра time_limit)
4 Если вдруг PHP-скрипт рухнул или не уложился по времени то тоже ничего страшного - он заново запуститься через cron и прочитает из файла информацию на чем он остановился и продолжит работу
5 Если вдруг PHP-скрипт будет продолжать выполнять и запуститься еще одна инстанция из cronа то в файл с состоянием работы можно записать время последнего обновления и если оно меньше какойто величины то вторая инстанция закрывается


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 22 Декабря, 2009 - 08:53:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




100000 записей - это не так много. Делать задержку через каждые 500 записей не нужно. Будет уходить много времени.
Надо попробовать сделать как можно меньше запросов. Ну и индексы правильно создать. В зависимости от того, что обновляется, что участвует в WHERE.
(Добавление)
А по поводу как кроном пользоваться - посмотри ссылку, которую оставили. Просто в crontab строчку нужно добавить в таком виде, как там написано
 
 Top
Вездеход
Отправлено: 22 Декабря, 2009 - 09:14:05
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




JustUserR пишет:
1 В cronе через некоторые промежуток времени вызываем искомый PHP-скрипт - далее все зависит от того можно ли установить параметр set_time_limit в ноль для бесконечного выполнения

нет, низя- у хостера заблокирована эта фишка
JustUserR пишет:
2 Вообще пусть запуск PHP-скрипта происходит из cronа кажые 10 минут и при запуске создается специальный файл который хранит в себе информацию о процессе выполнения работы - после чего происходит выполнение некоторой части работы

10 минут тоже низя - у меня разрешение раз в час только... =(
а логи да, само сабой.
JustUserR пишет:
3 Когда часть работы PHP-скриптом выполнена то он изменяет файл с состояние выполненя и делает sleep после чего либо продолжает работу либо запускает заново сам себя (Зависит от параметра time_limit)

а как сам себя он будет запускать? можно например переадресацию на самого себя использовать чтобы скрипт перезапускался? )
JustUserR пишет:
4 Если вдруг PHP-скрипт рухнул или не уложился по времени то тоже ничего страшного - он заново запуститься через cron и прочитает из файла информацию на чем он остановился и продолжит работу

да по идее да... пока не придумал как именно так сделать...
или же в базе сразу у обработанных записях ставить отметки времени - когда они были обработаны.. и на основе них уже делать все.
Champion пишет:
100000 записей - это не так много. Делать задержку через каждые 500 записей не нужно. Будет уходить много времени.
Надо попробовать сделать как можно меньше запросов. Ну и индексы правильно создать. В зависимости от того, что обновляется, что участвует в WHERE.

та это то понятно...
к примеру в моем случае есть 100.000 пользователей. у них есть ресурсы - на каждый ресурс своя база (4 ресурса). итого надо получить инфу о юзерах, пересчитать сколько набежало ресов по каждому и обновить 4 таблички с инфой о ресах...
может получится канешно все это сделать скажем в 5-6 запросов, если смогу сделать упдейт одной таблицы целиком в одном запросе... но чет сомневаюсь


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Мелкий Супермодератор
Отправлено: 22 Декабря, 2009 - 12:18:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Вездеход пишет:
к примеру в моем случае есть 100.000 пользователей. у них есть ресурсы - на каждый ресурс своя база (4 ресурса). итого надо получить инфу о юзерах, пересчитать сколько набежало ресов по каждому и обновить 4 таблички с инфой о ресах...
может получится канешно все это сделать скажем в 5-6 запросов, если смогу сделать упдейт одной таблицы целиком в одном запросе... но чет сомневаюсь

Т.е. ситуация:
1) у каждого пользователя свой баланс ресурсов
2) каждая база ресурсов в день приносит фиксированное количество ресурсов.
Так?
Тогда можно же приращивать значения всем строкам сразу, указывая ограничением для апдейта не ид, а количество баз. Или вообще повесить всё это дело на СУБД и получить update table set ресурс_пользователя = ресурс_пользователя+количество баз*количество_ресурсов_в_день.
Или я сильно ошибаюсь?


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 22 Декабря, 2009 - 12:40:07
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Усреднение + шардинг по устойчивому признаку


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Вездеход
Отправлено: 22 Декабря, 2009 - 12:51:33
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




EuGen пишет:
Усреднение + шардинг по устойчивому признаку

что это значит? ))
Мелкий пишет:
Или я сильно ошибаюсь?

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

Мелкий пишет:
всё это дело на СУБД

а как это делается??


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Мелкий Супермодератор
Отправлено: 22 Декабря, 2009 - 13:29:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Вездеход пишет:
а как это делается??

То, что дальше в сообщении и зарисовано одним запросом:
CODE (text):
скопировать код в буфер обмена
  1. update `table` set ресурс_пользователя = ресурс_пользователя + количество_подконтрольных_баз*количество_ресурсов_в_день

сработало на тестовой базе корректно.


-----
PostgreSQL DBA
 
 Top
Вездеход
Отправлено: 22 Декабря, 2009 - 14:52:38
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




а. всмысле просто запрос... ну это да, я тож так и хотел))
я думал есть чтото типа cron'a но для базы))


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Stierus Супермодератор
Отправлено: 22 Декабря, 2009 - 15:15:42
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


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




[quote]после этого необходимо их обработать (каждую запись) (немного математики)/quote] Ты уверен, что в 1 UPDATE это не уложится? (в sql тоже есть математика )

В общем, нужно видеть полную задачу что бы советовать что-то.
 
My status
 Top
JustUserR
Отправлено: 22 Декабря, 2009 - 16:22:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




Вездеход пишет:
А как сам себя он будет запускать? можно например переадресацию на самого себя использовать чтобы скрипт перезапускался? )
Я слышал про такой хитрый метод чтобы вызывать себя типа /usr/bin/links http://yoursite[dot]ru/script.php если хостер разрешает пользоваться этой утилитой
Ну а по простому можно вызывать с помощью system и exec но главное чтобы не заблокировали Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Вездеход
Отправлено: 22 Декабря, 2009 - 17:29:06
Post Id



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


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




JustUserR пишет:
Ну а по простому можно вызывать с помощью system и exec но главное чтобы не заблокировали

заблокированы)))

JustUserR пишет:
Я слышал про такой хитрый метод чтобы вызывать себя типа /usr/bin/links http://yoursite[dot]ru/script.php если хостер разрешает пользоваться этой утилитой

посмотрю. пасибо

Stierus пишет:
В общем, нужно видеть полную задачу что бы советовать что-то.

все еще только проектируется.. потому и нету точной инфы))

Stierus пишет:
(в sql тоже есть математика )

это я знаю.. просто нужно ведь все точно расчитать, побоялся что не получится все в один запрос вбухать)


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
valenok Модератор
Отправлено: 22 Декабря, 2009 - 18:08:42
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Пересмотрите структуру таблиц и напишите задачу максимально подробно.
Как вы что храните, кто, как, когда и за что добавляет ресурсы.

http://highload[dot]com[dot]ua/index.php[dot][dot][dot]%BA%D0%B0%D1%86/


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB