Почему так произошло Warning: session_start(): Failed to read session data: user

385
10 октября 2021, 15:50

Почему так произошло

( ! ) Warning: session_start(): Failed to read session data: user (path: /var/lib/php/sessions)
in /var/www/php.xxx/session/handlers.php on line 73
Call Stack
#  Time    Memory  Function           Location
1  0.0003  395424  {main}( )          .../handlers.php:0
2  0.0003  395832  session_start ( )  .../handlers.php:73

Если убрать session_start(); то ошибка пропадает

<?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));
  }
  // Сборка мусора - ищем все старые файлы и удаляем их
  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("test1");
  session_start();
  // Увеличиваем счетчик в сессии.
  $_SESSION['count'] = @$_SESSION['count'] + 1;
?>
<h2>Счетчик</h2>
В текущей сессии работы с браузером Вы открыли эту страницу
<?=$_SESSION['count']?> раз(а).<br>
Закройте браузер, чтобы обнулить счетчик.<br>
<a href="<?=$_SERVER['SCRIPT_NAME']?>" target="_blank">Открыть дочернее окно браузера</a>.
Answer 1

Это пример из книги PHP7. В подлиннике. Нашел ошибку. Проблема в функции ses_read. При первом запуске данного файла не существует. В этом случае функция возвращает 0 и сессия закрывается. Нам же нужно, чтобы функция ses_read возвращала пустую строку, если нет данных. Переписал функцию так:

function ses_read($key){
// Получаем имя файла и открываем файл
    $fname = ses_fname($key);
    $str = @file_get_contents($fname);
    return $str ? $str:"";
}

И все заработало.

READ ALSO
Leaflet карта с рисованием полигонов

Leaflet карта с рисованием полигонов

Может кто знает как подключить Leaflet карту с возможностью рисовать полигоны на карте и потом отправлять координаты на почту (второстепенно)У...

387
Как удалить элементы из XML-файла через PHP?

Как удалить элементы из XML-файла через PHP?

Как удалить элементы из XML-файла через PHP?

191
Fatal error: Uncaught Error: Class &#39;MatthiasMullie\Minify\CSS&#39; при развертывании проекта ocstore на open server

Fatal error: Uncaught Error: Class 'MatthiasMullie\Minify\CSS' при развертывании проекта ocstore на open server

В общем пишет что нет класса CSSphp хотя он есть и подключен вот так

103
Отправка двух форм одной кнопкой

Отправка двух форм одной кнопкой

Может кто подскажет как отправить две формы одной кнопкой SubmitНадо, чтобы после заполнения формы пользователем, они отправлялись на почту...

186