Сервер разрешает только один запрос за сеанс - PullRequest
3 голосов
/ 25 марта 2009

Сценарий:

Все страницы сайта xyz.com используют сеансы, чтобы проверить, вошел ли я в систему, и отобразить настроенный контент. Я вошел на xyz.com с помощью Firefox на моем iMac. Теперь, когда я пытаюсь посетить, xyz.com/page1.php и xyz.com/page2.php одновременно, пока страница 1 не загрузит страницу 2, не будет обработана.

Примеры кода

xyz.com / содержит (ссылки):

/* session check code here */
<a href="http://xyz.com/page1.php" rel="nofollow noreferrer">Page1</a>
<a href="http://xyz.com/page2.php" rel="nofollow noreferrer">Page2</a>

xyz.com / page1.php содержит:

/* session check code here */
echo "Hello";
flush();
sleep(5);
echo "done";

xyz.com / page2.php содержит:

/* session check code here */
echo "Second Page";
/* {insert code} to log time() to log.txt */

Тестирование

Вот что я делаю. Я вхожу в оболочку и поддерживаю выполнение этой команды:

user@xyz.com [~/public_html]# tail -f log.txt

В моем браузере (Firefox) (на xyz.com) я открываю несколько экземпляров page1 и page2 на вкладках. Если вы видите, страница1 будет загружаться не менее 5 секунд. Теперь, пока страница 1 не загрузится, запрос к странице 2 находится на рассмотрении. Это совсем не обрабатывается. Откуда я это знаю? Код в конце страницы2 регистрирует время доступа к файлу, который я отслеживаю. Давайте рассмотрим следующий случай:

Запросы отправлены (по порядку) 1. page1.php 2. page2.php 3. page2.php 4. page1.php 5. page1.php 6. page2.php

Результат (приблизительно)

1237961919 <- # 2 <BR> 1237961920 <- # 3 <BR> 1237961931 <- # 6 <BR>

Что ожидалось (приблизительно)

1237961915 <- # 2 <BR> 1237961915 <- # 3 <BR> 1237961915 <- # 6 <BR>

^ Предполагая, что все вызовы были выполнены одновременно

Наблюдение

Пока звонки обрабатываются, я, очевидно, не могу посетить xyz.com (это еще один запрос). Однако, если я открою его в другом браузере (Safari), он будет работать хорошо. Это потому что это очередной сеанс?

Возможные причины

  1. На сервере есть защита?

    Я больше программист, но если кто-то может дать указатели, я могу проверить сервер (VPS), чтобы убедиться, что apache / php неправильно настроен.

  2. Я неправильно обрабатываю сессии?

    Это имеет значение? Разве второй запрос не должен обрабатываться как другой поток?

  3. Чужие контролируют мой VPS.

    Хорошо, шучу. Я просто устал отслеживать эту проблему. Буду очень признателен, если кто-нибудь поймет, что здесь может пойти не так.

Ответы [ 5 ]

4 голосов
/ 09 ноября 2011

Попробуйте позвонить session_write_close() в page1.php после завершения проверки кода проверки.

/* session check code here */
session_write_close();
echo "Hello";
flush();

Это должно закрыть файл сессии (снять блокировку), и page2.php может открыть его.

http://php.net/manual/en/function.session-write-close.php

3 голосов
/ 09 октября 2010

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

Переключитесь на сеансы, хранящиеся в базе данных, и все будет в порядке.

1 голос
0 голосов
/ 06 сентября 2011

Не знаю для php, но с asp.net объект сеанса не может использоваться для чтения / записи более чем одним потоком одновременно. Так что получилось нечто, как вы описали. Второй запрос ожидает, когда состояние сеанса будет «разблокировано», чтобы начать обработку. Это имеет смысл, так как объект сеанса является согласованным для всей обработки запроса.

0 голосов
/ 25 марта 2009

Никогда не встречал ничего подобного. Вы уверены, что не используете CGI вместо FastCGI? Также проверьте, сколько php-процессов порождает ваш веб-сервер и сколько запросов они могут обработать.

Чтобы помочь с тестированием, вы можете добавить функцию сна на тестовую страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...