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

Форум PHP

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

 

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

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

тема: Сессии
 
 автор: zvik   (06.07.2005 в 02:46)   письмо автору
 
 

Доброго всем время суток,

Новенькие мы тут, в поросячем восторге от обилия инфы.

Но ответ по поиску на свой вопрос не нашла. Надеюсь, что кто-то подскажет.

Сессии регистрируются и соhраняют свои переменные в MySQL.


[code]

php.ini

session_save.path=user




<?php 
session_set_save_handler 
("s_open""s_close",  "s_read",  "s_write",  "s_destroy""s_gc"); 

 
/* Database connection*/ ...
    function 
s_open($path$name) { 
       }
//func
 
 /* Session close*/ 
    
function s_close() { 
        return 
TRUE
    } 

  
/* Session open*/ 
    
function s_read($sesID) { 
  
        }
//func 

    /* Session write*/ 
    
function s_write($sesID$data) { 
 
    }
//func 

    /* Session destroy*/
    
function s_destroy($sesID) { 

    }
//func 
 
    /* Garbage collection*/  
    
function s_gc($max_lifetime) { 
  
    }
//func 



как инклюд размешаю на всех страницах где должна стартовать сессия. Все функционировало до тех пор, пока не пошло тестирование двух Homepage на одном веб-сервере(virtualhost один, тестсервера разные). Обе страницы имеют одинаковую структуру. Handler для сессий одинаковый, но сохранен под разным именем в разных структурах и работает с разными базами данных.

Но при одновременной работе с разными страницами, handler начинают путать базы данных и писать данные то в один, то в другой банк. Критическое число пользователей- 3.

1. Дело в настройках Апачи?
2. Как функционирует handler? Может один handler обслуживать несколько Homepage при условии, хто сессии пишутся в одну базу данных?
3. Как задать максимальное кол-во сессий сцриптом? Или ето значение не критично? (в данном случае?)

Спасибо зараннее за помошь

   
 
 автор: Akira   (06.07.2005 в 02:53)   письмо автору
 
   для: zvik   (06.07.2005 в 02:46)
 

O_o
И это работает?
Знаете, для того, что бы понять как работает скрипт, такого куска маловато...

   
 
 автор: zvik   (06.07.2005 в 03:18)   письмо автору
 
   для: Akira   (06.07.2005 в 02:53)
 




<?php 
session_set_save_handler 
("s_open""s_close",  "s_read",  "s_write",  "s_destroy""s_gc"); 

        
$sesTable"sessions"
    
/*   */ 
        
$dbHost "host";
        
$dbDBase "db"
        
$dbUser "user";
        
$dbPass "pass";
    
/*   */ 
    
function s_open($path$name) { 
    
/*Database connection*/ 
     
global  $dbHost,$dbDBase,$dbUser,$dbPass;
     
$mysql_connect mysql_connect($dbHost,$dbUser,$dbPass);  
     
$mysql_db mysql_select_db ($dbDBase); 
        if (!
$mysql_connect || !$mysql_db) { 
            return 
FALSE
        } else { 
            return 
TRUE
        }
//if 
    
}//func
    /*  Session close*/ 
    
function s_close() { 
        return 
TRUE
    } 

    
/* Session open */ 
    
function s_read($sesID) { 
     global 
$sesTable;
        
$session_sql "SELECT * FROM $sesTable WHERE ses_id = '$sesID'"
        
$session_res mysql_query($session_sql) or die(mysql_error()); 
        if (!
$session_res) { 
            return 
''
        }
//if
//echo "trace_3";
        
$session_num = @mysql_num_rows ($session_res); 
        if (
$session_num 0) { 
            
$session_row mysql_fetch_assoc($session_res); 
            
$ses_data $session_row["ses_value"];  
            return 
$ses_data
        } else { 
            return 
''
        }
//if
    
}//func 

    /* Session write*/ 
    
function s_write($sesID$data) { 
      global 
$sesTable;
      
$this->data=$daten;
        
$ses_life get_cfg_var("session.gc_maxlifetime");//strtotime("-5 minutes");
        
$ses_expiration time() + $ses_life;
//        echo $ses_expiration;
        
$strTime strftime("%H:%M:%S %d-%m-%Y",time()); 
                
$session_sql "INSERT INTO $sesTable (ses_id, ses_start, ses_time, ses_value) VALUES ('$sesID', '$strTime',".$ses_expiration.", '$data')"
echo 
$session_sql;
        
$session_resins = @mysql_query ($session_sql); //or die(mysql_error())
           
if (!$session_resins) {  
            
$session_sql "UPDATE  $sesTable SET ses_time=" $ses_expiration  
                      
", ses_value='$data' WHERE ses_id='$sesID'"
              
$session_resup mysql_query ($session_sql);
            if (!
$session_resup && !$session_resins){ 
                return 
FALSE
               }
//if
            
elseif (mysql_affected_rows ()){ 
                return 
TRUE;
            } else { 
            return 
TRUE; }//elseif
        
}//if
    
}//func 

    /*Session desrtoy  */
    
