2010-07-28 3 views
0

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

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

+0

Когда вы очищаете $ _SESSION ['runningAdvancedQuery']? – ankitjaininfo

+0

Вызов AJAX производится из браузера, чтобы инициировать запрос. Когда это будет сделано, будет сделан еще один вызов AJAX для извлечения и отображения результатов. Флаг не отображается после показа результатов. – Derek

+0

Выполняется ли запрос в потоке? или остается ожидающий вызов Ajax. – ankitjaininfo

ответ

1

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

+0

Это может сработать, но я вижу, как клиент жалуется на необходимость ждать. Кроме того, время запроса сильно варьируется. – Derek

+0

может попытаться обнаружить закрывающий вклад: http://www.php.net/manual/en/features.connection-handling.php –

+0

Это был скорее комментарий, чем фактический ответ.Эта ссылка, которую вы предоставили, привела меня к этому: «в следующий раз, когда ваш скрипт попытается вывести что-то, PHP обнаружит, что соединение было прервано, а функция выключения называется« Выполнение операций в функции выключения что мне нужно (тем более, что сценарий не заканчивается до тех пор, пока запрос не завершится). – Derek

1
<?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

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

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

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

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