|
|
|
| Доброго всем время суток,
Новенькие мы тут, в поросячем восторге от обилия инфы.
Но ответ по поиску на свой вопрос не нашла. Надеюсь, что кто-то подскажет.
Сессии регистрируются и со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. Как задать максимальное кол-во сессий сцриптом? Или ето значение не критично? (в данном случае?)
Спасибо зараннее за помошь | |
|
|
|
|
|
|
|
для: zvik
(06.07.2005 в 02:46)
| | O_o
И это работает?
Знаете, для того, что бы понять как работает скрипт, такого куска маловато... | |
|
|
|
|
|
|
|
для: 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
|
А ето работает? :)
в обшем-то набор стандартный, я поетому и не выложила весь скрипт.
хост-один; юзер, пароль и база данных у них разная | |
|
|
|
|
|
|
|
для: zvik
(06.07.2005 в 03:18)
| | Немного не понятно:
Все функционировало до тех пор, пока не пошло тестирование двух Homepage на одном веб-сервере(virtualhost один, тестсервера разные). Обе страницы имеют одинаковую структуру. Handler для сессий одинаковый, но сохранен под разным именем в разных структурах и работает с разными базами данных.
|
| |
|
|
|
|
|
|
|
для: isset
(06.07.2005 в 03:27)
| | >Немного не понятно:
>
>Все функционировало до тех пор, пока не пошло тестирование
>двух Homepage на одном веб-сервере(virtualhost один,
>тестсервера разные). Обе страницы имеют одинаковую
>структуру. Handler для сессий одинаковый, но сохранен под
>разным именем в разных структурах и работает с разными
>базами данных.
>
|
мне самой непонятно.
Но сессия и ее переменные должны вноситься с каждого проекта в свою базу данных (база данных, юзер, пароль для связи с базой данных у каждого проекта свой; хост-один)
Проекты тестируются на одном веб-сервере. Сессии путают базы данных и пишут переменные то туда, то туда. До вчерашнего дня все было ок :( | |
|
|
|
|
|
|
|
для: zvik
(06.07.2005 в 03:42)
| | Трудно будет определить почему так, наверно потребуется весь код | |
|
|
|
|
|
|
|
для: isset
(06.07.2005 в 03:57)
| | ну хорошо, а на ети два вопроса есть ответы?
2. Как функционирует handler? Может один handler обслуживать несколько Homepage при условии, что сессии пишутся в одну базу данных?
3. Как задать максимальное кол-во сессий сцриптом? Или ето значение не критично? (в данном случае?)
А код чего нужен? Код handler'a я написала | |
|
|
|
|
|
|
|
для: 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)
| | 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("Вас тут слишком много скопилось - подождите, пока место не освободится");
?>
|
| |
|
|
|