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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Сессии

Сообщения:  [1-9] 

 
 автор: 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("Вас тут слишком много скопилось - подождите, пока место не освободится");
?>

   
 
 автор: 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());
?>

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

   
 
 автор: 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 



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

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

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

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

   
 
 автор: 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. Как задать максимальное кол-во сессий сцриптом? Или ето значение не критично? (в данном случае?)

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

   

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime