Поддержание состояния между вкладками браузера в PHP - PullRequest
0 голосов
/ 28 июля 2010

Я создаю веб-приложение, которое позволяет пользователям выполнять запрос к одной из двух баз данных.Им разрешено отправлять только 1 запрос к каждой базе данных одновременно.В настоящее время я устанавливаю $ _SESSION ['runningAdvancedQuery'] (например), чтобы сообщить мне, выполняют ли они запрос.Это сделано для того, чтобы кто-то не мог открыть вторую вкладку браузера и снова зайти на ресурс.Он отлично работает, за исключением ...

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

Ответы [ 3 ]

1 голос
/ 29 июля 2010
<?php
ignore_user_abort(true);

//if session variable is not set
    //set session variable
    //run query
    //unset session variable
//else
    //show error: "your other query isn't finished yet"

?> 
1 голос
/ 29 июля 2010

Вместо установки $_SESSION['runningAdvancedQuery']; в значение true вы можете установить его на выход SELECT CONNECTION_ID(); и проверить show processlist;, работает ли он по-прежнему.Это будет дополнением к другим ответам: особенно при использовании постоянных соединений другие процессы могут использовать connection_id.

Как один и тот же пользователь, вам всегда разрешено видеть свои собственные процессы.Таким образом, чтобы объединить другие проверки:

  1. Сохранение метки времени, идентификатора соединения и фактического sql-запроса (я бы удалил все пробелы и произвел приведение к верхней или нижней строке, чтобы избежать небольших различий в представлении ввопроса).
  2. Конечно, используйте функциональность ignore_user_abort (), выполните session_write_close() перед запросом, перезапустите сеанс и установите его как завершенный после запроса.
  3. При проверке на наличиепри выполнении запроса проверьте, присутствует ли
    • идентификатор соединения.
    • Отметка времени + секунды, в течение которых выполняется запрос, достаточно близки к текущему времени.
    • Запрос (нижний регистр, зачеркнутый пробел) - это примерно тот же запрос, который был запрошен (используйте SHOW FULL PROCESSLIST;, чтобы получить весь запрос).

При желании сделайте еще один шаг и дайте людямвозможность KILL QUERY <connection_id>; (только если все предыдущие 3 проверки дали положительный результат).

1 голос
/ 28 июля 2010

Установите это значение, например, не в 1, а в unix timestamp, и выполните проверку по comprasion last-query-timestamp до now, устанавливая некоторую разницу во времени, которая должна пройти для выполнения следующего запроса. Запомните, чтобы установить безопасное значение времени блокировки - наибольшее время, в течение которого может быть выполнен запрос. Если пользователь закрывает свою вкладку, через короткое время он будет «разблокирован».

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