Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Большая задержка при двух асинхронных запросах.  (Прочитано 1035 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Igorjoha

  • Автор темы
  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Всем привет. На локальной машине установлена связка Apache2+php5+mysql5. javascript делает два асинхронных запроса. Первый обрабатывается дольше первого, потому что ему необходимо подключится к серверу, взять данные, разобрать по полочкам и отдать браузеру. Второй запрос на данный момент обращается только к базе данных и проверяет сессию. Конечно, в дальнейшем задания у него будут более масштабными, но дело в том, что этот второй запрос приходит всегда позже первого. В чем может быть проблема?

P.S. Проблема, как я понял, заключается в session_start(). Как показывает эксперимент, эта функция ждет когда файл сессии будет закрыт другим процессом и только после этого она открывает его и скрипт продолжает свое выполнение. Подскажите, как можно это решить? Т.е. можно ли сделать так, чтобы файл сессии мог открываться двумя скриптами одновременно? Я конечно, понимаю, что при этом возможны ошибки при выполнении двух скриптов одновременно от одного пользователя, но это уже моя проблема, чтобы избежать их. Заранее всем спасибо.
« Последнее редактирование: 15 Мая 2013, 17:27:32 от Igorjoha »

Оффлайн bukiko

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
эм, без самих скриптов сложно что либо сказать -)

Оффлайн Igorjoha

  • Автор темы
  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Проблему решил. Собственно говоря, для решения даже и скрипт не нужен. Суть следующая: когда скрипт открывает сессию командой session_start() файл сессии блокируется и другой скрипт не может к нему обратиться. Соответственно другой скрипт при выполнении session_start() будет ждать до тех пор, пока файл сессии не разблокируется. Если оба скрипта могут выполняться довольно длительное время и могу возникать ситуации, когда они запрашиваются в одно и то же время, то, чтобы ни один из скриптов не ждал пока другой скрипт завершит свою работу, надо просто напросто сразу после получения данных из сессии и проведения необходимых действий вызывать команду session_commit(). Эта команда разблокирует файл сессии, но вы уже ничего не сможете поменять, для этого вам придется опять вызвать session_start(). Надеюсь кому-нибудь это пригодится:)

Оффлайн MooSE

  • Старожил
  • *
  • Сообщений: 1137
    • Просмотр профиля
Если в сессии не хранится ничего критичного то можно написать свой session handler, который не будет содержать блокировок.

Оффлайн Igorjoha

  • Автор темы
  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Но проще использовать встроенный, т.к. он более продуман. А по поводу блокировки - это даже хорошо. Иначе приходится слишком извращаться, чтобы ничего не поперепуталось и как следствие приходится реализовывать блокировку. Как следствие, от чего ушли, к тому и вернулись. Ну по крайней мере при решении моей задачи. Все так и было, может у кого и попроще.

Оффлайн MooSE

  • Старожил
  • *
  • Сообщений: 1137
    • Просмотр профиля
Но проще использовать встроенный, т.к. он более продуман. А по поводу блокировки - это даже хорошо. Иначе приходится слишком извращаться, чтобы ничего не поперепуталось и как следствие приходится реализовывать блокировку. Как следствие, от чего ушли, к тому и вернулись. Ну по крайней мере при решении моей задачи. Все так и было, может у кого и попроще.

У меня есть опыт написания session handler для большого проекта. Идеальным оказался именно вариант без блокировок. А в сессионных данных нет ничего критичного. Сессия скорее используется как некоторых кэш для ряда данных пользователя, которые всегда можно восстановить из бд.

 

Страница сгенерирована за 0.031 секунд. Запросов: 21.