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 : перебор огромного количества данных
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
помогите плз с кроном =)
дано от 1 до 100 тысяч записей.
необходимо их выбрать из базы.
после этого необходимо их обработать (каждую запись) (немного математики)
затем на основе каждой записи снова пройтись по другим таблицам и обновить данные.
итого получается несколько тысяч запросов...
отсюда вопрос - как выжить серверу? =)
проще говоря, хочу запустить вот такой вот крон на сервере, чтобы он выполнялся раз в 12 часов и обновлял за день информацию. есть опасения что во время обработки так как идет сразу много запросов к базе - база будет недоступна...
верны ли мои опасения?
и стоит ли сделать задержку в выполнении скрипта - например делать паузу (sleep(2)) после обработки каждый 500 записей например
а если еще скажите чего и куда прописывать для запуска крона будет вопще идеально =)
я просто с ним раньше не работал никада... хоть и наслышан
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
Мелкий
Отправлено: 21 Декабря, 2009 - 22:17:14
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
На мой взгляд - надо делать паузу, при том я бы сделал наверное 1-2 секунды через каждые 250 записей.
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
Мелкий пишет:
а задания крона прописываются в /etc/crontab в формате: http://ru.wikipedia.org/wiki/Cron
я ооочень смутно представляю себе как это все делается...
поэтому буду рад подробной инструкции)
инструкции которые нашел у хоста не особо разобрал..
Мелкий пишет:
На мой взгляд - надо делать паузу, при том я бы сделал наверное 1-2 секунды через каждые 250 записей.
частые паузы блин тоже не сильно допустимы - ограничение по времени выполнения скрипта никто не отменял...
так что подумываю о том, чтобы разделить скрипт на несколько частей (несколько запусков)
например по 5.000-10.000 записей - и тогда думаю нормально будет... (Добавление)
хотя может и без крона можно...
кто либо сталкивался с играми типа ogame или травиан?
вот как лучше сделать чтобы шла добыча ресов и обновлялось показатели у пользователя?
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
JustUserR
Отправлено: 22 Декабря, 2009 - 01:12:59
Активный участник
Покинул форум
Сообщений всего: 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/
Champion
Отправлено: 22 Декабря, 2009 - 08:53:13
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
100000 записей - это не так много. Делать задержку через каждые 500 записей не нужно. Будет уходить много времени.
Надо попробовать сделать как можно меньше запросов. Ну и индексы правильно создать. В зависимости от того, что обновляется, что участвует в WHERE. (Добавление)
А по поводу как кроном пользоваться - посмотри ссылку, которую оставили. Просто в crontab строчку нужно добавить в таком виде, как там написано
Вездеход
Отправлено: 22 Декабря, 2009 - 09:14:05
Частый посетитель
Покинул форум
Сообщений всего: 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 - тем ценнее мои знания!
Мелкий
Отправлено: 22 Декабря, 2009 - 12:18:33
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Вездеход пишет:
к примеру в моем случае есть 100.000 пользователей. у них есть ресурсы - на каждый ресурс своя база (4 ресурса). итого надо получить инфу о юзерах, пересчитать сколько набежало ресов по каждому и обновить 4 таблички с инфой о ресах...
может получится канешно все это сделать скажем в 5-6 запросов, если смогу сделать упдейт одной таблицы целиком в одном запросе... но чет сомневаюсь
Т.е. ситуация:
1) у каждого пользователя свой баланс ресурсов
2) каждая база ресурсов в день приносит фиксированное количество ресурсов.
Так?
Тогда можно же приращивать значения всем строкам сразу, указывая ограничением для апдейта не ид, а количество баз. Или вообще повесить всё это дело на СУБД и получить update table set ресурс_пользователя = ресурс_пользователя+количество баз*количество_ресурсов_в_день.
Или я сильно ошибаюсь?
----- PostgreSQL DBA
EuGen
Отправлено: 22 Декабря, 2009 - 12:40:07
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Усреднение + шардинг по устойчивому признаку
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Вездеход
Отправлено: 22 Декабря, 2009 - 12:51:33
Частый посетитель
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
EuGen пишет:
Усреднение + шардинг по устойчивому признаку
что это значит? ))
Мелкий пишет:
Или я сильно ошибаюсь?
ну примерно так и надо... вот думаю как лучше - апдейт при обновлении странице пользователя - у него только данные обновляются
или же через крон...
Мелкий пишет:
всё это дело на СУБД
а как это делается??
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
Мелкий
Отправлено: 22 Декабря, 2009 - 13:29:55
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Вездеход пишет:
а как это делается??
То, что дальше в сообщении и зарисовано одним запросом:
update `table` set ресурс_пользователя = ресурс_пользователя + количество_подконтрольных_баз*количество_ресурсов_в_день
сработало на тестовой базе корректно.
----- PostgreSQL DBA
Вездеход
Отправлено: 22 Декабря, 2009 - 14:52:38
Частый посетитель
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
а. всмысле просто запрос... ну это да, я тож так и хотел))
я думал есть чтото типа cron'a но для базы))
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
Stierus
Отправлено: 22 Декабря, 2009 - 15:15:42
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
[quote]после этого необходимо их обработать (каждую запись) (немного математики)/quote] Ты уверен, что в 1 UPDATE это не уложится? (в sql тоже есть математика )
В общем, нужно видеть полную задачу что бы советовать что-то.
JustUserR
Отправлено: 22 Декабря, 2009 - 16:22:24
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Вездеход пишет:
А как сам себя он будет запускать? можно например переадресацию на самого себя использовать чтобы скрипт перезапускался? )
Я слышал про такой хитрый метод чтобы вызывать себя типа /usr/bin/links http://yoursite[dot]ru/script.php если хостер разрешает пользоваться этой утилитой
Ну а по простому можно вызывать с помощью system и exec но главное чтобы не заблокировали
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Вездеход
Отправлено: 22 Декабря, 2009 - 17:29:06
Частый посетитель
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
JustUserR пишет:
Ну а по простому можно вызывать с помощью system и exec но главное чтобы не заблокировали
заблокированы)))
JustUserR пишет:
Я слышал про такой хитрый метод чтобы вызывать себя типа /usr/bin/links http://yoursite[dot]ru/script.php если хостер разрешает пользоваться этой утилитой
посмотрю. пасибо
Stierus пишет:
В общем, нужно видеть полную задачу что бы советовать что-то.
все еще только проектируется.. потому и нету точной инфы))
Stierus пишет:
(в sql тоже есть математика )
это я знаю.. просто нужно ведь все точно расчитать, побоялся что не получится все в один запрос вбухать)
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
valenok
Отправлено: 22 Декабря, 2009 - 18:08:42
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Пересмотрите структуру таблиц и напишите задачу максимально подробно.
Как вы что храните, кто, как, когда и за что добавляет ресурсы.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.