[PHP][Apache] Ограничение кол-ва подключений с 1 ip.

DavyJohnes
На сайте с 05.01.2011
Offline
84
1334

Задача:

сделать так что бы один клиент одновременно мог обратиться только к одной копии скрипта script.php.

Имеется в виду такая ситуация:

человек открыл mysite.ru/script.php, скрипт находится в процессе выполнения, человек открывает еще одну вкладку в браузере и пытается запустить тот же скрипт, однако сервер выдает ему ошибку, мол нельзя одновременно запускать более 1 копии этого скрипта.

Как такое реализовать?

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
[umka]
На сайте с 25.05.2008
Offline
456
#1

Проще и эффективней это сделать на фаерволе или с помощью mod_limitipconn.

Но если задачу нужно решить только с помощью скрипта, то при вызове скрипта открываем файл со списком ip текущих подключений, проверяем, нет ли в нём ip пользователя, если нет то заносим, если есть, то выдаём сообщение об ошибке. При завершении скрипта запись из списка удаляем.

В данном решении необходимо предусмотреть блокировку файла.

Если посетителей много, то можно использовать базу данных.

Лог в помощь!
LS
На сайте с 08.10.2011
Offline
4
#2
DavyJohnes:

Как такое реализовать?

Для примера в PHP это можно реализовать через сессии.

1. Открываем сессию

2. Проверяем есть ли переменная user_connect=1 если нет создаем переменную user_connect=1

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

Плюсы подхода:

1. Быстро реализовать практически в любой CMS

2. Стандартное решение не требующее модулей

3. Не зависит от вебсервера

Минусы подхода:

1. Работает только если разрешены кукисы (можно без них не пускать на сайт)

2. Требует доработки CMS

DavyJohnes
На сайте с 05.01.2011
Offline
84
#3
LazySeo:
Для примера в PHP это можно реализовать через сессии.
1. Открываем сессию
2. Проверяем есть ли переменная user_connect=1 если нет создаем переменную user_connect=1
3. При втором подключении в сессии уже создана такая переменная, а значить юзер заходит повторно и его переадресовываем на нужно страницу (например с информацией об ограничениях)

Плюсы подхода:
1. Быстро реализовать практически в любой CMS
2. Стандартное решение не требующее модулей
3. Не зависит от вебсервера

Минусы подхода:
1. Работает только если разрешены кукисы (можно без них не пускать на сайт)
2. Требует доработки CMS

А что если юзер прервал выполнение скрипта? И то что должно было выполниться в конце скрипта, а именно сброс переменной user_connect, не будет выполнено, как тогда?

LS
На сайте с 08.10.2011
Offline
4
#4
DavyJohnes:
А что если юзер прервал выполнение скрипта? И то что должно было выполниться в конце скрипта, а именно сброс переменной user_connect, не будет выполнено, как тогда?

Согласен, предложенный вариант не лучший, еще можно сказать что открытие другого броузера, с другим набором кукисов (а значит и сессий) позволит запускать 2-ю копию.

В любом случае идентифицировать пользователя можно либо по IP, либо через метку в броузере.

Если брать за основу IP-фильтр то страдают пользователи за NAT, если кукисы - то пользователь может запустить еще один броузер.

В варианте с кукисами можно ограничить работу скрипта только в каком-то одном броузере через проверку user-agent.

Проблемы с обрывами и остановкой скрипта решаются временем жизни куки "до закрытия броузера"

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий