Как запретить повторный вызов скрипта до завершения его работы ?

  • Автор темы Автор темы RadMox
  • Дата начала Дата начала

RadMox

Guest
Как запретить повторный вызов скрипта до завершения его работы ?

Если несколько раз в браузере быстро нажать кнопку F5(обновить), то появляются отладочные сообщения об ошибках,свидетельствующие о некорректной работе скрипта, в частности о начале его выполнения до того как был завершен предыдущий вызов. Скрипт - простейший пример работы с mysql из учебника по PHP4. Единственное в него добавлен запрос удаляющий таблицу и несколько отладочных операторов вывода сообщений. Тестировалось в ДЕНВЕРЕ. ignore_user_abort() не помогает поскольку гипотетический пользователь не отсоединяется.
Заранее благодарю за помощь.
 
7ельзя ли почитать сообщения об ошибках не в вольном пересказе?
 
Автор оригинала: Фанат
7ельзя ли почитать сообщения об ошибках не в вольном пересказе?
На самом деле никаких сообщений бы не выводилось, как и не было бы результата выполнения скрипта, если бы не отладочная печать. А отладка такая: если SQL запрос завршается с FALSE то вывожу сообщение, т.о. вылетает ошибка создания таблицы плюс mysql_error = "Таблица уже существует", т.е последний запрос удаления таблицы в скрипте не выполнился либо выполнился не корректно. Причем при "небыстром" обновлении все ОК.

-~{}~ 14.04.05 10:25:

Я уже думал над работой с сессиями, и идея вроде бы есть, т.е. инициализировать сессию и каким нибудь образом запретить повторный вызов скрипта в течение определенного промежутка времени - необходимого для нормального завершения работы. Либо ковырять настройки php.ini и httpd.conf.
 
я что-то не понял.
а какой идиот будет давить F5, создавая таблицу? он же не у тебя создает на сайте, а у себя?
 
Автор оригинала: Фанат
я что-то не понял.
а какой идиот будет давить F5, создавая таблицу? он же не у тебя создает на сайте, а у себя?
Не HTML таблицу, а SQL. В скрипте создается табл, заполняется заначениями текущего времени, результат передается браузеру(10 строк),таблица удаляется. При обновлении по-учебнику выводится результат с добавленными 10ю строками. Я вставил запрос удаляющий таблицу. Так вот если обновлять очень быстро, то таблица не удаляется, мамой клянусь :).
 
создавай на диске файлик типа flag.txt и проверяй в начале скрипта есть он или нет - если нет - выполняем скрипт, если есть - даем отлуп. После исполнения скрипта удаляем файлик.
 
В скрипте создается табл, заполняется заначениями текущего времени
А зачем такие телодвижения?
Зачем что-то создавать, заполнять?
почему СРАЗУ не отдать?

ты пойми.
твоя проблема делится на две.
защита просто от флуда, любого - этго одно.
написание бессмысленного скрипта, как у тебя - другое.
одно с другим никак не связано.
 
Автор оригинала: RadMox
Я вставил запрос удаляющий таблицу. Так вот если обновлять очень быстро, то таблица не удаляется, мамой клянусь :).
Она и не удалится, т.к. она не создалась еще. :)

А чем сессии или flag.txt не устраивают то?
 
Просто написание "бессмысленного" скрипта выявило довольно серьезную на мой взгляд проблему. Лично я не хотел бы что-бы моя программа внезапно завершалась, выдавая неизвестно что или вообще ничего, нужно что бы все было продумано, и если пользователь прерывает ее работу можно конечно это предусмотреть, вывести сообщение и завершить ее работу, но это как то нехорошо. Даже если пользователю вдруг стал не нужен результат работы скрипта, мне нужно что бы он завершился согласно своему алгоритму. (если сервер вдруг не уронят) В общем то тему можно считать закрытой, буду работать в направлении сессий. Спасибо за поддержку. Пример своего решения приведу позже, что-бы соответствовать правилам форума :)

-~{}~ 14.04.05 11:44:

Автор оригинала: Лексеич
Она и не удалится, т.к. она не создалась еще. :)

А чем сессии или flag.txt не устраивают то?
Запрос на удаление вставлен в конце скрипта, и сообщение о том что табл. уже существует, говорит о том, что она не была удалена при предыдущем вызове программы. За сессии и флаги спасибо.
 
Автор оригинала: Фанат
А зачем такие телодвижения?
Зачем что-то создавать, заполнять?
почему СРАЗУ не отдать?

ты пойми.
твоя проблема делится на две.
защита просто от флуда, любого - этго одно.
написание бессмысленного скрипта, как у тебя - другое.
одно с другим никак не связано.
Да он вроде бы не о какой-то конкретной проблемме в коде, а о том, что если пользователь нажимает F5 во время исполнения скрипта, то выполнение скрипта обрывается. И поэтому нельзя гарантировать, что скрипт (любой) будет завершён до конца.

Я думал, что ignore_user_abort() принудительно заставит PHP закончить выполнение скрипта, даже если пользователь прервал соединение.

Кстати, это поднимает ещё один вопрос: А всегда ли вызываются деструкторы в PHP5? Вдруг при обрыве соединения они не исполняются?
 
ignore_user_abort() именно это и делает
заставляет php закончить выполнение скрипта, даже если соединение разорванно клиентом
однако тут надо понимать что такое соединение, и что такое клиент
 
Автор оригинала: neko
ignore_user_abort() именно это и делает
заставляет php закончить выполнение скрипта, даже если соединение разорванно клиентом
однако тут надо понимать что такое соединение, и что такое клиент
И что тут надо понимать под "соединением" и "клиеном"?

Насколько я понимаю:
соединение - TCP
клиент - браузер

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

Теоретически это должно быть новое TCP соединение, при условии, что для обновления используется та же функция, что и при открытии нового URL. Но, возможно браузер пытается как-то это оптимизировать и просто посылает в тоже самое TCP соединение новый HTTP запрос.

Только ли в этом? И вообще, прав ли я в своих догадках?
 
Сверху