Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не удается сработаться с сессией

5.3K
24 февраля 2007 года
Bear Deon
82 / / 20.01.2007
Начал я тестить этот сценарий, придварительно отключив куки. При первом запуске создались две папки, как и полагается. Но вот файлы не создавались =((. При попытке обновить страницу, обновлялся тока идентификатор но счетчик сессий не увеличивался. При нажатие "Открыть дочернее окно браузера." открывалось подобающее окно, но счетчик все равно стоял как мертвый. При попытке убрать собак(@) из ses_write, браузер выдал такую ошибку:

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>
244
24 февраля 2007 года
UAS
2.0K / / 19.07.2006
Боже... Что вы сюда лезите?? Сообщение об ошибке читать пробовали?? Оно обычно о чём то сообщает, иначе зачем же его придумали??
271
24 февраля 2007 года
MrXaK
721 / / 31.12.2002
вообще ненастроенная винда очень проблематично относится к созданию пхп каких-бы то ни было временных файлов вне %windir%\Temp и т. п. путей
но в вашем случае надо обратить внимание на Fatal error, а точнее на отсутствие функции file_put_contents() в сборке...
5.3K
24 февраля 2007 года
Bear Deon
82 / / 20.01.2007
Я до этого создавал щетчики, создавал идентификаторы, спомощью РНР. Ну кароче они добавлялись автоматом в папку temp. Но блин вот этот не хочет ((
8
25 февраля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: Bear Deon
Я до этого создавал щетчики, создавал идентификаторы, спомощью РНР. Ну кароче они добавлялись автоматом в папку temp. Но блин вот этот не хочет ((


Ещё раз перечитай сообщение от UAS, потом сообщения об ошибках. И обрати внимание на слэши в пути: z:\home\localhost\www\test\dkoterov\session/sessiondata

244
25 февраля 2007 года
UAS
2.0K / / 19.07.2006
Чисто из интереса я вставил я эту функцию у себя на Денвере, чтоб проверить:
все пашет лишь одно:
Warning: Unknown(): A session is active. You cannot change the session module's ini settings at this time. in Unknown on line 0
И счетчик сам не пашет)))

Странно... Раньше не сталкивался. Пойду решение поищу.
244
25 февраля 2007 года
UAS
2.0K / / 19.07.2006
Походу нашел ошибку.
http://bugs.php.net/bug.php?id=26005
Английский я вролде знаю, так что я понял одно:
вообщем вкратце это баг системы, которая заключается в системе проверки session_status. Причина: читает не инициализированную память в новом потоке ps_globals (хз что такое)), конструктор этой функции имеет NULL значение, ибо вызывается до её иницализации. Чтоб всё работало надо пропатчить следующим кодом:
Код:
*** 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
256
25 февраля 2007 года
foxweb
1.0K / / 27.07.2005
file_put_contents() - функция доступна начиная с PHP 5
5.3K
26 февраля 2007 года
Bear Deon
82 / / 20.01.2007
Решил перейти с РНР 4 на РНР 5. Запустил и все работает. Спасибо foxweb+1.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог