Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как можно оптимизировать запрос?
 
 автор: Skyonex_   (23.08.2006 в 16:15)   письмо автору
 
 

Подскажите пожалуйста как можно упростить/ускорить выполнение следующего кода не прибегая к вызову функции (setUserToOffline) из функции и не создавая массива из данных запроса для последующего while обхода:


//Удаление старых сессий
    function GC($maxlifetime)
    {        
        $query="delete from wsl_sessions where session_expire<NOW() - INTERVAL '10' MINUTE";
        $this->mydb->Query($query);
        
        $query="select user_id from wsl_online_users where session_expire<NOW() - INTERVAL '10' MINUTE";
        $this->mydb->Query($query);
        
        while($row=$this->mydb->FetchArray())
        {
            $this->setUserToOffline($this->mydb,$row[0]);
        }
        
        $query="delete from wsl_online_users where session_expire<NOW() - INTERVAL '10' MINUTE";
        $this->mydb->Query($query);
        
        return true;
    }

//Перевод пользователя в оффлайн где online - Статус, lastvisit - последнее посещение DATETIME
    function setUserToOffline($mydb,$user_id)
    {
        $query="update wsl_users set lastvisit=NOW(),online=0 where id=$user_id";
        $mydb->Query($query);
    }

   
 
 автор: cheops   (23.08.2006 в 16:47)   письмо автору
 
   для: Skyonex_   (23.08.2006 в 16:15)
 

Можно поступить следующим образом
<?php 
//Удаление старых сессий 
    
function GC($maxlifetime
    {         
        
$query="delete from wsl_sessions where session_expire<NOW() - INTERVAL '10' MINUTE"
        
$this->mydb->Query($query); 
         
        
$query="select user_id from wsl_online_users where session_expire<NOW() - INTERVAL '10' MINUTE"
        
$this->mydb->Query($query); 

        while(
$row=$this->mydb->FetchArray()) $temp[] = $row[0];
        if(!empty(
$temp))
        {
          
$query "update wsl_users set lastvisit=NOW(),online=0 
                    where id IN ("
.implode(",",$temp).")"
          
$mydb->Query($query); 
        }
         
        
$query="delete from wsl_online_users where session_expire<NOW() - INTERVAL '10' MINUTE"
        
$this->mydb->Query($query); 
         
        return 
true
    } 
?>

Т.е. смысл в том, что сформировать запрос вида
UPDATE wsl_users SET ... WHERE id IN (1,4,6,8,38,104)

Если полю lastvisit назначить тип TIMESTAMP, то можно не указывать lastvisit=NOW(), это поле будет автоматически обновляться при каждом выполнении оператора UPDATE.

   
 
 автор: Skyonex_   (23.08.2006 в 16:53)   письмо автору
 
   для: cheops   (23.08.2006 в 16:47)
 

Отлично! Спасибо большое! Сейчас попробую.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования