Apache php session path

Работа с сессиями в PHP

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

Принцип работы сессий: сервер выдает браузеру уникальный идентификатор, и просит передавать его с каждым запросом. Передача происходит стандартными способами, либо через куки, либо через переменные POST/GET.

Идентификатор сессии — это обычная переменная, по умолчанию ее имя — PHPSESSID. Можно изменить директивой session.name в php.ini.

На сервере за передачу информации о сессиях отвечают две настройки в php.ini:

  • session.use_cookies — если равно 1, то PHP передает идентификатор в куках, если 0 — то нет.
  • session.use_trans_sid — если равно 1, то PHP передает его, добавляя к URL и формам, если 0 — то нет.

Соответственно, если включена только первая настройка и браузер отдает куки, то идентификатор передается через них, если не отдает, то сессия обнуляется при каждом запросе.

Если включена только вторая, то PHP дописывает к каждой относительной ссылке и к каждой форме передачу идентификатора сессии, примерно так:

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

Вся информация о сессии храниться в глобальном массиве $_SESSION.

Запись данных в сессию работает так:

// запускаем новую, либо возобновляем существующую сессию session_start(); // передаем в массив сессий переменную с названием test и данными Hello world $_SESSION['test']='Hello world!'; // если в качестве имени переменной хотим использовать значение переменной - // пишем без кавычек или используем двойные $var = name; $_SESSION["$var"]='Hello world!';
// обычное условие проверки if(!$_SESSION[$var]){ echo "session variable is empty" } // можно получить id текущей сессии или ее имя session_id(); session_name(); 

Удаление переменных из сессии:

unset($_SESSION[$var]); // Если register_globals = on, надо добавить строку session_unregister($var); //Если надо сбросить все переменные сессии session_unset();

Для закрытия сессии используется функция:

Данные из глобального массива $_SESSION php хранит либо в файлах, путь к которым указывается в session.save_path в php.ini, либо в БД.

Для управления HTTP-заголовками отвечающими за кэш, используется функция session_cache_limiter(). Установка nocache, например, отменяет кэширование на стороне клиента.

Во время начала запроса режим кеширования сбрасывается до значения по умолчанию, хранящегося в session.cache_limiter. Таким образом, вам необходимо вызывать session_cache_limiter() для каждого запроса (перед тем, как вызвана функция session_start()).

Значение Посылаемый заголовок
public Expires: (когда-нибудь в будущем, в зависимости от session.cache_expire)
Cache-Control: public, max-age=(когда-нибудь в будущем, в зависимости от session.cache_expire)
Last-Modified: (временная метка последнего сохранения сессии)
private_no_expire Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем)
Last-Modified: (временная метка последнего сохранения сессии)
private Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем)
Last-Modified: (временная метка последнего сохранения сессии)
nocache Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Возможные проблемы

  • Вспомогательными вещами, вроде кодирования данных и удаления старых сессий, php занимается сам, и если возникает проблема с удалением информации о них, проверьте в php.ini строку session.gc_probability. Для того чтобы php мог самостоятельно удалять файлы сессий, должно быть установлено 1.
  • Warning: open(/tmp\sess_SID, O_RDWR) failed: No such file or directory (2) in full_script_path on line number
    или
    Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp))
    в этом случае надо в php.ini, в параметре session.save_path, указать правильный каталог, который существует и доступен для записи (не забудьте перезагрузить апач).
  • Warning: Cannot send session cookie — headers already sent.
    Warning: Cannot send session cache limiter — headers already sent.
    Warning: Cannot add header information — headers already sent.
    эти ошибки возникают в том случае, если браузер ранее уже получил заголовки для страницы. Функции header(), session_start(), setcookie() и вся логика, которая их вызывает, должны обрабатываться до любого вывода в браузер.
  • Если давать переменным скрипта имена, совпадающие с индексами массива $_SESSION, возможны проблемы. При register_globals=on значения будут перезаписывать друг друга. При register_globals=off, в случае, если в скрипте есть переменная сессии не имеющая значения, и глобальная переменная с тем же именем, появится ошибка «Your script possibly relies on a session side-effect which existed until PHP 4.2.3.». Для предотвращения этой ошибки, надо инициализировать переменные перед использованием или проверять на существование, и стараться не давать глобальным переменным имена, совпадающие с индексами массива $_SESSION.
  • Если вы используете перенаправление через header или навигацию с помощью JavaScript, PHP не пропишет необходимый идентификатор, т.к. он работает только со статичными ссылками. В этом случае надо проставлять идентификатор самостоятельно:
header("Location: /script.php?".session_name().'='.session_id());

Более детальный обзор можно найти на сайте phpfaq.ru

Источник

Расположение файлов сессий в Apache / PHP

Значение по умолчанию session.save_path установлено на «» , которое будет оцениваться в вашем системном каталоге temp. См. Этот комментарий в https://bugs.php.net/bug.php?id=26757:

Новый по умолчанию для save_path в предстоящей версии release (sic) будет пустой строкой, которая заставляет пробный каталог проверяться.

Чтобы найти текущий путь сохранения сеанса, вы можете использовать

Обратитесь к этому ответу, чтобы узнать, что такое временный путь, когда эта функция возвращает пустую строку.

Расположение установлено, а не «по умолчанию» в Ubuntu 10.10. Чистая сборка PHP может дать вам это, но не во всех сборках Debian / Ubuntu, которые я использовал. Вопрос об оригинале относится к Ubuntu 10.10. Итак, просто посмотрите в командной строке за последний комментарий (или мой ответ), так как расположение может отличаться от ‘default’ / blank / tmp в зависимости от используемого дистрибутива Linux.

