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

RadMox

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

Если несколько раз в браузере быстро нажать кнопку F5(обновить), то появляются отладочные сообщения об ошибках,свидетельствующие о некорректной работе скрипта, в частности о начале его выполнения до того как был завершен предыдущий вызов. Скрипт - простейший пример работы с mysql из учебника по PHP4. Единственное в него добавлен запрос удаляющий таблицу и несколько отладочных операторов вывода сообщений. Тестировалось в ДЕНВЕРЕ. ignore_user_abort() не помогает поскольку гипотетический пользователь не отсоединяется.
Заранее благодарю за помощь.
 

Фанат

oncle terrible
Команда форума
7ельзя ли почитать сообщения об ошибках не в вольном пересказе?
 

RadMox

Guest
Автор оригинала: Фанат
7ельзя ли почитать сообщения об ошибках не в вольном пересказе?
На самом деле никаких сообщений бы не выводилось, как и не было бы результата выполнения скрипта, если бы не отладочная печать. А отладка такая: если SQL запрос завршается с FALSE то вывожу сообщение, т.о. вылетает ошибка создания таблицы плюс mysql_error = "Таблица уже существует", т.е последний запрос удаления таблицы в скрипте не выполнился либо выполнился не корректно. Причем при "небыстром" обновлении все ОК.

-~{}~ 14.04.05 10:25:

Я уже думал над работой с сессиями, и идея вроде бы есть, т.е. инициализировать сессию и каким нибудь образом запретить повторный вызов скрипта в течение определенного промежутка времени - необходимого для нормального завершения работы. Либо ковырять настройки php.ini и httpd.conf.
 

Фанат

oncle terrible
Команда форума
я что-то не понял.
а какой идиот будет давить F5, создавая таблицу? он же не у тебя создает на сайте, а у себя?
 

RadMox

Guest
Автор оригинала: Фанат
я что-то не понял.
а какой идиот будет давить F5, создавая таблицу? он же не у тебя создает на сайте, а у себя?
Не HTML таблицу, а SQL. В скрипте создается табл, заполняется заначениями текущего времени, результат передается браузеру(10 строк),таблица удаляется. При обновлении по-учебнику выводится результат с добавленными 10ю строками. Я вставил запрос удаляющий таблицу. Так вот если обновлять очень быстро, то таблица не удаляется, мамой клянусь :).
 

kvf77

Red Devil
создавай на диске файлик типа flag.txt и проверяй в начале скрипта есть он или нет - если нет - выполняем скрипт, если есть - даем отлуп. После исполнения скрипта удаляем файлик.
 

Фанат

oncle terrible
Команда форума
В скрипте создается табл, заполняется заначениями текущего времени
А зачем такие телодвижения?
Зачем что-то создавать, заполнять?
почему СРАЗУ не отдать?

ты пойми.
твоя проблема делится на две.
защита просто от флуда, любого - этго одно.
написание бессмысленного скрипта, как у тебя - другое.
одно с другим никак не связано.
 

Лексеич

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

А чем сессии или flag.txt не устраивают то?
 

RadMox

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

-~{}~ 14.04.05 11:44:

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

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

Domovoj

Guest
Автор оригинала: Фанат
А зачем такие телодвижения?
Зачем что-то создавать, заполнять?
почему СРАЗУ не отдать?

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

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

Кстати, это поднимает ещё один вопрос: А всегда ли вызываются деструкторы в PHP5? Вдруг при обрыве соединения они не исполняются?
 

neko

tеam neko
ignore_user_abort() именно это и делает
заставляет php закончить выполнение скрипта, даже если соединение разорванно клиентом
однако тут надо понимать что такое соединение, и что такое клиент
 

Domovoj

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

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

Разве когда пользователь жмёт F5 браузер не закрывает текущее соединение и не открывает новое?
 

neko

tеam neko
а я вот незнаю, что там браузер делает
немогу знать, я их не пишу
скорее всего да -- так как ты сказал
 

Domovoj

Guest
Разве когда пользователь жмёт F5 браузер не закрывает текущее соединение и не открывает новое?
Подумал ещё раз. Наверно это зависит от браузера.

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

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