нужны пояснения по работе PHP c оракловыми сессиями

trustno1

Новичок
нужны пояснения по работе PHP c оракловыми сессиями

Использую persistent-соединение с ораклом. При первом запросе создается сессия (status=INACTIVE), и она используется при последующих запросах. Однако через какое-то время при очередном выполнении скрипта создается еще одна сессия и запросы уже обрабатываются ей. Обнаружил, что создается около 4-х сессий для одного и того же USERNAME (SCHEMANAME) в течение дня. При этом, если убить наиболее старые по дате создания сессии, то можно при выполнении скрипта получить ORA-00022: invalid session ID; access denied. Т.е. PHP пытается воспользоваться одной из ранее созданных, но уже убитых сессий.
Подскажите, чем вызвано, что PHP создает новые сессии, если для этого же пользователя уже есть сессия? Почему сессии находятся в статусе INACTIVE (по идее должно быть ACTIVE)? Когда завершаются persistent-коннекты, только при убивании их вручную?

-~{}~ 18.06.05 10:42:

я так понимаю это может быть связано с тем, что php-скрипт выполняется разными процессами веб-сервера? Но у меня Apache2 под win, который как известно тредовый...

-~{}~ 18.06.05 10:51:

а еще вот такое бывает: ORA-00021: session attached to some other process; cannot switch session
 

Falc

Новичок
trustno1
насколько я понимаю тредовость второго апача, не означает что каждый тред будет радотать с одним и темже коннектом, каждый тред php открывает свою сессию к ораклу вот они и плодятся. Если тебя это напрягает то постарайся минимизировать кол-во тредов апача ( поткрутив настройки или использовав прокси ).
 

trustno1

Новичок
да, это верно, селект из v$session показывает, что сессии принадлежат разным тредам одного процесса... Интересно сколько будет жить каждый тред, вечно (пока жив Апач)?
посмотрю, что можно в настройках сделать...
 

Falc

Новичок
trustno1
Честно говоря не работал со вторым апачем, но в первом можно задать кол-во запросов на процес, после обработки которых он заменяется новым. Так же еще можно посмотреть в сторону php как fcgi. Хотя честно говоря я не понимаю чем тебя напрягает то что от веб сервера у тебя открыт десяток сесий к ораклу?
 

Olger

Guest
Автор оригинала: Falc
trustno1
я не понимаю чем тебя напрягает то что от веб сервера у тебя открыт десяток сесий к ораклу?
В том-то и дело, что количество сессий меряется не десятками, а сотнями (а это не есть хорошо в любом случае), причем сесси эти висят и не закрываются пока не остановить Apache.
Пробовал поиграть с параметром Apache KeepAliveTimeout, но толку мало - количество сессий от одного пользователя сократилось, но не намного.
Так и остается нерешенной проблема корректного завершения сессий после завершения скрипта.
 

trustno1

Новичок
Автор оригинала: Olger
Пробовал поиграть с параметром Apache KeepAliveTimeout, но толку мало - количество сессий от одного пользователя сократилось, но не намного.
Так и остается нерешенной проблема корректного завершения сессий после завершения скрипта.
Во-первых, KeepAliveTimeout и сессии оракла никак не связаны.
Во-вторых, что значит количество сессий от одного пользователя? Сессии к ораклу открываются под пользователем, под которым запущен Апач. Это ОДИН пользователь. И открываются они с веб-сервера, а не с клиентских ПК :D
В-третьих, если сделал к ораклу персист-соединение, то после выполнения скрипта, она (сессия) не умрёт, а перейдет в статус INACTIVE. Если хочешь, чтобы умирала, то не используй персист-коннекты.
А ты какой-то бред написал
 

Olger

Guest
Во-первых, если KeepAliveTimeout и сессии Oracle никак не связаны, то почему после изменения этого параметра с 15 сек. до 5 мин. количество открытых сессий одним пользователем уменьшается в три-четыре раза?

Во-вторых, прописные истины о работе web-приложений я и сам знаю! Речь идет о сессиях Oracle, соответственно у каждой из них есть Username - имя пользователя, который вводится с клиентских мест, поэтому я точно знаю, сколько сессий у каждого пользователя, а Apache это Program в понимании v_$session.

В-третьих, я не правильно выразился насчет завершения скрипта, имелось ввиду завершение приложения, т.е. выход из браузера и отсоединение от Apache.

Я надеялся, что постоянное соединение (ociPlogon) будет использовать уже существующие открытые сессии (которые INACTIVE) с теми же username/password, но на деле сессии плодятся и их количество постоянно увеличивается даже при работе одним пользователем.
Если есть предложения, как решить эту проблему - милости прошу, а наезжать будешь, когда сам разберешься.
 

trustno1

Новичок
Автор оригинала: Olger
Во-первых, если KeepAliveTimeout и сессии Oracle никак не связаны, то почему после изменения этого параметра с 15 сек. до 5 мин. количество открытых сессий одним пользователем уменьшается в три-четыре раза?
KeepAliveTimeout задаёт время, в течение которого TCP-соединение на участке клиент<->веб-сервер будет открыто, если не поступит новый запрос.
Сессии же оракла открываются на участке веб-сервер<->сервер Оракл, и я пока не понимаю, как этот параметр Апача может влиять на сессии...
 

Olger

Guest
Значит это какой-то общий глюк Apache и PHP. т.е. пока клиент укладывается с запросами в KeepAliveTimeout, персистент коннекты работают (используют открытые соединения), как только время ожидания превышает отведенное в параметре - Апач отрубает клиента, тут он видимо прибивает процесс PHP, а при следующем запросе PHP полюбому открывает новое соединение с Ораклом даже не пытаясь проверить существующие. Видимо обойти это невозможно, кроме как использованием обычного логона.
Есть еще хитрый параметр Апача, что-то типа MaxThreadsPerRequest, так вот он по умолчанию стоит 0 - неограничено, а когда ему присвоить значение, то он начинает следить за открытыми процессами и прибивает INACTIVE сессии в Оракле. Во как :)
 

Falc

Новичок
Olger
Вы немного говорите о разных вещах, поэтому у вас и возник спор.

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

В данной ситуации могу предложить следующие меры:
1. Отказатся от постоянных соединений.
2. Минимизировать кол-во процессов апача (еще можно поиграться с MaxRequestsPerChild)
3. запустить php как fastcgi
 

Olger

Guest
Всё правильно понял, так и есть.

В данной ситуации могу предложить следующие меры:
1. Отказатся от постоянных соединений.
2. Минимизировать кол-во процессов апача (еще можно поиграться с MaxRequestsPerChild)
3. запустить php как fastcgi
1. Все-таки долго проходит коннект и если пользователь активно "кликает", то задержки ощутимые.
2. Попробую, спасибо.
3. А что это даст?
 

Falc

Новичок
Olger
>>3. А что это даст?
Это даст то, что php будет запущен отдельным процессом(и) и как правило для обработки запросов кол-во процессов php требуется меньше нежели процессов апача, т.к. апач отдает еще статику, держит соединение с браузером и пр.
 
Сверху