Асинхронный AJAX
1172 повідомлення
#13 років тому
Дано:Страница через jQuery делает асинхронный запрос к скрипту, который начинает закачивать файло через ftp.
Через каждые 5с делаются еще асинхронные запросы к другому скрипту, который считает количество файлов в папке.
Получаем:
Первый скрипт висит до своего выполнения. Вторые скрипты выстраиваются дружной очередью и ждут окончания выполнения первого.
Более того, в данном браузере открыть любую страницу с этого домена невозможно, пока не завершится выполнение первого скрипта. Причем с другого браузера открыть можно. От изменения марки браузера ничего не меняется.
Если выставить первому запросу таймаут в 3с, то он умирает в нужный момент, но пока не закончится реальное копирование файлов по ftp, в этом же браузере ничего с этого домена не откроется.
Вопрос:
Почему асинхронный запрос полностью перекрывает доступ к домену в инициировавшем этот запрос браузере?
1172 повідомлення
#13 років тому
Запрос асинхронен. А в случае с таймаутом он вообще сдох.Причина в session_start(); в начале скриптов. Все решается добавлением session_destroy(); после строк авторизации. Ибо нефиг лочить сессию

1172 повідомлення
#13 років тому
Enkvist, session_start в первом скрипте открывает сессию и лочит ее до конца выполнения этого скрипта. Пока скрипт качает файлы никакие другие скрипты из текущего браузера не могут быть вызваны. Поэтому в другом браузере с другой сессией все работало без проблем. А вот если разблокировать сессию через session_destroy после авторизации, но перед началом скачивания файлов, то избавляемся от всех проблем.А вывод прост, я элементарно был не в курсе, что php лочит сессии. Да и дела мне до этого не было.
1316 повідомлень
#13 років тому
Lisio, ни разу такого не встречал. даже не пойму, как он вообще может что-то лочить там... тем более , что запросы то асинхронны. но если помогло - хорошо)
1172 повідомлення
#13 років тому
Crist, когда масло с помощью параметра async в jQuery можно сделать немасленным, то приходится уточнять.
99 повідомлень
#13 років тому
Lisio, использование session_destroy(); не совсем верно, зачем убивать сессию, есть прекрасная функция session_write_close(); которая освобождает дескриптор файла сессии и все остальные запросы могут отрабатывать. Если не освободить дескриптор, то остальные запросы ждут доступа к файлу на строчке session_start().
2989 повідомлень
#13 років тому
Цитата ("Crist"):ОффтопикАсинхронный AJAX
Масленное МАСЛО
AJAX, конечно, ассинхронный, но его можно и синхронизировать.
"Синхронная и асинхронная модель в AJAX" посилання
ИМХО сессия сама по себе тут не причем. Я бы в первую очередь проверил на возможность зацикливания, т.е. что вроде вызова AJAX'а самим же AJAX'ом.