function s_destroy($sesID) { 
      global 
$sesTable;
//echo "trace_5";
        
$session_sql "DELETE FROM $sesTable WHERE ses_id = '$sesID'"
echo 
$session_sql;
        
$session_resdel mysql_query ($session_sql) or die(mysql_error());
        
mysql_query("OPTIMIZE TABLE $sesTable"); 
        if (!
$session_resdel) { 
            return 
FALSE
        }         else { 
            return 
TRUE
        }
//if 
    
}//func 
 
    /* Garbage collection*/  
    
function s_gc($max_lifetime) { 
      global 
$sesTable;
//echo "trace_6";
        
$session_sql "DELETE FROM $sesTable WHERE ses_time < " time(); 
        
$session_res = @mysql_query ($session_sql); 
        
mysql_query("OPTIMIZE TABLE $sesTable"); 
        if (!
$session_res) { 
            return 
FALSE
        }         else { 
            return 
TRUE
        }
//if 
    
}//func 



А ето работает? :)
в обшем-то набор стандартный, я поетому и не выложила весь скрипт.

хост-один; юзер, пароль и база данных у них разная

   
 
 автор: isset   (06.07.2005 в 03:27)   письмо автору
 
   для: zvik   (06.07.2005 в 03:18)
 

Немного не понятно:

Все функционировало до тех пор, пока не пошло тестирование двух Homepage на одном веб-сервере(virtualhost один, тестсервера разные). Обе страницы имеют одинаковую структуру. Handler для сессий одинаковый, но сохранен под разным именем в разных структурах и работает с разными базами данных.

   
 
 автор: zvik   (06.07.2005 в 03:42)   письмо автору
 
   для: isset   (06.07.2005 в 03:27)
 

>Немного не понятно:
>

>Все функционировало до тех пор, пока не пошло тестирование
>двух Homepage на одном веб-сервере(virtualhost один,
>тестсервера разные). Обе страницы имеют одинаковую
>структуру. Handler для сессий одинаковый, но сохранен под
>разным именем в разных структурах и работает с разными
>базами данных.
>


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

Проекты тестируются на одном веб-сервере. Сессии путают базы данных и пишут переменные то туда, то туда. До вчерашнего дня все было ок :(

   
 
 автор: isset   (06.07.2005 в 03:57)   письмо автору
 
   для: zvik   (06.07.2005 в 03:42)
 

Трудно будет определить почему так, наверно потребуется весь код

   
 
 автор: zvik   (06.07.2005 в 04:24)   письмо автору
 
   для: isset   (06.07.2005 в 03:57)
 

ну хорошо, а на ети два вопроса есть ответы?

2. Как функционирует handler? Может один handler обслуживать несколько Homepage при условии, что сессии пишутся в одну базу данных?
3. Как задать максимальное кол-во сессий сцриптом? Или ето значение не критично? (в данном случае?)

А код чего нужен? Код handler'a я написала

   
 
 автор: cheops   (06.07.2005 в 11:43)   письмо автору
 
   для: zvik   (06.07.2005 в 04:24)
 

Handler судя по всему не может сделать различие между двумя открытыми соединениями с двумя базами данных - берётся последний, полученный mysql_connect() - от сюда и проблемы. Я думаю они решатся, если помещать записи в одну базу данных. В этом случае значение $mysql_db будет для всех одно и тоже, иначе, если требуется всё-таки две базы данных нужно как-то различать значения $mysql_db для каждой из базы данных и передавать его в качестве второго параметра функции mysql_query
<?php
 $session_res 
mysql_query($session_sql,$mysql_db) or die(mysql_error());
?>

Это можно сделать поместив значения этих дескрипторов в глобальный массив, но это немного усложнит код...

   
 
 автор: cheops   (06.07.2005 в 11:50)   письмо автору
 
   для: zvik   (06.07.2005 в 04:24)
 

3. Хм... а так ли это значение необходимо и как должен реагировать скрипт, когда будет превышено максимальное значение? В любом случае в функции s_write() придётся поставить проверку по числу записей
<?php
  $session_count 
"SELECT COUNT(*) FROM $sesTable";
  
$cnt mysql_query($session_count);
  if(!
$cnt) exit(mysql_error());
  
$total mysql_result($cnt,0);
  
// Если число сессий перевалило за 5000 останавливаем работу текущего
  // пользователя
  
if($total 5000) exit("Вас тут слишком много скопилось - подождите, пока место не освободится");
?>

   
Rambler's Top100
вверх

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