(PHP 4, PHP 5, PHP 7, PHP
session_save_path — Get and/or set the current session save path
Description
session_save_path(?string $path
= null
): string|false
Parameters
-
path
-
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
Version | Description |
---|---|
8.0.0 |
path is nullable now.
|
mdibbets at outlook dot nospam ¶
9 years ago
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:
/domains/account/session
location of index.php
/domains/account/public_html/index.php
What I placed in index.php at line 0:
<?php
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.
alvaro at demogracia dot com ¶
12 years ago
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.:
<?php
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!
sampathperera at hotmail dot com — Sri Lanka ¶
14 years ago
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/).
It works for me. :)
ohcc at 163 dot com ¶
5 years ago
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.
You should:
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.
hrushiemail at gmail dot com ¶
3 years ago
<?php
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)
PHP supports session_save_path() function from version 4
What is session_save_path?
session_save_path() sets or returns the path where data for the current session is saved.If you pass no arguments into a function, it returns the current directory where session files are stored.
To Get default Session Path
By default, PHP stores session data in files and files are stored in the /tmp directory of your server.Each session is stored in its own file.
echo session_save_path(); |
session data file stored in /tmp is like sess_1f1b1bdb809709f09f45b049998f25dc43745a67.
To Set Session Save Path in php.ini
session_save_path function returns the current session save path.If session_save_path() function returns null,then session.save_path is commented in your php.ini file.
So Uncomment session.save_path in a php.ini and set path in it.Let’s have a look
session.save_path = «C:WINDOWSTemp» |
To Change Session Save Path
To change the default path of stored session, you can use same function session_save_path( ) but with the parameter which is the path of the new directory where you session files will be stored but you need to call this function before accessing any session variables like session_start();
session_save_path(«/home/user/projects/sess_save/»); |
NOTE:If sessions are not working or are giving errors, check the pathname returned by session_save_path() function and make sure that path exists and writable.
BENEFIT
This simple change can greatly improve the security of the sessions stored in files because we are storing it in custom directory for application so it is Securing Session Storage
Couple of articles, you may like:
Session In Magento
How to use Session in Joomla
To maintain session in WordPress
I hope you have enjoyed this article. Don’t Forget to Follow us on Twitter or Subscribe us to Get the Latest Updates.
I have a shared hosting on godaddy.
I tried to change session save path in php.ini file with this line,
sessions.save_path = "/session"
I’ve controlled the sessions save path with sessions.save_path() function. It returns /tmp
before and after changing php.ini
Is it possible to change session save path on shared hosting?
Where am I wrong?
Chenmunka
4072 gold badges18 silver badges21 bronze badges
asked Jan 19, 2012 at 14:06
Okan KocyigitOkan Kocyigit
13.1k18 gold badges69 silver badges127 bronze badges
You can modify the session save path on shared hosting by creating a custom php.ini.
Include this in your file: session.save_path = "/path/to/your/folder"
Otherwise, you can use:
ini_set('session.save_path', '/path/to/your/folder')
The folder you use should be under your domain/account but not accessible through a Web browser. It also needs to have world-writable permissions on it. And every page that uses sessions must include that line.
idmean
14.4k9 gold badges55 silver badges83 bronze badges
answered Jan 19, 2012 at 16:05
3
It is session.save_path
and not sessions.save_path
(it may have been renamed or something, I don’t know, but sessions.save_path
did not work for me)
session.save_path = "/path/to/your/folder"
works fine
answered Jun 5, 2013 at 21:23
IburiduIburidu
4402 gold badges5 silver badges15 bronze badges
It is also important to note that session.save_path
must be called before session_start()
answered Sep 3, 2018 at 7:04
RotimiRotimi
4,7154 gold badges18 silver badges27 bronze badges
Check other files, for example: php_value[session.save_path]
in /etc/php-fpm.d/www.conf
and webservers users should have rights..
Chris Walsh
3,3731 gold badge43 silver badges61 bronze badges
answered Jul 2, 2020 at 11:08
Create a folder named session in the C:session.
Change the session.save_path();
directory to the newly created path: (C:session
) anywhere out of tmp
folder.
kamaci
71.5k69 gold badges222 silver badges362 bronze badges
answered Jun 9, 2016 at 13:31
Here’s how I got sessions working, with help from this thread. I’m running PHP in IIS.
Set the session folder in php.ini.
session.save_path = "C:/inetpub/temp/php_session"
(I’m not yet sure if this session folder is best practice for my environment..security-wise. I need to do more reading on this.)
Setting the session path was not enough. At first, I had placed session_start() in a function where I needed to set my session variables but even though the session file was created in my path (sess_d9eeeb305928f2f39a25f296773b09eb), the $_SESSION value was lost during an ajax post to my PHP page. Someone on stacko said to put session_start() as the first line, so I tried that and my session value is working. I haven’t figured out where to destroy it.
<?php
session_start();
...
answered Aug 1, 2018 at 14:23
Поведение этих функций зависит от установок в php.ini.
Имя | По умолчанию | Меняемо | Список изменений |
---|---|---|---|
session.save_path | «» | PHP_INI_ALL | |
session.name | «PHPSESSID» | PHP_INI_ALL | |
session.save_handler | «files» | PHP_INI_ALL | |
session.auto_start | «0» | PHP_INI_PERDIR | |
session.gc_probability | «1» | PHP_INI_ALL | |
session.gc_divisor | «100» | PHP_INI_ALL | Доступна с PHP 4.3.2. |
session.gc_maxlifetime | «1440» | PHP_INI_ALL | |
session.serialize_handler | «php» | PHP_INI_ALL | |
session.cookie_lifetime | «0» | PHP_INI_ALL | |
session.cookie_path | «/» | PHP_INI_ALL | |
session.cookie_domain | «» | PHP_INI_ALL | |
session.cookie_secure | «» | PHP_INI_ALL | Доступна с PHP 4.0.4. |
session.cookie_httponly | «» | PHP_INI_ALL | Доступна с PHP 5.2.0. |
session.use_strict_mode | «0» | PHP_INI_ALL | Доступна с PHP 5.5.2. |
session.use_cookies | «1» | PHP_INI_ALL | |
session.use_only_cookies | «1» | PHP_INI_ALL | Доступна с PHP 4.3.0. |
session.referer_check | «» | PHP_INI_ALL | |
session.entropy_file | «» | PHP_INI_ALL | |
session.entropy_length | «0» | PHP_INI_ALL | |
session.cache_limiter | «nocache» | PHP_INI_ALL | |
session.cache_expire | «180» | PHP_INI_ALL | |
session.use_trans_sid | «0» | PHP_INI_ALL | PHP_INI_ALL в PHP <= 4.2.3. PHP_INI_PERDIR в PHP < 5. Доступна с PHP 4.0.3. |
session.bug_compat_42 | «1» | PHP_INI_ALL | Доступна с PHP 4.3.0. Упразднена в PHP 5.4.0. |
session.bug_compat_warn | «1» | PHP_INI_ALL | Доступна с PHP 4.3.0. Упразднена в PHP 5.4.0. |
session.hash_function | «0» | PHP_INI_ALL | Доступна с PHP 5.0.0. |
session.hash_bits_per_character | «4» | PHP_INI_ALL | Доступна с PHP 5.0.0. |
url_rewriter.tags | «a=href,area=href,frame=src,form=,fieldset=» | PHP_INI_ALL | Доступна с PHP 4.0.4. |
session.upload_progress.enabled | «1» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.upload_progress.cleanup | «1» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.upload_progress.prefix | «upload_progress_» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.upload_progress.name | «PHP_SESSION_UPLOAD_PROGRESS» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.upload_progress.freq | «1%» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.upload_progress.min_freq | «1» | PHP_INI_PERDIR | Доступна с PHP 5.4.0. |
session.lazy_write | «1» | PHP_INI_ALL | Доступна с PHP 7.0.0. |
Для подробного описания констант
PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.
Система управления сессиями поддерживает ряд опций, которые могут быть
указаны в файле php.ini. Ниже приводится краткий обзор.
-
session.save_handler
string -
session.save_handler определяет имя обработчика, который
используется для хранения и извлечения данных, связанных с сессией.
По умолчанию имеет значение files. Следует обратить внимание, что
некоторые расширения могут зарегистрировать собственные обработчики
(save_handler). Текущие зарегистрированные обработчики
отображаются в phpinfo(). См. также
session_set_save_handler().
-
session.save_path
string -
session.save_path определяет аргумент, который
передается в обработчик сохранения. При установленном по умолчанию
обработчике files, аргумент содержит путь, где будут создаваться файлы.
См. также session_save_path().
У этой директивы также существует дополнительный аргумент N, определяющий
глубину размещения файлов сессии относительно указанной директории.
Например, указание ‘5;/tmp’ может в конечном итоге
привести к такому размещению файла сессии:
/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If
. Для того, чтобы использовать аргумент N, необходимо
предварительно создать все эти директории. Помочь в этом может
небольшой скрипт, расположенный в ext/session.
Версия для bash называется mod_files.sh, а
Windows-версия — mod_files.bat.
Также следует учитывать, что если N определен и больше 0, то автоматическая
сборка мусора не выполняется, подробнее см. информацию в файле php.ini.
Если используется N, необходимо также удостовериться, что значение
session.save_path указано в кавычках, поскольку
разделитель (;) в php.ini используется как знак
комментария.Модуль хранения файлов создает файлы с правами 600 по умолчанию.
Это можно изменить с помощью необязательного аргумента MODE:
N;MODE;/path, где MODE — восьмиричное
представление режима доступа к файлу.
Установка MODE не затрагивает umask.Внимание
Если установить в качестве значения общедоступную для чтения директорию,
например, /tmp (по умолчанию), остальные пользователи
сервера получат возможность перехватить сессию пользователя, получив
список файлов такой директории.Предостережение
При использовании необязательного аргумента N уровня директорий,
как описано выше, учтите, что использование значений выше чем 1 или 2
недопустимо для большинства сайтов, так как требуется очень
большое количество директорий: например, значение 3 приводит к 64^3
директориям в файловой системе, которые приводят к огромным потерям
места и inode.Only use N greater than 2 if you are absolutely
certain that your site is large enough to require it.Замечание:
До версии PHP 4.3.6, для использования механизма сессий
пользователям Windows приходилось изменять эту переменную.
Необходимо было указать корректный путь, например, такой:
c:/temp.
-
session.name
string -
session.name определяет название сессии,
используемое как название Cookies. Может содержать только цифры и буквы.
По умолчанию равно PHPSESSID.
См. также session_name().
-
session.auto_start
boolean -
session.auto_start определяет, будет ли модуль сессии
запускать сессию автоматически при старте. Значение по умолчанию
0 (отключено).
-
session.serialize_handler
string -
session.serialize_handler определяет имя обработчика,
который используется для сериализации / десериализации данных.
Формат сериализации PHP (наименование php_serialize),
внутренний формат PHP (наименование php и
php_binary), а также поддерживается WDDX
(наименование wddx). WDDX доступен только в том случае,
если PHP скомпилирован с поддержкой WDDX.
php_serialize доступен
с версии PHP 5.5.4. php_serialize использует
простую функцию сериализации / десериализации для внутренних нужд и
не имеет тех же ограничений, что php и php_binary.
Более старые обработчики сериализации не могут хранить
ни числовые ни строковые индексы, содержащие специальные символы
(| и !) в $_SESSION.
Используйте php_serialize, чтобы обойти
ошибки числовых и строковых индексов при завершении сктрипта.
Значение по умолчанию: php.
-
session.gc_probability
integer -
session.gc_probability в сочетании с
session.gc_divisor определяет вероятность запуска
функции сборщика мусора (gc, garbage collection).
По умолчанию равна 1.
См. подробнее в session.gc_divisor.
-
session.gc_divisor
integer -
session.gc_divisor в сочетании с
session.gc_probability вероятность запуска
функции сборщика мусора (gc, garbage collection) при каждой инициализации
сессии. Вероятность рассчитывается как gc_probability/gc_divisor, т.е.
1/100 означает, что функция gc запускается в одном случае из ста, или 1%
при каждом запросе.
session.gc_divisor по умолчанию имеет значение
100.
-
session.gc_maxlifetime
integer -
session.gc_maxlifetime задает отсрочку времени в
секундах, после которой данные будут рассматриваться как «мусор» и
потенциально будут удалены. Сбор мусора может произойти в течение старта
сессии (в зависимости от значений
session.gc_probability и
session.gc_divisor).
Замечание:
Если разные скрипты имеют разные значения
session.gc_maxlifetime, но при этом одни и
те же места для хранения данных сессии, то скрипт с минимальным
значением уничтожит все данные. В таком случае следует использовать
эту директиву вместе с
session.save_path. -
session.referer_check
string -
session.referer_check содержит подстроку, которую
можно использовать при проверке HTTP Referer. Если клиентом был послан
referer и подстрока не была выявлена, то идентификатор сессии
будет помечен как недействительный. По умолчанию используется пустая
строка.
-
session.entropy_file
string -
session.entropy_file содержит путь к ресурсу (файлу),
используемому как дополнительный источник энтропии в процессе создания
идентификатора сессии. Например, /dev/random или
/dev/urandom, которые доступны на многих Unix-системах.
Эта возможность также поддерживается в Windows начиная с версии PHP 5.3.3.
Указание ненулевого значения в session.entropy_length
предписывает PHP использовать в качестве источника энтропии
Windows Random API.
Замечание:
Начиная с PHP 5.4.0 session.entropy_file имеет
значение по умолчанию равное /dev/urandom или
/dev/arandom, если они доступны. В PHP 5.3.0
эта директива по умолчанию пуста.
-
session.entropy_length
integer -
session.entropy_length определяет количество байт,
которые будут прочитаны из вышеуказанного файла. По умолчанию
0 (отключено).
-
session.use_strict_mode
boolean -
session.use_strict_mode определяет
будет ли модуль использовать режим строгого идентификатора (ID).
Если от браузера получен неопределенный ID, то браузеру будет отправлен новый ID.
Таким образом приложения защищаются от внедрения сессии с помощью строгого режима.
По умолчанию 0 (отключено).
-
session.use_cookies
boolean -
session.use_cookies определяет, будет ли модуль
использовать cookies для хранения идентификатора сессии на стороне клиента.
По умолчанию 1 (включено).
-
session.use_only_cookies
boolean -
session.use_only_cookies определяет, будет ли
модуль использовать только cookies
для хранения идентификатора сессии на стороне клиента.
Включение этого параметра предотвращает атаки с использованием
идентификатора сессии, размещенного в URL. Добавлено в PHP 4.3.0.
Значение по умолчанию 1 (включено) с версии PHP 5.3.0.
-
session.cookie_lifetime
integer -
session.cookie_lifetime указывает время жизни cookies,
отправляемого в браузер клиента, в секундах. Значение 0 означает, что
cookies будут валидны до закрытия браузера. По умолчанию равно 0.
См. также session_get_cookie_params() и
session_set_cookie_params().
Замечание:
Отметка окончания времени устанавливается по отношению к серверному времени,
который не обязательно совпадает с временем в браузере клиента. -
session.cookie_path
string -
session.cookie_path определяет устанавливаемый
путь в сессионной cookie. По умолчанию /. См. также
session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_domain
string -
session.cookie_domain определяет устанавливаемый
домен в сессионной cookie. В соответствии со спецификацией нет смысла дополнительно
указывать имя хоста, который сгенерировал cookies.
См. также session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_secure
boolean -
session.cookie_secure указывает, должны ли cookies
передаваться только через защищенное соединение. По умолчанию
off.
Добавлено в версии PHP 4.0.4. См. также
session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_httponly
boolean -
Отметка, согласно которой доступ к cookies может быть получен только через HTTP
протокол. Это означает, что cookies не будут доступны через скриптовые языки,
такие как JavaScript. Данная настройка позволяет эффективно защитить от
XSS атак (к сожалению, эта функция поддерживается не всеми браузерами).
-
session.cache_limiter
string -
session.cache_limiter определяет метод контроля
кэша, используемого для страниц сессий. Может принимать одно из следующих
значений:
nocache, private,
private_no_expire или public.
По умолчанию nocache. Подробнее о данных
значениях смотрите в
session_cache_limiter().
-
session.cache_expire
integer -
session.cache_expire указывает время жизни
кэшированных страниц сессий в минутах, это никак не влияет на ограничитель
nocache. По умолчанию 180. См. также
session_cache_expire().
-
session.use_trans_sid
boolean -
session.use_trans_sid указывает, используется ли
прозрачная поддержка sid или нет. По умолчанию
0 (отключено).
Замечание:
Управление сессией на основе URL имеет дополнительные риски
безопасности по сравнению с управлением на основе cookies. В качестве
примера можно упомянуть такие ситуации, когда пользователи
могут отправить URL, содержащий идентификатор активной сессии своим
друзьям по электронной почте или сохранить ссылку с идентификатором
в закладках и все время посещать сайт с одним и тем же идентификатором.
-
session.bug_compat_42
boolean -
PHP версии 4.2.3 и более ранние имеют недокументированную особенность/ошибку,
позволяющую инициализировать переменную сессии как
глобальную при отключенной директиве
register_globals.
PHP 4.3.0 и более поздние предупреждают, если используется эта особенность и
включена опция
session.bug_compat_warn. Эта особенность/ошибка
может быть отключена при отключении данной директивы.
-
session.bug_compat_warn
boolean -
PHP версии 4.2.3 и более ранние имеют недокументированную особенность/ошибку,
позволяющую инициализировать переменную сессии как
глобальную, при отключенной директиве
register_globals.
PHP 4.3.0 и более поздние предупреждают, если используется эта особенность
при помощи включения директив
session.bug_compat_42
и
session.bug_compat_warn.
-
session.hash_function
mixed -
session.hash_function позволяет указать алгоритм
хэширования, используемый для генерации идентификатора сессии.
‘0’ означает MD5 (128 bits), а ‘1’ означает SHA-1 (160 bits).
Начиная с PHP 5.3.0 также стало возможным указать любой из алгоритмов,
предусмотренных расширением hash (если
оно доступно), например sha512 или
whirlpool. Полный список алгоритмов может быть
получен с помощью функции hash_algos().Замечание:
Эта опция была добавлена в PHP 5.
-
session.hash_bits_per_character
integer -
session.hash_bits_per_character позволяет указать
сколько бит хранится в каждом символе при преобразовании бинарного
представления во что-либо более удобочитаемое. Возможные значения: ‘4’ (0-9, a-f),
‘5’ (0-9, a-v) и ‘6’ (0-9, a-z, A-Z, «-«, «,»).
Замечание:
Эта опция была добавлена в PHP 5.
-
url_rewriter.tags
string -
url_rewriter.tags определяет, какие HTML-теги
будут переписаны при включении идентификатора сессии при условии
включенной поддержки transparent sid.
По умолчанию
a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=
Замечание:
Если необходимо строгое соответствие HTML/XHTML, то следует исключить
элемент form из данного списка, а поля формы размещать
в тэге <fieldset>.
-
session.upload_progress.enabled
boolean -
Включает отслеживание прогресса загрузки файлов
и заполнение соответствующей переменной в массиве $_SESSION.
По умолчанию равна 1, включена.
-
session.upload_progress.cleanup
boolean -
Чистка информации о прогрессе загрузки файлов по завершении
обработки POST-данных (т.е. по завершении загрузки).
По умолчанию равна 1, включена.
Замечание:
Строго рекомендуется не отключать эту опцию.
-
session.upload_progress.prefix
string -
Префикс, используемый для ключа прогресса загрузки в массиве $_SESSION.
Для обеспечения уникальности данный ключ будет присоединен к значению
$_POST[ini_get(«session.upload_progress.name»)].
По умолчанию равен «upload_progress_».
-
session.upload_progress.name
string -
Имя ключа, используемого в массиве $_SESSION, для хранения
информации о прогрессе. Смотрите также директиву
session.upload_progress.prefix.
Если элемент $_POST[ini_get(«session.upload_progress.name»)]
не передан, прогресс загрузки данного файла не будет отслеживаться.
По умолчанию равно «PHP_SESSION_UPLOAD_PROGRESS».
-
session.upload_progress.freq
mixed -
Определяет частоту обновления информации о прогрессе загрузки.
Можно указать значение в байтах (т.е. «обновлять информацию
о прогрессе каждые 100 байт») или в процентах (т.е. «обновлять
информацию о прогрессе после получения 1% данных от размера файла»).
По умолчанию равна «1%».
-
session.upload_progress.min_freq
integer -
Минимальная задержка между обновлениями, в секундах.
По умолчанию равна «1» (одной секунде).
-
session.lazy_write
boolean -
Если session.lazy_write установлена в 1, при изменении данных сессии
эти данные будут только перезаписываться. По умолчанию 1, включена.
Настройки register_globals
влияют на способ хранения и использования переменных сессии.
Прогресс загрузки файлов не будет обрабатываться, если не включена
опция session.upload_progress.enabled и не установлена переменная
$_POST[ini_get(«session.upload_progress.name»)].
Подробнее об этом смотрите в главе
«Отслеживание прогресса загрузки файлов с помощью сессий».
Вернуться к: Установка и настройка
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 2006-07-25 20:49:48
- A-men
- Редкий гость
- Неактивен
- Откуда: Россия, Москва
- Зарегистрирован: 2006-07-25
- Сообщений: 26
Тема: Решение проблемы некорректного конфигурирования session.save_path
Распаковал PMA в поддиректорию своего учебного сайта «phpmyadmin».
Создал директорию «config».
Отправился на http://localhost/phpmyadmin, чтобы открыть setup.php.
На открытом индексе PMA внизу вижу 2 ошибки:
1. Warning: Unknown: open(/tmpsess_8954767500a61dc446f6f3ec0f768654, O_RDWR) failed: No such file or directory (2) in Unknown on line 0.
2. Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0.
Отправляюсь в php.ini в блок [SESSION]
Вижу:
session.save_handler = files
и
session.save_path = "/tmp"
Читаю тут же комментарий:
; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP’s session functions.
;
; As of PHP 4.0.1, you can define the path as:
;
; session.save_path = «N;/path»
;
; where N is an integer. Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories. This is useful if you
; or your OS have problems with lots of files in one directory, and is
; a more efficient layout for servers that handle lots of sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
; You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
; use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
; session.save_path = «N;MODE;/path»
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process’s umask.
Соответственно меняю путь до ближайшей мусорки…
session.save_path = "C:temp"
И ошибки, естессна, исчезли. Но в инете что-то об этом не нашёл.
Сообщения 1
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Настройка во время выполнения
Поведение этих функций зависит от установок в php.ini.
Имя | По умолчанию | Место изменения | Список изменений |
---|---|---|---|
session.save_path | «» | PHP_INI_ALL | |
session.name | «PHPSESSID» | PHP_INI_ALL | |
session.save_handler | «files» | PHP_INI_ALL | |
session.auto_start | «0» | PHP_INI_PERDIR | |
session.gc_probability | «1» | PHP_INI_ALL | |
session.gc_divisor | «100» | PHP_INI_ALL | |
session.gc_maxlifetime | «1440» | PHP_INI_ALL | |
session.serialize_handler | «php» | PHP_INI_ALL | |
session.cookie_lifetime | «0» | PHP_INI_ALL | |
session.cookie_path | «/» | PHP_INI_ALL | |
session.cookie_domain | «» | PHP_INI_ALL | |
session.cookie_secure | «0» | PHP_INI_ALL | До PHP 7.2.0 значение по умолчанию было "" . |
session.cookie_httponly | «0» | PHP_INI_ALL | До PHP 7.2.0 значение по умолчанию было "" . |
session.cookie_samesite | «» | PHP_INI_ALL | Доступна с PHP 7.3.0. |
session.use_strict_mode | «0» | PHP_INI_ALL | |
session.use_cookies | «1» | PHP_INI_ALL | |
session.use_only_cookies | «1» | PHP_INI_ALL | |
session.referer_check | «» | PHP_INI_ALL | |
session.cache_limiter | «nocache» | PHP_INI_ALL | |
session.cache_expire | «180» | PHP_INI_ALL | |
session.use_trans_sid | «0» | PHP_INI_ALL | |
session.trans_sid_tags | «a=href,area=href,frame=src,form=» | PHP_INI_ALL | Доступна с PHP 7.1.0. |
session.trans_sid_hosts | $_SERVER['HTTP_HOST'] |
PHP_INI_ALL | Доступна с PHP 7.1.0. |
session.sid_length | «32» | PHP_INI_ALL | Доступна с PHP 7.1.0. |
session.sid_bits_per_character | «4» | PHP_INI_ALL | Доступна с PHP 7.1.0. |
session.upload_progress.enabled | «1» | PHP_INI_PERDIR | |
session.upload_progress.cleanup | «1» | PHP_INI_PERDIR | |
session.upload_progress.prefix | «upload_progress_» | PHP_INI_PERDIR | |
session.upload_progress.name | «PHP_SESSION_UPLOAD_PROGRESS» | PHP_INI_PERDIR | |
session.upload_progress.freq | «1%» | PHP_INI_PERDIR | |
session.upload_progress.min_freq | «1» | PHP_INI_PERDIR | |
session.lazy_write | «1» | PHP_INI_ALL | |
session.hash_function | «0» | PHP_INI_ALL | Удалена в PHP 7.1.0. |
session.hash_bits_per_character | «4» | PHP_INI_ALL | Удалена в PHP 7.1.0. |
session.entropy_file | «» | PHP_INI_ALL | Удалена в PHP 7.1.0. |
session.entropy_length | «0» | PHP_INI_ALL | Удалена в PHP 7.1.0 |
Для подробного описания констант
PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.
Система управления сессиями поддерживает ряд опций, которые могут быть
указаны в файле php.ini. Ниже приводится краткий обзор.
-
session.save_handler
string -
session.save_handler
определяет имя обработчика, который
используется для хранения и извлечения данных, связанных с сессией.
По умолчанию имеет значениеfiles
. Следует обратить внимание, что
некоторые модули могут зарегистрировать собственные обработчики
(save_handler
). Текущие зарегистрированные обработчики
отображаются в phpinfo(). Смотрите также
session_set_save_handler().
-
session.save_path
string -
session.save_path
определяет аргумент, который
передаётся в обработчик сохранения. При установленном по умолчанию
обработчике files, аргумент содержит путь, где будут создаваться файлы.
Смотрите также session_save_path().
У этой директивы также существует дополнительный аргумент
N
, определяющий
глубину размещения файлов сессии относительно указанной директории.
Например, указание'5;/tmp'
может в конечном итоге
привести к такому размещению файла сессии:
/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If
. Для того, чтобы использовать аргумент
N
, необходимо
предварительно создать все эти директории. Помочь в этом может
небольшой скрипт, расположенный в ext/session.
Версия для bash называется mod_files.sh, а
Windows-версия — mod_files.bat.
Также следует учитывать, что еслиN
определён и больше 0, то автоматическая
сборка мусора не выполняется, подробнее смотрите информацию в файле php.ini.
Кроме того, если используетсяN
, необходимо удостовериться, что значение
session.save_path
указано в кавычках, поскольку
разделитель (;
) в php.ini используется как знак
комментария.Модуль хранения файлов создаёт файлы с правами 600 по умолчанию.
Это можно изменить с помощью необязательного аргументаMODE
:
N;MODE;/path
, гдеMODE
— восьмеричное
представление режима доступа к файлу.
УстановкаMODE
не затрагивает umask.Внимание
Если установить в качестве значения общедоступную для чтения директорию,
например, /tmp (по умолчанию), остальные пользователи
сервера получат возможность перехватить сессию пользователя, получив
список файлов такой директории.Предостережение
При использовании необязательного аргумента
N
уровня директорий,
как описано выше, учтите, что использование значений выше чем 1 или 2
недопустимо для большинства сайтов, так как требуется очень
большое количество директорий: например, значение 3 приводит к(2 ** session.sid_bits_per_character) ** 3
директориям в файловой системе, которые приводят к огромным потерям
места и inode.Используйте только
N
больше 2, если вы абсолютно
уверены, что ваш сайт достаточно велик, чтобы требовать это. -
session.name
string -
session.name
определяет название сессии,
используемое как название cookies. Может содержать только цифры и буквы.
По умолчанию равноPHPSESSID
.
Смотрите также session_name().
-
session.auto_start
bool -
session.auto_start
определяет, будет ли модуль сессии
запускать сессию автоматически при старте. Значение по умолчанию
0
(отключено).
-
session.serialize_handler
string -
session.serialize_handler
определяет имя обработчика,
который используется для сериализации/десериализации данных.
Поддерживаются формат сериализации PHP (наименованиеphp_serialize
),
внутренний формат PHP (наименованиеphp
и
php_binary
) и WDDX
(наименованиеwddx
). WDDX доступен только в том случае,
если PHP скомпилирован с поддержкой WDDX.
php_serialize
использует
простую функцию сериализации/десериализации для внутренних нужд и
не имеет тех ограничений, какие есть уphp
иphp_binary
.
Старые обработчики сериализации не могут хранить
ни числовые, ни строковые индексы, содержащие специальные символы
(|
и!
) в $_SESSION.
Используйтеphp_serialize
, чтобы обойти
ошибки числовых и строковых индексов при завершении скрипта.
Значение по умолчаниюphp
.
-
session.gc_probability
int -
session.gc_probability
в сочетании с
session.gc_divisor
определяет вероятность запуска
функции сборщика мусора (gc, garbage collection).
По умолчанию равен1
.
Смотрите подробнее в session.gc_divisor.
-
session.gc_divisor
int -
session.gc_divisor
в сочетании с
session.gc_probability
определяет вероятность запуска функции сборщика мусора
(gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается
как gc_probability/gc_divisor, то есть 1/100 означает, что функция gc запускается в одном
случае из ста, или 1% при каждом запросе.
session.gc_divisor
по умолчанию имеет значение100
.
-
session.gc_maxlifetime
int -
session.gc_maxlifetime
задаёт отсрочку времени в секундах, после
которой данные будут рассматриваться как «мусор» и потенциально будут удалены. Сбор
мусора может произойти в течение старта сессии (в зависимости от значений
session.gc_probability и
session.gc_divisor).
По умолчанию значение1440
(24 минуты).
Замечание:
Если разные скрипты имеют разные значенияsession.gc_maxlifetime
,
но при этом одни и те же места для хранения данных сессии, то скрипт с минимальным
значением уничтожит все данные. В таком случае следует использовать
эту директиву вместе с
session.save_path.
-
session.referer_check
string -
session.referer_check
содержит подстроку, которую
можно использовать при проверке HTTP Referer. Если клиентом был послан
referer и подстрока не была выявлена, то идентификатор сессии
будет помечен как недействительный. По умолчанию используется пустая строка.
-
session.entropy_file
string -
session.entropy_file
содержит путь к ресурсу (файлу),
используемому как дополнительный источник энтропии в процессе создания
идентификатора сессии. Например,/dev/random
или
/dev/urandom
, которые доступны на многих Unix-системах.
Эта возможность также поддерживается в Windows. Указание
ненулевого значения вsession.entropy_length
предписывает PHP
использовать в качестве источника энтропии Windows Random API.
Замечание:
Удалено в PHP 7.1.0.
session.entropy_file
имеет значение по умолчанию
равное/dev/urandom
или/dev/arandom
, если они
доступны.
-
session.entropy_length
int -
session.entropy_length
определяет количество байт,
которые будут прочитаны из вышеуказанного файла. По умолчанию32
.
Удалено в PHP 7.1.0.
-
session.use_strict_mode
bool -
session.use_strict_mode
определяет
будет ли модуль использовать режим строгого идентификатора (ID).
Если от браузера получен неопределённый ID, то браузеру будет отправлен новый ID.
Таким образом приложения защищаются от фиксации сессии с помощью строгого режима.
По умолчанию0
(отключено).
Замечание:
Включениеsession.use_strict_mode
является обязательным для
общей безопасности сессии. Всем сайтам рекомендуется её включать.
Смотрите примеры session_create_id().
-
session.use_cookies
bool -
session.use_cookies
определяет, будет ли модуль
использовать cookies для хранения идентификатора сессии на стороне клиента.
По умолчанию1
(включено).
-
session.use_only_cookies
bool -
session.use_only_cookies
определяет, будет ли
модуль использовать только cookies
для хранения идентификатора сессии на стороне клиента.
Включение этого параметра предотвращает атаки с использованием
идентификатора сессии, размещённого в URL.
Значение по умолчанию1
(включено).
-
session.cookie_lifetime
int -
session.cookie_lifetime
указывает время жизни cookies,
отправляемого в браузер клиента, в секундах. Значение 0 означает, что
cookies будут валидны до закрытия браузера. По умолчанию равно0
.
Смотрите также session_get_cookie_params() и
session_set_cookie_params().
Замечание:
Отметка окончания времени устанавливается по отношению к серверному времени,
которое не обязательно совпадает с временем в браузере клиента.
-
session.cookie_path
string -
session.cookie_path
определяет устанавливаемый
путь в сессионной cookie. По умолчанию/
. Смотрите также
session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_domain
string -
session.cookie_domain
определяет устанавливаемый
домен в сессионной cookie. В соответствии со спецификацией нет смысла дополнительно
указывать имя хоста, который сгенерировал cookies.
Смотрите также session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_secure
bool -
session.cookie_secure
указывает, должны ли cookies
передаваться только через защищённое соединение. По умолчанию
off
.
Смотрите также
session_get_cookie_params() и
session_set_cookie_params().
-
session.cookie_httponly
bool -
Отметка, согласно которой доступ к cookie с идентификатором сессии может быть получен только через HTTP-протокол.
Это означает, что cookie не будет доступна через скриптовые языки,
такие как JavaScript. Данная настройка позволяет эффективно защитить от
XSS-атак (к сожалению, эта функция поддерживается не всеми браузерами).
-
session.cookie_samesite
string -
Позволяет серверам утверждать, что cookie не должен отправляться вместе
с межсайтовыми запросами. Это утверждение позволяет браузерам пользователей снизить риск
утечки информации из разных источников и обеспечивает определённую защиту от подделки
кроссдоменных запросов. Обратите внимание, что это поддерживается не всеми браузерами.
Пустое значение означает, что атрибут cookie сайта не будет установлен.
Lax
иStrict
означают, что cookie не будет
отправлено для кроссдоменных POST-запросов;Lax
отправит cookie
для междоменных GET-запросов, аStrict
не будет делать этого.
-
session.cache_limiter
string -
session.cache_limiter
определяет режим кеширования, используемого
для страниц сессий. Может принимать одно из следующих значений:
nocache
,private
,
private_no_expire
илиpublic
.
По умолчаниюnocache
. Подробнее о данных
значениях смотрите в
session_cache_limiter().
-
session.cache_expire
int -
session.cache_expire
указывает время жизни
кешированных страниц сессий в минутах, это никак не влияет на ограничитель
nocache. По умолчанию180
. Смотрите также
session_cache_expire().
-
session.use_trans_sid
bool -
session.use_trans_sid
указывает, используется ли
прозрачная поддержка sid или нет. По умолчанию
0
(отключено).
Замечание:
Управление сессией на основе URL имеет дополнительные риски
безопасности по сравнению с управлением на основе cookies. В качестве
примера можно упомянуть такие ситуации, когда пользователи
могут отправить URL, содержащий идентификатор активной сессии, своим
друзьям по электронной почте или сохранить ссылку с идентификатором
в закладках и все время посещать сайт с одним и тем же идентификатором.
Начиная с PHP 7.1.0, полный путь URL, то есть https://php.net/, обрабатывается «trans sid».
Раньше PHP обрабатывал только относительный URL-адреса.
Перезапись целевого хоста задаётся session.trans_sid_hosts.
-
session.trans_sid_tags
string -
session.trans_sid_tags
задаёт перезаписываемые теги HTML
для включения идентификатора сессии когда включена поддержка прозрачных «sid».
По умолчаниюa=href,area=href,frame=src,input=src,form=
form
— специальных тег.<input hidden="session_id"
добавляется в форму.
name="session_name">
Замечание:
До PHP 7.1.0 для этого использовался url_rewriter.tags. С PHP 7.1.0,
fieldset
больше не считается за специальный тег.
-
session.trans_sid_hosts
string -
session.trans_sid_hosts
задаёт, какие хосты будут перезаписаны
для включения идентификатора сессии, когда включена поддержка прозрачных «sid».
По умолчанию$_SERVER['HTTP_HOST']
.
Несколько хостов можно указать через запятую. Не допускается вставлять пробелы
между хостами. Так правильно:php.net,wiki.php.net,bugs.php.net
.
-
session.sid_length
int -
session.sid_length
позволяет указать длину идентификатора сессии.
Это значение должно быть в диапазоне 22-256.
По умолчанию 32. Если вам нужна совместимость, указывайте 32, 40 и т.д.
Более длинные идентификаторы сложнее подобрать. Рекомендуется использовать длину
не менее 32.
Подсказка
Заметки по совместимости: Используйте 32 для
session.hash_function
=0 (MD5) и
session.hash_bits_per_character
=4,
session.hash_function
=1 (SHA1) и
session.hash_bits_per_character
=6. 26 для
session.hash_function
=0 (MD5) и
session.hash_bits_per_character
=5. 22 для
session.hash_function
=0 (MD5) и
session.hash_bits_per_character
=6.
Вы должны сконфигурировать INI-настройки таким образом, чтобы идентификатор
сессии состоял как минимум из 128 бит. Не забудьте задать соответствующие
значения дляsession.sid_bits_per_character
, иначе ваши
идентификаторы будут слабыми.Замечание:
Эта настройка появилась в PHP 7.1.0.
-
session.sid_bits_per_character
int -
session.sid_bits_per_character
позволяет задать количество бит в
одном символе идентификатора сессии. Доступные значения
‘4’ (0-9, a-f), ‘5’ (0-9, a-v), и ‘6’ (0-9, a-z, A-Z, «-«, «,»).
По умолчанию 4. Чем больше бит, тем сильнее идентификатор сессии.
В большинстве окружений рекомендуется 5.
Замечание:
Эта настройка появилась в PHP 7.1.0.
-
session.hash_function
mixed -
session.hash_function
позволяет указать алгоритм
хеширования, используемый для генерации идентификатора сессии.
‘0’ означает MD5 (128 bits), а ‘1’ означает SHA-1 (160 bits).
Возможно указать любой из алгоритмов,
предусмотренных модулем hash (если
он доступен), например,sha512
или
whirlpool
. Полный список алгоритмов может быть
получен с помощью функции hash_algos().Замечание:
Удалена в PHP 7.1.0.
-
session.hash_bits_per_character
int -
session.hash_bits_per_character
позволяет указать
сколько бит хранится в каждом символе при преобразовании бинарного
представления во что-либо более удобочитаемое. Возможные значения: ‘4’ (0-9, a-f),
‘5’ (0-9, a-v) и ‘6’ (0-9, a-z, A-Z, «-«, «,»).
Замечание:
Удалена в PHP 7.1.0.
-
session.upload_progress.enabled
bool -
Включает отслеживание прогресса загрузки файлов
и заполнение соответствующей переменной в массиве $_SESSION.
По умолчанию 1, включено.
-
session.upload_progress.cleanup
bool -
Чистка информации о прогрессе загрузки файлов по завершении
обработки POST-данных (то есть когда загрузка завершена).
По умолчанию 1, включено.
Замечание:
Строго рекомендуется не отключать эту опцию.
-
session.upload_progress.prefix
string -
Префикс, используемый для ключа прогресса загрузки в массиве $_SESSION.
Для обеспечения уникальности данный ключ будет присоединён к значению
$_POST[ini_get("session.upload_progress.name")]
.
По умолчанию равен «upload_progress_».
-
session.upload_progress.name
string -
Имя ключа, используемого в массиве $_SESSION, для хранения
информации о прогрессе. Смотрите также директиву
session.upload_progress.prefix.
Если элемент$_POST[ini_get("session.upload_progress.name")]
не передан, прогресс загрузки данного файла не будет отслеживаться.
По умолчанию «PHP_SESSION_UPLOAD_PROGRESS».
-
session.upload_progress.freq
mixed -
Определяет частоту обновления информации о прогрессе загрузки.
Можно указать значение в байтах (то есть «обновлять информацию
о прогрессе каждые 100 байт») или в процентах (то есть «обновлять
информацию о прогрессе после получения 1% данных от размера файла»).
По умолчанию «1%».
-
session.upload_progress.min_freq
int -
Минимальная задержка между обновлениями, в секундах.
По умолчанию «1» (одна секунда).
-
session.lazy_write
bool -
Еслиsession.lazy_write
установлен в 1, то данные сессии
будут перезаписываться только при их изменении. По умолчанию 1, включено.
Прогресс загрузки файлов не будет обрабатываться, если не включена
опция session.upload_progress.enabled и не установлена переменная
$_POST[ini_get(«session.upload_progress.name»)].
Подробнее об этом смотрите в главе
«Отслеживание прогресса загрузки файлов с помощью сессий».
Christopher Kramer ¶
8 years ago
On debian (based) systems, changing session.gc_maxlifetime at runtime has no real effect. Debian disables PHP's own garbage collector by setting session.gc_probability=0. Instead it has a cronjob running every 30 minutes (see /etc/cron.d/php5) that cleans up old sessions. This cronjob basically looks into your php.ini and uses the value of session.gc_maxlifetime there to decide which sessions to clean (see /usr/lib/php5/maxlifetime).
You can adjust the global value in your php.ini (usually /etc/php5/apache2/php.ini). Or you can change the session.save_path so debian's cronjob will not clean up your sessions anymore. Then you need to either do your own garbage collection with your own cronjob or enable PHP's garbage collection (php then needs sufficient privileges on the save_path).
Why does Debian not use PHP's garbarage collection?
For security reasons, they store session data in a place (/var/lib/php5) with very stringent permissions. With the sticky bit set, only root is allowed to rename or delete files there, so PHP itself cannot clean up old session data. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267720 .
GreenReaper ¶
8 years ago
We found a session.save_path depth of 3 led to excessive wastage of inodes and in fact disk space in storing the directory tree. dir_indexes option on ext2/3/4 makes larger directories more feasible anyway, so we decided to move to a depth of 2 instead.
It took a little puzzling to figure out how to move the existing PHP sessions up one directory tree, but we ended up running this in the root sessions directory:
#!/bin/sh
for a in ./* ; do
cd ./$a
pwd
for b in ./* ; do
cd ./$b
pwd
# Move existing sessions out
find ./* -xdev -type f -print0 | xargs -0 mv -t .
# Remove subdirectories
find ./* -xdev -type d -print0 | xargs -0 rmdir
cd ..
done
cd ..
done
This script may not be the best way to do it, but it got the job done fast. You can modify it for different depths by adding or removing "for" loops.
The documentation gives a depth of 5 as an example, but five is right out. If you're going beyond 2, you're at the scale where you may want to to look at a large memcached or redis instance instead.
info at thimbleopensource dot com ¶
7 years ago
I found out that if you need to set custom session settings, you only need to do it once when session starts. Then session maintains its settings, even if you use ini_set and change them, original session still will use it's original setting until it expires.
Just thought it might be useful to someone.
jlevene at etisoftware dot com ¶
9 years ago
Being unable to find an actual copy of mod_files.sh, and seeing lots of complaints/bug fix requests for it, here's one that works. It gets all its parameters from PHP.INI, so you don't have the opportunity to mess up:
#!/bin/bash
#
# Creates directories for PHP session storage.
# Replaces the one that "comes with" PHP, which (a) doesn't always come with it
# and (b) doesn't work so great.
#
# This version takes no parameters, and uses the values in PHP.INI (if it
# can find it).
#
# Works in OS-X and CentOS (and probably all other) Linux.
#
# Feb '13 by Jeff Levene.
[[ $# -gt 0 ]] && echo "$0 requires NO command-line parameters.
It gets does whatever is called for in the PHP.INI file (if it can find it).
" && exit 1
# Find the PHP.INI file, if possible:
phpIni=/usr/local/lib/php.ini # Default PHP.INI location
[[ ! -f "$phpIni" ]] && phpIni=/etc/php.ini # Secondary location
[[ ! -f "$phpIni" ]] && phpIni= # Found it?
# Outputs the given (as $1) parameter from the PHP.INI file:
# The "empty" brackets have a SPACE and a TAB in them.
#
PhpConfigParam() {
[[ ! "$phpIni" ]] && return
# Get the line from the INI file:
varLine=`grep "^[ ]*$1[ ]*=" "$phpIni"`
# Extract the value:
value=`expr "$varLine" : ".*$1[ ]*=[ ]*['"]*([^'"]*)"`
echo "$value"
}
if [[ "$phpIni" ]]
then
savePath=`PhpConfigParam session.save_path`
# If there's a number and semicolon at the front, remove them:
dirDepth=`expr "$savePath" : '([0-9]*)'`
[[ "$dirDepth" ]] && savePath=`expr "$savePath" : '[0-9]*;(.*)'` || dirDepth=0
bits=`PhpConfigParam session.hash_bits_per_character`
case "x$bits" in
x) echo "hash_bits_per_character not defined. Not running." ; exit 2 ;;
x4) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f' ;;
x5) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v' ;;
x6) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v'
alphabet="$alphabet w x y z A B C D E F G H I J K L M N O P Q R S T U V W"
alphabet="$alphabet X Y Z - ,"
;;
*) echo "unrecognized hash_bits_per_character. Not running." ; exit 2 ;;
esac
else
echo "Cannot find the PHP.INI file. Not running. Sorry."
exit 2
fi
# The depth of directories to create is $1. 0 means just create the named
# directory. Directory to start with is $2.
#
# Used recursively, so variables must be "local".
doDir() {
local dir="$2"
if [[ -d "$dir" ]]
then
echo "Directory '$dir' already exists. No problem."
elif [[ -f "$dir" ]]
then
echo "FILE '$dir' exists. Aborting." ; exit 2
else
if mkdir "$dir"
then
echo "Directory '$dir' created."
else
echo "Cannot create directory '$dir'. Aborting." ; exit 2
fi
fi
chmod a+rwx "$dir"
if [[ $1 -gt 0 ]]
then
local depth=$(( $1 - 1 ))
for letter in $alphabet
do doDir $depth "$dir/$letter"
done
fi
}
echo "Running with savePath='$savePath', dirDepth=$dirDepth, and bitsPerCharacter=$bits."
sleep 3
doDir $dirDepth "$savePath"
exit 0
li-lingjie ¶
5 years ago
Use SessionHandlerInterface interface Custom redis session, found the following:
Use ini_set ('session.save_path', "tcp: //127.0.0.1: 6379? Auth = password"); will be reported:
PHP Fatal error: session_start (): Failed to initialize storage module: user (path: tcp: //127.0.0.1: 6379? Auth = password);
Using session_save_path ("tcp: //127.0.0.1: 6379? Auth = password") will not
hassankhodadadeh at NOSPAM dot gmail dot com ¶
10 years ago
max value for "session.gc_maxlifetime" is 65535. values bigger than this may cause php session stops working.
Wouter ¶
12 years ago
When setting the session.cookie_lifetime directive in a .htaccess use string format like;
php_value session.cookie_lifetime "123456"
and not
php_value session.cookie_lifetime 123456
Using a integer as stated above dit not work in my case (Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g)
ohcc at 163 dot com ¶
5 years ago
You should take more care configuring session.gc_maxlifetime when virtual hosts share the same session-saving directory. One host's session data may be gc'ed when another host runs php.
AskApache ¶
12 years ago
This is how I set my session.save_path
session.save_path = "1;/home/askapache/tmp/s"
So to create the folder structure you can use this compatible shell script, if you want to create with 777 permissions change the umask to 0000;
sh -o braceexpand -c "umask 0077;mkdir -p s/{0..9}/{a..z} s/{a..z}/{0..9}"
Then you can create a cronjob to clean the session folder by adding this to your crontab which deletes any session files older than an hour:
@daily find /home/askapache/tmp/s -type f -mmin +60 -exec rm -f {} ; &>/dev/null
That will create sessions in folder like:
/home/askapache/tmp/s/b/sess_b1aba5q6io4lv01bpc6t52h0ift227j6
I don't think any non-mega site will need to go more than 1 levels deep. Otherwise you create so many directories that it slows the performance gained by this.
polygon dot co dot in at gmail dot com ¶
1 year ago
In php.ini, session.save_handler defines the name of the handler which is used for storing and retrieving data associated with a session. [Defaults to files.]
By default session.save_handler has support for below
session.save_handler = files
session.save_handler = sqlite
session.save_handler = redis
session.save_handler = memcached
These locks the session by default for any HTTP request using session.
Locking means, a user can't access session related pages until current request is completed.
So, if you are thinking that switching to these will increase performance; the answer is NO! because of locking behaviour.
To overcome/customise the session locking behaviour use as below.
session.save_handler = user
This is for all (including list above) modes of session storage.
For "user" type save_handler, we can ignore locks for better performance (as explained in function session_set_save_handler). But for this we need to take care to use sessions only for authenticity and not for passing data from one script to other.
For passing data accross scripts use GET method to achieve the goal.
Nicholas ¶
12 years ago
Transient sessions do not appear to be working in 5.3.3
E.g.
<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
session_start();
if (isset(
$_SESSION["foo"])) {
echo "Foo: " . $_SESSION["foo"];
} else {
$_SESSION["foo"] = "Bar";
echo "<a href=?" . session_name() . "=" . session_id() . ">Begin test</a>";
}
?>
This works in 5.2.5, but not 5.3.3
00 at f00n dot com ¶
14 years ago
After having many problems with garbage collection not clearing my sessions I have resolved it through the following.
First I found this in the php.ini (not something i noticed as i use phpinfo(); to see my hosting ini).
; NOTE: If you are using the subdirectory option for storing session files
; (see session.save_path above), then garbage collection does *not*
; happen automatically. You will need to do your own garbage
; collection through a shell script, cron entry, or some other method. ; For example, the following script would is the equivalent of
; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
; cd /path/to/sessions; find -cmin +24 | xargs rm
With this is mind there are options.
1. dont use a custom save_path.
** This means if your isp hasnt defaulted your session temp to something safer than install default or you are using a shared directory for session data then you would be wise to use named sessions to keep your session from being viewable in other people's scripts. Creating a unique_id name for this is the common method. **
2. use your custom folder but write a garbage collection script.
3. use a custom handler and a database
white-gandalf at web dot de ¶
5 years ago
session.use_strict_mode does very little to strengthen your security: only one very specific variant of attack is migitated by this (where the attacker hands an "empty" sid to the victim to adapt his own browser to that session later) - versus for example the case where he pre-opens a session, handing the sid of that one to the victim, so the victim gets adapted to the pre-opened session. In the latter case this flag does nothing to help. In every other scenario with other vulnerabilities where the session id gets leaked, the flag helps nigher.
But this flag renders the php function session_id() useless in its parameterized variant, thus preventing any php functionality that builds upon this function.
orbill ¶
12 years ago
apparently the default value for session.use_only_cookies has changed in 5.3.3 from 0 to 1. If you haven't set this in your php.ini or your code to 0 transparent sessions won't work.
mikaelkael at php dot net ¶
14 years ago
Recently, I needed to change the session save_path in my program under Windows. With an ini_set('session.save_path', '../data/sessions'); (and session.gc_divisor = 1 for test), I always obtain 'Error #8 session_start(): ps_files_cleanup_dir: opendir(../data/sessions) failed: Result too large'.
I corrected this by changing with ini_set('session.save_path', realpath('../data/sessions'));
sony-santos at bol dot com dot br ¶
14 years ago
In response to 00 at f00n, this very page explains:
"(...) if N is used and greater than 0 then automatic garbage collection will not be performed (...)"
So you can actually use custom save_path with automatic garbage collection, since you don't use the subdirectory option (that N subdirectory levels).
phpforcharity dot 5 dot pistos at geoshell dot com ¶
14 years ago
To get session IDs to show up in URIs, and not get stored via cookies, you must not only set session.use_cookies to 0, but also set session.use_trans_sid to 1. Otherwise, the session ID goes neither in a cookie nor in URIs!
Anonymous ¶
6 years ago
In response to this comment: http://php.net/manual/en/session.configuration.php#107990 where it is claimed that gc_maxlifetime values larger than 65535 break the session system. I cannot reproduce this.
I've set gc_maxlifetime to 31536000 (1 year) and the session system works just fine. I haven't tried how long a session lasts now (I'm in the process of testing this), but it certainly doesn't break PHP sessions.
I tried to changed the session path for PHP 7.2 on a Windows Server 2016 but the phpinfo shows only the default path to the windows temp folder.
PHP 7.2 was installed by the webplatform installer.
What I have tried so far:
-
created a new folder
path: «C:Program FilesPHPv7.2session»
-
changed the folder security properties for the IIS_IUSERS
for test the user has full access
-
then changed the entry «session.save_path» in the php.ini to the folder path
session.save_path = «C:Program FilesPHPv7.2session»
-
restart the IIS server / restart the whole window server
If I printed out the php settings with the function phpinfo it said that the session path is located under «C:Windowstemp». It looks like that my option will not be loaded.
The screenshot shows the session part from the phpinfo output
But if I changed other option in the php.ini the phpinfo shows me the correct value. And in the entry «Loaded Configuration File» it shows that my php.ini file is used as configuration file.
The screenshot shows the «Loaded Configuration File» entry from the phpinfo output
So my question is what do I have to do to change the session path under windwo server 2016?
asked Sep 21, 2018 at 14:38
The problem was the webplatform installer.
The installer added the new section [WebPIChanges] to the php.ini.
In this section it overrides the session.save_path
with an hardcode string.
[WebPIChanges]
error_log=C:WindowstempPHP72x64_errors.log
upload_tmp_dir=C:Windowstemp
session.save_path=C:Windowstemp
cgi.force_redirect=0
cgi.fix_pathinfo=1
fastcgi.impersonate=1
fastcgi.logging=0
max_execution_time=300
date.timezone=Europe/Berlin
extension_dir="C:Program FilesPHPv7.2ext"
Because the section was at the end of the php.ini, it overrides my changes.
answered Sep 28, 2018 at 14:40
1
Check which php.ini is used. session.save_path
in your php.ini is the right place, iisreset is the right thing to do.
answered Sep 21, 2018 at 15:11
bjosterbjoster
4,5575 gold badges22 silver badges33 bronze badges
1
Как изменить папку для хранения файлов сессий
- 23.12.2005
На первом шаге установки Joomla, при проверке параметров сервера, иногда выдается ошибка, что папка указанная в переменной Session save path недоступна по записи. Конечно это не помешает установить Joomla, но создаст серьезные проблемы при попытке авторизации в административной панели. Что делать, если на сервере, по каким либо причинам неверно указан путь к папке хранения файлов сессий или отсутствуют права на запись?
Если папка существует и проблема в отсутствии прав на запись, то в первую очередь следует попробовать установить соответствующие права. Если же это по каким либо причинам невозможно, то можно попробовать изменить значение этой переменной, указав в ней путь к другой существующей и доступной на запись папке на серрве. То есть создать отдельную папку, и изменить значение переменной PHP session.save_path одним из ниже перечисленных способов.
Изменение параметра session.save_path в php.ini
Изменить папку для хранения файлов сессий можно в файле php.ini (конфигурационный файл PHP). Для этого необходимо найти в файле php.ini параметр session.save_path и в качестве значения параметра указать существующую и доступную по записи папку. Например вот так:
session.save_path = d:/www/tmp/
где «d:/www/tmp/» это абсолютный путь к существующей и доступной для записи папке
Использование .htaccess
Изменить директорию для хранения файлов сессий можно добавив в файл .htaccess, расположенный в корне сайта, следующую строчку:
php_value session.save_path "d:/www/tmp/"
где «d:/www/tmp/» это абсолютный путь к существующей и доступной для записи папке
Использование функции session_save_path
Необходимо в файлах:
- offline.php
- administratorindex.php
- administratorindex2.php
- administratorindex3.php
- administratorcomponentscom_usersadmin.users.php
- administratorincludesauth.php
найти строчку
и перед ней добавить:
session_save_path("d:/www/tmp/");
где «d:/www/tmp/» это абсолютный путь к существующей и доступной для записи папке
Использование функции ini_set
Необходимо в файлах:
- offline.php
- administratorindex.php
- administratorindex2.php
- administratorindex3.php
- administratorcomponentscom_usersadmin.users.php
- administratorincludesauth.php
найти строчку
и перед ней добавить:
ini_set('session.save_path', "d:/www/tmp/");
где «d:/www/tmp/» это абсолютный путь к существующей и доступной для записи папке
В данной заметке коротко о том, как использовать сеансы (сессии) в PHP, как они работают и как они связаны с файлами cookie (куки).
Официальная документация здесь
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей при навигации по сайту или приложению. Сессия PHP представляет собой способ хранения информации в переменных сессии, которые могут быть использованы для аутентификации на нескольких веб-страницах. В отличие от куков, информация сессии не хранится на компьютере пользователя. Вместо этого сессия создает файл на сервере во временном каталоге.
Рекомендуется настроить путь для хранения сессий на сервере. Сделать это можно несколькими способами. Необходимо заранее создать указанные директории!
В файле php.ini
:
session.save_path = "/path" // Моя настройка в Windows 10 session.save_path = "S:Serversession"
В файле .htaccess
:
php_value session.save_path "/path" // Моя настройка в Windows 10 php_value session.save_path "S:Serversession"
Выше варианты для глобальной конфигурации хранения сессий. Можно настраивать хранение сессий для каждого проекта отдельно. Для этого в проекте необходимо вызвать php функцию session_save_path()
c указанием необходимого пути. Перед session_start()
укажем путь для хранения сессий проекта:
session_save_path("S:Serversession"); session_start();
Второй вариант:
ini_set('session.save_path', "S:Serversession"); session_start();
Создание сессии (сеанса) в PHP
Для того, чтобы начать сеанс (запустить сессию), необходимо вызвать функцию session_start()
. Данную функцию нужно запускать вначале каждой страницы, на которой мы хотим в дальнейшем прочитать данные из сессии.
При каждом вызове session_start()
PHP сам отправляет куку в браузер пользователя.
// Синтаксис session_start ([ array $options = array() ] ) : bool // Пример session_start ();
С помощью аргументов (ассоциативный масс $options
) можно переопределить текущие директивы конфигурации сессий, которые указаны в php.ini
. Список всех директив: здесь
Запись и чтение сессий
После того, как на сервере создался файл вида sess_...
, в данную сессию можно записать информацию, а так же считать её от туда.
// Запись в сессионную переменную $_SESSION['name'] = 'John'; // Чтение из сессионной переменной echo $_SESSION['name'];
Завершение (очистка) сессии
Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы. Для того, чтобы завершить сессию нам нужно:
- Очистить массив
$_SESSION
- Удалить временное хранилище (файл сессии) на сервере
- Удалить сессионную куку (cookie).
// Очистить массив $_SESSION полностью session_unset(); // Удалить сессионную переменную unset($_SESSION['age']); // Удалить временное хранилище (файл сессии) на сервере session_destroy(); // Принудительное удаление сессионной cookie setcookie(session_name(), session_id(), time()-3600);
session_id()
— уникальный идентификатор сессииsession_name()
— значение идентификатора сессии
Итоги
// Создание и(или) доступ к сессии session_start(); // Запись в сессионную переменную $_SESSION['name'] = 'John'; // Чтение из сессионной переменной echo $_SESSION['name']; // Удалить сессионную переменную unset($_SESSION['age']); // Очистить массив $_SESSION полностью session_unset(); // Удалить временное хранилище (файл сессии) на сервере session_destroy(); // Принудительное удаление сессионной cookie setcookie(session_name(), session_id(), time()-3600); // Простой пример использования сессий session_save_path('С:temp'); session_start(); if (!isset($_SESSION['counter'])) $_SESSION['counter'] = 0; echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз. "; echo "<br><a href=".$_SERVER['PHP_SELF'].">обновить";
Пример использования сессии
В данном примере я покажу как можно использовать сессии (сеансы) в PHP на практике. Для начала на сервере создадим файл index.php
со следующим содержимым:
<? // Создаётся пустой файл вида sess_819gk3tcdvilccra1t9kjdvsv9 // На машину пользователя прилетает сессионная кука с ID сессии. В данном случае 819gk3tcdvilccra1t9kjdvsv9 session_start(); // Инициализация строки с сообщениями об ошибках $message = ''; // Если запрос отправлен методом POST if ($_SERVER["REQUEST_METHOD"] == "POST"): $name = strip_tags($_POST["name"]); $age = (int)$_POST["age"]; // Если поле `name` не заполнено if(empty($name)): $message = 'Поле `Ваше имя` обязательно к заполнению!'; // Иначе, если поле `age` не заполнено elseif(empty($age)): $message = 'Поле `Ваш возраст` обязательно к заполнению!'; // Если поля заполнены, записываем в сессию else: $_SESSION["name"] = $name; $_SESSION["age"] = $age; endif; // Иначе берём данные из сессии else: $name = $_SESSION["name"] ?? null; $age = $_SESSION["age"] ?? null; endif; ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Сессии</title> </head> <body> <h1>Создание сессии</h1> <p><a href="destroy.php">Закрыть сессию</a></p> <p><?= $message ?></p> <form action="<?= $_SERVER["PHP_SELF"] ?>" method="post"> Ваше имя: <br> <input type="text" name="name" value="<?= $name ?>"><br><br> Ваш возраст: <br> <input type="text" name="age" value="<?= $age !== 0 ? $age : '' ?>"><br><br> <input type="submit" value="Отправить"> </form> <? if ($name and $age) { echo "<h3>Привет, $name!</h3>"; echo "<h3>Тебе $age лет</h3>"; } ?> </body> </html>
Здесь я постарался максимально понятно описать всё происходящее. Под пользователя при заходе на эту страницу уже создаётся сессия, она пустая, это пока просто файл. Если пользователь заполнил все необходимые поля формы и нажал кнопку `Отправить`, то созданный файл (файл сессии) заполниться данными. Далее скрипт проверяет, если есть в сессии данные именно этого пользователя (здесь он уже сравнивает с кукой, которая пришла до этого на машину пользователя), то выводим эти данные. В противном случае, добавляем в сессию данные пользователя.
Создадим файл destroy.php
. При переходе на данную страницу будем удалять сессию полностью. Если необходимо удалять и сессионную куку, воспользуйтесь функцией:
setcookie(session_name(), session_id(), time()-3600);
// Файл destroy.php <? session_start() ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Закрыть сессию</title> </head> <body> <h1>Сессия закрыта</h1> <a href="index.php">Создать сессию</a> </body> </html> <? session_destroy() ?>