Предупреждение!! Я думаю, что запуск php -r ‘echo session_save_path (), «\ n»;’ как упоминалось выше, будет использоваться другой файл php.ini (возможно, /etc/php/7.0/cli/php.ini вместо /etc/php/7.0/apache2/php.ini), и поэтому может иметь другое значение » session.save_path»

@Magmatic верен, есть два файла php.ini , php_info() сообщит вам, какой из них используется во время текущего eval, и locate php.ini , чтобы найти их.

Сначала проверьте значение session.save_path с помощью ini_get(‘session.save_path’) или phpinfo() . Если это не пусто, тогда он покажет, где хранятся файлы сеанса. Во многих сценариях он по умолчанию пуст, и в этом случае читайте:

На машинах Ubuntu или Debian, если session.save_path не установлен, файлы сеанса сохраняются в /var/lib/php5 .

В системах RHEL и CentOS, если session.save_path не установлен, файлы сеанса будут сохранены в /var/lib/php/session

Я думаю, что если вы скомпилируете PHP из исходного кода, тогда, когда session.save_path не будет установлен, файлы сеанса будут сохранены в /tmp (я не тестировал это сам, хотя).

Я использую Ubuntu 12.04.5 LTS и по какой-то причине (я ничего не изменил в php.ini ) мои сеансы находятся в /var/lib/php5/sessions

«Не установлен»? Это установлено — но закомментировано в php.ini. Это не означает, что оно не имеет значения или не установлено. Из командной строки просто выполните: php -i | grep session.save_path для пути сохранения сеанса CLI (и, возможно, Apache). Кроме того, данный php.ini обычно показывает путь по умолчанию — он просто закомментирован.

И да: если ничего не скомпилировано в качестве пути по умолчанию (не так, как в большинстве дистрибутивов), будет использоваться пробел (компиляция по умолчанию). Который затем использовал бы системную временную область (обычно /tmp ) в качестве ее запасного значения / значения по умолчанию. Пожалуйста, обратитесь к php.net/manual/en/…

/etc/php/7.0/*/php.ini УМОЛЧАНИЮ Ubuntu 16.04: /etc/php/7.0/*/php.ini -> ;session.save_path = «/var/lib/php/sessions» — комментарий не означает, что «не установлено» — это все, что я имел в виду. Он явно установлен на что-то отличное от «blank» (/ tmp) .. и НЕ является пустой / пустой строкой

‘set’ = я знаю, что вы имеете в виду: ‘не переопределяется пользователем’ (переопределяет закомментированную настройку ‘default’), но формулировка немного вводит в заблуждение. Просто добавив комментарии, чтобы люди были понятны ..

@bshea, я имею в виду, что ini_get(‘session.save_path’) возвращает «», а phpinfo() показывает «» для «session.save_path». Комментарий в INI-файле не влияет на PHP.

Мой phpinfo () показывает /var/lib/php/sessions session при загрузке apache2. ( i.imgur.com/WugVsgW.png ) по умолчанию / закомментировал apache php.ini. Это не «». (Ubuntu 16.04)

Источник

session_save_path

session_save_path() returns the path of the current directory used to save session data.

Parameters

Session data path. If specified and not null , the path to which data is saved will be changed. session_save_path() needs to be called before session_start() for that purpose.

Note:

On some operating systems, you may want to specify a path on a filesystem that handles lots of small files efficiently. For example, on Linux, reiserfs may provide better performance than ext2fs.

Return Values

Returns the path of the current directory used for data storage, or false on failure.

Changelog

See Also

User Contributed Notes 5 notes

I made a folder next to the public html folder and placed these lines at the very first point in index.php

Location of session folder:

What I placed in index.php at line 0:

ini_set ( ‘session.save_path’ , realpath ( dirname ( $_SERVER [ ‘DOCUMENT_ROOT’ ]) . ‘/../session’ ));
session_start ();

This is the only solution that worked for me . Hope this helps someone .

Debian does not use the default garbage collector for sessions. Instead, it sets session.gc_probability to zero and it runs a cron job to clean up old session data in the default directory.

As a result, if your site sets a custom location with session_save_path() you also need to set a value for session.gc_probability, e.g.:

session_save_path ( ‘/home/example.com/sessions’ );
ini_set ( ‘session.gc_probability’ , 1 );
?>

Otherwise, old files in ‘/home/example.com/sessions’ will never get removed!

Session on clustered web servers !

We had problem in PHP session handling with 2 web server cluster. Problem was one servers session data was not available in other server.

So I made a simple configuration in both server php.ini file. Changed session.save_path default value to shared folder on both servers (/mnt/session/).

If session.save_handler is set to files, on systems that have maximum path length limitations, when the session data file’s path is too long, php may get you an error like «No such file or directory» and fails to start session, although the session-saving folder really exists on the disk.

1. Keep the session-saving folder’s absolute path not too long
2. If you’re with PHP 7.1+, don’t set session.sid_length to a number too great, such as 255

I once got stuck with this problem on Windows and wasted hours to solve it.

ini_set ( ‘session.save_path’ , realpath ( dirname ( $_SERVER [ ‘DOCUMENT_ROOT’ ]) . ‘/tmp’ ));
ini_set ( ‘session.gc_probability’ , 1 );
session_start ();

?>

(for using above code create a tmp folder/directory in your directory)

Оцените статью