2013-12-13 2 views
0

Использование PHP или Apache (я также подумал бы о переходе на Nginx, если это необходимо), как я могу сделать страницу только запущенной один раз за раз? Если одновременно будут поступать три запроса, все будет завершено полностью, затем следующее, а затем следующее. Ни в коем случае страница не будет доступна более чем по одному запросу одновременно.Предельная страница к одному синтаксическому запросу

Думайте об этом, как о транзакциях! Как я могу это достичь? Он должен быть одной страницей на сервере, без пользователя или IP.

ответ

0

Если же пользователь дает запрос от одной и той же страницы, а затем использовать session_start(), это будет блокировать другие запросы, пока финише первого запроса

Пример:

http://codingexplained.com/coding/php/solving-concurrent-request-blocking-in-php

Если вы хотите, чтобы блокировать запрос от разных браузеров/клиентов, хранить записи в базе данных и обрабатывать их один за другим.

+0

Я думаю, что может возникнуть недоразумение. Если у меня есть три запроса от трех разных пользователей, я хочу, чтобы он выполнялся целиком, затем следующий и, наконец, последний. Я не хочу блокировать его на основе пользователя, потому что это позволит нескольким пользователям каждого из них выполнить один одновременный запрос. Из-за блокировки сервером, не являющимся пользователем, сеансы не являются решением, если я не понимаю, как сервер блокирует сеансы. –

1

Что вы хотите делать с состоянием «занято» на сервере? немедленно вернуть ошибку или сохранить запросы в ожидании, пока предыдущие заканчиваются?

Если вы просто хотите, чтобы сервер отказаться от содержимого клиенту, вы можете сделать это на обоих Nginx и Apache:

"хитрым" часть в ваш запрос не должен ограничиваться IP-адресом, как обычно требуется людям, но глобально для URI. Я знаю, что это должно быть возможно с mod_security зародыше я не делал это сам, но у меня есть такая конфигурация работает для Nginx:

http { 
    #create a zone by $package id (my internal variable, similar to a vhost) 
    limit_req_zone $packageid zone=heavy-stuff:10m rate=1r/s; 

} 

потом:

server { 
    set $packageid some-id; 
    location = /some-heavy-stuff { 
       limit_req zone=heavy-stuff burst=1 nodelay; 
    } 
} 

что он делает для меня является создание N предельные зоны, по одному для каждого из моих серверов. Затем зона используется для подсчета запросов и допускает только 1 секунду.

Надеюсь, это поможет

+0

Был бы какой-то способ не делать это один раз в секунду, а как раз за раз? Если запрос занимает треть секунды, он будет разрешать три в секунду, и если это займет 2 секунды, это позволит один раз в две секунды. Пока сервер занят, у меня нет никаких проблем с ним, просто ожидая ответа. В качестве альтернативы, я также могу вывести набор и определенное значение. Креативное решение с использованием mod_security! +1 за это! –

+0

@NicholasYost не может сказать для mod_security, но AFAIK вы не можете с nginx без кодирования. –

Смежные вопросы