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 :: Ограничение на выполнение скрипта
Покинул форум
Сообщений всего: 11
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
Здравствуйте, Уважаемые коллеги.
Возникла проблема... Хочу сделать, чтобы некий скрипт можно было бы выполнять пользователю, скажем, 1 раз в 5 минут. В общем-то скрипт является формой, которая заносит данные в базу. Инпуты заранее содержат данные, поэтому можно бесконечно долго нажимать на кнопку сохранить/изменить.
Пробовал решить проблемы с помощью кук, но вызвать их посреди документа я не могу. Да и структура слишком сложная(smarty + include + сессии + много-много файлов), чтобы пытаться создать куку до вывода информации в браузер. Есть ли у кого-нибудь идеи?
Покинул форум
Сообщений всего: 11
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
Ну пользователей много. Около 12 000.. Если каждый начнет сохранять своё время, например, в файл, то будут сбои, связанные с одновременным открытием. Если сохранять в БД, то получится куча новых запросов.
Ведь этого я как раз и пытаюсь избежать. То есть если раньше, для изменения данных надо было заполнить все поля и отправить на обработку, после неё уже открывалась БД, выбиралась таблица, заносились данные. Я же хочу сделать так, чтобы для пользователя вообще не были доступны формы в течение 5 минут. Ну а в идеале еще писалось бы оставшееся время.
TM123
Отправлено: 03 Февраля, 2011 - 19:04:03
Новичок
Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010 Откуда: Москва
Помог: 0 раз(а)
1. делаете таблицу с одной записью где стоит время когда форма станет доступна, это значение закэшируется в базе и будет пулей возвращаться.
2. Перед выводом формы проверяете время и говорите облом или форму
3. Перед сохранением формы проверяете время и либо говорите облом, либо сохраняете, только во время облома надо форму отдавать пользователю, иначе человек колотивший форму и потерявший все проклянет вас. Выполненные здесь операции по insert/update не кэшируются, занимают много времени и на них как вы и хотели сэкономите время.
На куках вы эту проблему кардинально не решите, куки можно подменить, бд хацкоустойчева как скала!
Даже если вы будите писать время для каждого отдельного пользователя, то все равно наиболее активные будут закэшированы, а можно еще раз в день грохать всех пользователей не проявляющих активность более заданного времени и тем уменьшить нагрузку при выборке еще незакэшированного пользователя.
Можно решить проблему проверкой поменял ли пользователь хоть что-то в форме и если ничего не поменял нажав на submit, послать в лес - это самый простой и думаю правильный способ, зачем вам форма в которой автоматически сгенеренные данные, вы их и так могли сразу кинуть в базу без выдачи пользователю.
Ну и юморной способ из области борьбы с подбором паролей, перед сохранением формы поставить sleep на 5 минут и выводить бегунок времени, до сохранения формы осталось 4 минуты 17 секунд
Покинул форум
Сообщений всего: 180
Дата рег-ции: Янв. 2011 Откуда: Россия
Помог: 2 раз(а)
а сессии тут разве не подойдут?
Мелкий
Отправлено: 03 Февраля, 2011 - 19:29:34
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Shadow999 пишет:
Ну пользователей много. Около 12 000.. Если каждый начнет сохранять своё время, например, в файл, то будут сбои, связанные с одновременным открытием. Если сохранять в БД, то получится куча новых запросов.
Так у вас по вашим словам и так используются сессии - туда и пишите.
----- PostgreSQL DBA
Shadow999
Отправлено: 03 Февраля, 2011 - 19:34:15
Новичок
Покинул форум
Сообщений всего: 11
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
TM123 пишет:
Можно решить проблему проверкой поменял ли пользователь хоть что-то в форме и если ничего не поменял нажав на submit, послать в лес - это самый простой и думаю правильный способ...
Да, да... Я сначала так и хотел сделать, но подумал, что как-то не этично, что ли. Ведь можно просто изменить одну циферку и готово.. Наверно я так и сделаю.
TM123 пишет:
зачем вам форма в которой автоматически сгенеренные данные, вы их и так могли сразу кинуть в базу без выдачи пользователю.
Просто форма - это по сути редактор профиля.
Имя: |
Возраст: |
и т.д.
Если у человека нет этих данных, то поля пустые. Иначе, все поля заполняются переменными из сессии. Не заставлять же пользователь вводить каждый раз своё имя, чтобы просто поменять аватар. А отслеживать изменения в конкретных полях мне не хочется.
TM123 пишет:
Ну и юморной способ из области борьбы с подбором паролей, перед сохранением формы поставить sleep на 5 минут и выводить бегунок времени, до сохранения формы осталось 4 минуты 17 секунд
Ну это уже из области садизма.
Ладно, спасибо огромное за идею. (Добавление)
Мелкий пишет:
Так у вас по вашим словам и так используются сессии - туда и пишите.
Можно по-подробнее... Я знаю в куки можно вдохнуть жизнь, к примеру, на час. Можно и сессию ограничить. Я думал создай какой-нибудь влажок, который бы отвечал за то, менял ли пользователь данные. А как поменять его обратно через 5 минут? Не знаю, даже представить трудновато. (Добавление)
Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010 Откуда: Москва
Помог: 0 раз(а)
У вас проблема в снятии нагрузки или в получении данных, ну поменял одну цифру и ткнул submit, на это надо на много больше времени чем на просто нажать submit, можно принять форму и обнаружив отсутствие изменений просто не сохранять в базу, а отдать ее же, вот и разгрузка базы.
Изменение данных и наличие данных это не одно и тоже, в форме 10 полей, писать в базу при изменении хотя бы одного, тогда не будет требоваться заполнение не заполненных полей.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.