Как предотвратить тайм-аут сеанса PHP во время длинного вызова ajax?

У меня есть сайт интрасети, который должен выполнять сложные и длительные операции MySQL, и мне нужно найти способ предотвратить возникновение тайм-аута PHP-сессии во время этого процесса.

Страница PHP содержит все данные формы, которые пользователь может заполнить. Когда пользователь нажимает кнопку отправки, Ajax-вызов завершается с этими данными, и Ajax-вызов ожидает завершения операции, а затем уведомляет пользователя о результате. Я должен предотвратить тайм-аут сайта во время этого звонка.

Моей первой мыслью было использовать setInterval и запускаю второй ajax-вызов каждые 10 секунд для страницы, которая загружает только сеанс и обновляет некоторые данные в нем, но во время первого теста я заметил, что на второй вызов и любые последующие вызовы не отвечали, пока первый не завершился ( Я использовал PHP sleep(20) по моему первый звонок имитировал долгое ожидание). Мой сценарий запустил несколько новых вызовов AJAX (которые я наблюдал в Firebug), но все они ждали, пока первый вызов не будет завершен — до этого не было никакого ответа от сервера. Я думаю, что сервер просто игнорирует второй вызов от того же клиента, пока первый не будет сделан. Я сомневаюсь, что Apache перестанет принимать звонки, потому что PHP ждет sleep заканчивать…

Во время моего исследования я еще не выяснил, какое событие используется для определения времени ожидания сеанса. Одна страница утверждала, что простое использование Ajax для загрузки изображения продлит время сеанса, но мне это не кажется правильным, так как это не связано с PHP — кроме того, если сервер не принимает второе соединение, оно выиграло ‘ т работа. На другой странице говорилось, что это связано с тем, когда пишутся данные переменных Session, но опять же, это также не соответствует моему опыту, так как у меня много страниц, которые пишут во время входа в систему, но не после этого.

Итак, мой вопрос состоит из двух частей:

  1. Какие именно события должны произойти или не произойти в течение определенного периода времени ожидания, чтобы сессия считалась «тайм-аутом»? Я предполагаю, что здесь задействованы два таймера — тайм-аут cookie в браузере и тайм-аут Session в PHP, но это всего лишь предположения, и я хотел бы услышать об этом от экспертов.

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


ОК, я чувствую необходимость уточнить здесь.

Я пытаюсь выяснить, что происходит за кулисами на сервере, когда задействован тайм-аут сеанса PHP.

Например: если у меня есть сценарий, который занимает 1 час для создания файла PDF, но время ожидания установлено на 30 минут, будет ли время ожидания срабатывать, потому что пользователь / браузер / мышь не активен, или время ожидания НЕ будет запущено, потому что скрипт еще работает?

Я хотел бы знать, что именно происходит — какие события (создаваемые пользователем и сервером) происходят при продлении сеанса до его истечения?

Вы можете рассказать мне о настройках PHP весь день, и я все еще не буду знать, что происходит.

Давайте начнем с основ, насколько я их понимаю:

Типичный сеанс может состоять из файла сеанса на сервере, идентификатора сеанса и часто файла cookie в браузере клиента, который содержит идентификатор сеанса и временную метку.

Я предполагаю, что файл сеанса на сервере или некоторый индекс файлов сеанса также содержит временную метку.

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

Это тип информации, которую я ищу здесь.

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

0

Решение

Во-первых, вы должны знать, что пока пользователь активен (просматривая вашу интранет по классической ссылке или по ajax, потому что сервер apache не может различить), ваши сеансы все еще живы.

Если пользователь через некоторое время станет неактивным или отключится от вашей интрасети, то минимальное время, в течение которого сеанс будет уничтожен, будет равным значению параметра, заданного в php.ini:

session.gc_maxlifetime= TIME_IN_SECONDS

Чтобы правильно настроить время ожидания сеанса, вы должны настроить эти 3 параметра:

; Defines the probability that the 'garbage collection' process is started
; on every session initialization. The probability is calculated by using
; gc_probability/gc_divisor. Where session.gc_probability is the numerator
; and gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.gc-probability
session.gc_probability=PROBA_CHANGEME

; Defines the probability that the 'garbage collection' process is started on every
; session initialization. The probability is calculated by using the following equation:
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
; session.gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request. Increasing this value to 1000 will give you
; a 0.1% chance the gc will run on any give request. For high volume production servers,
; this is a more efficient approach.
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
; http://php.net/session.gc-divisor
session.gc_divisor=DIVISOR_CHANGEME

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime= MAX_LIFE_TIME_CHANGEME
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]