*** php-4.3.4/ext/session/session.c Wed Oct 8 12:25:39 2003
--- php-4.3.4-n/ext/session/session.c Tue Dec 9 11:36:24 2003
***************
*** 1543,1548 ****
--- 1543,1556 ----
}
}
+ static void php_session_init_globals(php_ps_globals *ps_globals
TSRMLS_DC)
+ {
+ ps_globals->id = NULL;
+ ps_globals->session_status = php_session_none;
+ ps_globals->mod_data = NULL;
+ ps_globals->http_session_vars = NULL;
+ }
+
static void php_rinit_session_globals(TSRMLS_D)
{
PS(id) = NULL;
***************
*** 1618,1624 ****
#ifdef ZTS
php_ps_globals *ps_globals;
! ts_allocate_id(&ps_globals_id, sizeof(php_ps_globals), NULL, NULL);
ps_globals = ts_resource(ps_globals_id);
#endif
--- 1626,1632 ----
#ifdef ZTS
php_ps_globals *ps_globals;
! ts_allocate_id(&ps_globals_id, sizeof(php_ps_globals),
(ts_allocate_ctor) php_session_init_globals, NULL);
ps_globals = ts_resource(ps_globals_id);
#endif
не удается сработаться с сессией
Warning: mkdir(z:\home\localhost\www\test\dkoterov\session/sessiondata) [function.mkdir]: File exists in z:\home\localhost\www\test\dkoterov\session\handlers.php on line 24
Warning: mkdir(z:\home\localhost\www\test\dkoterov\session/sessiondata/test2) [function.mkdir]: File exists in z:\home\localhost\www\test\dkoterov\session\handlers.php on line 25
Fatal error: Call to undefined function: file_put_contents() in z:\home\localhost\www\test\dkoterov\session\handlers.php on line 27
Чтобы это значило. У меня стоит последний денвер. Ну и Тока что РНР5 еще поставил из расширений, в виде модуля CGI. Так ее нельзя подружить с PHP4.
Код:
<?php ## Переопределение обработчиков сессии.
// Возвращает полное имя файла временного хранилища сессии.
// В случае, если нужно изменить тот каталог, в котором должны
// храниться сессии, достаточно поменять только эту функцию
function ses_fname($key) {
return dirname(__FILE__)."/sessiondata/".session_name()."/$key";
}
// Заглушки - эти функции просто ничего не делают
function ses_open($save_path, $ses_name) { return true; }
function ses_close() { return true; }
// Чтение данных из временного хранилища
function ses_read($key) {
// Получаем имя файла и открываем файл.
$fname = ses_fname($key);
return @file_get_contents($fname);
}
// Запись данных сессии во временное хранилище
function ses_write($key, $val) {
$fname = ses_fname($key);
// Сначала создаем все каталоги (в случае, если они уже есть,
// игнорируем сообщения об ошибке)
@mkdir(dirname(dirname($fname)), 0777);
@mkdir(dirname($fname), 0777);
// Создаем файл и записываем в него данные сессии.
@file_put_contents($fname, $val);
return true;
}
// Вызывается при уничтожении сессии
function ses_destroy($key) {
return @unlink(ses_fname($key));
echo "сессия удалена";
}
// Сборка мусора - ищем все старые файлы и удаляем их
function ses_gc($maxlifetime) {
$dir = ses_fname(".");
// Получаем доступ к каталогу текущей группы сессии.
foreach (glob("$dir/*") as $fname) {
// Файл слишком старый?
if (time() - filemtime($fname) >= $maxlifetime) {
@unlink($fname);
continue;
}
}
// Если директория непуста, она не удалится - будет предупреждение.
// Мы его подавляем. Если же пуста - удалится, что нам и нужно.
@rmdir($dir);
return true;
}
// Регистрируем наши новые обработчики
session_set_save_handler(
"ses_open", "ses_close",
"ses_read", "ses_write",
"ses_destroy", "ses_gc"
);
// Для примера подключаемся к группе сессий test.
session_name("test2");
session_start();
$t=session_id();
// Увеличиваем счетчик в сессии.
$_SESSION['count'] = @$_SESSION['count'] + 1;
?>
<h2>Счетчик</h2>
В текущей сессии работы с браузером Вы открыли эту страницу
<?=$_SESSION['count']?> раз(а).<br>
Закройте браузер, чтобы обнулить счетчик.<br>
<a href="<?=$_SERVER['SCRIPT_NAME']?>" target="_blank">Открыть дочернее окно браузера</a>.
<br>
<blockquote>
<b>Номер сессии:</b> <h2><?=$t?></h2>
</blockquote>
// Возвращает полное имя файла временного хранилища сессии.
// В случае, если нужно изменить тот каталог, в котором должны
// храниться сессии, достаточно поменять только эту функцию
function ses_fname($key) {
return dirname(__FILE__)."/sessiondata/".session_name()."/$key";
}
// Заглушки - эти функции просто ничего не делают
function ses_open($save_path, $ses_name) { return true; }
function ses_close() { return true; }
// Чтение данных из временного хранилища
function ses_read($key) {
// Получаем имя файла и открываем файл.
$fname = ses_fname($key);
return @file_get_contents($fname);
}
// Запись данных сессии во временное хранилище
function ses_write($key, $val) {
$fname = ses_fname($key);
// Сначала создаем все каталоги (в случае, если они уже есть,
// игнорируем сообщения об ошибке)
@mkdir(dirname(dirname($fname)), 0777);
@mkdir(dirname($fname), 0777);
// Создаем файл и записываем в него данные сессии.
@file_put_contents($fname, $val);
return true;
}
// Вызывается при уничтожении сессии
function ses_destroy($key) {
return @unlink(ses_fname($key));
echo "сессия удалена";
}
// Сборка мусора - ищем все старые файлы и удаляем их
function ses_gc($maxlifetime) {
$dir = ses_fname(".");
// Получаем доступ к каталогу текущей группы сессии.
foreach (glob("$dir/*") as $fname) {
// Файл слишком старый?
if (time() - filemtime($fname) >= $maxlifetime) {
@unlink($fname);
continue;
}
}
// Если директория непуста, она не удалится - будет предупреждение.
// Мы его подавляем. Если же пуста - удалится, что нам и нужно.
@rmdir($dir);
return true;
}
// Регистрируем наши новые обработчики
session_set_save_handler(
"ses_open", "ses_close",
"ses_read", "ses_write",
"ses_destroy", "ses_gc"
);
// Для примера подключаемся к группе сессий test.
session_name("test2");
session_start();
$t=session_id();
// Увеличиваем счетчик в сессии.
$_SESSION['count'] = @$_SESSION['count'] + 1;
?>
<h2>Счетчик</h2>
В текущей сессии работы с браузером Вы открыли эту страницу
<?=$_SESSION['count']?> раз(а).<br>
Закройте браузер, чтобы обнулить счетчик.<br>
<a href="<?=$_SERVER['SCRIPT_NAME']?>" target="_blank">Открыть дочернее окно браузера</a>.
<br>
<blockquote>
<b>Номер сессии:</b> <h2><?=$t?></h2>
</blockquote>
Боже... Что вы сюда лезите?? Сообщение об ошибке читать пробовали?? Оно обычно о чём то сообщает, иначе зачем же его придумали??
но в вашем случае надо обратить внимание на Fatal error, а точнее на отсутствие функции file_put_contents() в сборке...
Я до этого создавал щетчики, создавал идентификаторы, спомощью РНР. Ну кароче они добавлялись автоматом в папку temp. Но блин вот этот не хочет ((
Цитата: Bear Deon
Я до этого создавал щетчики, создавал идентификаторы, спомощью РНР. Ну кароче они добавлялись автоматом в папку temp. Но блин вот этот не хочет ((
Ещё раз перечитай сообщение от UAS, потом сообщения об ошибках. И обрати внимание на слэши в пути: z:\home\localhost\www\test\dkoterov\session/sessiondata
все пашет лишь одно:
Warning: Unknown(): A session is active. You cannot change the session module's ini settings at this time. in Unknown on line 0
И счетчик сам не пашет)))
Странно... Раньше не сталкивался. Пойду решение поищу.
http://bugs.php.net/bug.php?id=26005
Английский я вролде знаю, так что я понял одно:
вообщем вкратце это баг системы, которая заключается в системе проверки session_status. Причина: читает не инициализированную память в новом потоке ps_globals (хз что такое)), конструктор этой функции имеет NULL значение, ибо вызывается до её иницализации. Чтоб всё работало надо пропатчить следующим кодом:
Код:
file_put_contents() - функция доступна начиная с PHP 5
Решил перейти с РНР 4 на РНР 5. Запустил и все работает. Спасибо foxweb+1.:)