PHP 8.3.4 Released!

Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour les sessions
Nom Défaut Modifiable Historique
session.save_path "" INI_ALL  
session.name "PHPSESSID" INI_ALL  
session.save_handler "files" INI_ALL  
session.auto_start "0" INI_PERDIR  
session.gc_probability "1" INI_ALL  
session.gc_divisor "100" INI_ALL  
session.gc_maxlifetime "1440" INI_ALL  
session.serialize_handler "php" INI_ALL  
session.cookie_lifetime "0" INI_ALL  
session.cookie_path "/" INI_ALL  
session.cookie_domain "" INI_ALL  
session.cookie_secure "0" INI_ALL Antérieur à PHP 7.2.0, la valeur par défaut était "".
session.cookie_httponly "0" INI_ALL Antérieur à PHP 7.2.0, la valeur par défaut était "".
session.cookie_samesite "" INI_ALL Disponible à partir de PHP 7.3.0.
session.use_strict_mode "0" INI_ALL  
session.use_cookies "1" INI_ALL  
session.use_only_cookies "1" INI_ALL  
session.referer_check "" INI_ALL  
session.cache_limiter "nocache" INI_ALL  
session.cache_expire "180" INI_ALL  
session.use_trans_sid "0" INI_ALL
session.trans_sid_tags "a=href,area=href,frame=src,form=" INI_ALL Disponible à partir de PHP 7.1.0.
session.trans_sid_hosts $_SERVER['HTTP_HOST'] INI_ALL Disponible à partir de PHP 7.1.0.
session.sid_length "32" INI_ALL Disponible à partir de PHP 7.1.0.
session.sid_bits_per_character "4" INI_ALL Disponible à partir de PHP 7.1.0.
session.upload_progress.enabled "1" INI_PERDIR  
session.upload_progress.cleanup "1" INI_PERDIR  
session.upload_progress.prefix "upload_progress_" INI_PERDIR  
session.upload_progress.name "PHP_SESSION_UPLOAD_PROGRESS" INI_PERDIR  
session.upload_progress.freq "1%" INI_PERDIR  
session.upload_progress.min_freq "1" INI_PERDIR  
session.lazy_write "1" INI_ALL  
session.hash_function "0" INI_ALL Supprimé à partir de PHP 7.1.0
session.hash_bits_per_character "4" INI_ALL Supprimé à partir de PHP 7.1.0
session.entropy_file "" INI_ALL Supprimé à partir de PHP 7.1.0.
session.entropy_length "0" INI_ALL Supprimé à partir de PHP 7.1.0.
Pour plus de détails sur les modes INI_*, reportez-vous à Où une directive de configuration peut être modifiée.

Le système de sessions dispose d'un grand nombre de directives dans le fichier php.ini. En voici une présentation :

session.save_handler string
Définit le nom du gestionnaire de session qui est utilisé pour stocker et relire les données. Par défaut, c'est le système intégré par fichiers : files. Noter que les extensions individuelles doivent enregistrer leurs propres gestionnaires de session. Voir aussi session_set_save_handler().
session.save_path string
Définit le chemin qui doit être passé au gestionnaire de sauvegarde. Si vous décidez de choisir le gestionnaire par défaut (par fichiers), cet argument sera utilisé comme dossier de sauvegarde des sessions. Voir aussi session_save_path().

Il y a un argument optionnel N à cette directive qui détermine la profondeur de répertoires où votre fichier de session sera stocké. Par exemple, si vous définissez '5;/tmp', votre fichier sera situé dans /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If. Si vous voulez utiliser N, vous devez créer tous ces répertoires avant de les utiliser. Un petit script shell existe dans ext/session pour réaliser ces créations et il se nomme mod_files.sh, et sa version Windows porte le nom mod_files.bat. Notez également que si N est utilisé et est supérieur à 0, alors la routine automatique gc (garbage collection) ne sera pas exécutée ; voir une copie de php.ini pour plus d'informations. Également, si vous utilisez N, assurez-vous d'entourer session.save_path de "doubles guillemets" car le séparateur (;) est également utilisé pour les commentaires dans php.ini.

Le module de stockage de fichiers crée des fichiers en utilisant le mode 600 par défaut. Ce mode par défaut peut être modifié en utilisant l'argument optionnel MODE : N;MODE;/pathMODE est la représentation octale du mode. Le fait de définir l'argument MODE n'affecte pas le processus umask.

Avertissement

Si cette option est configurée avec un dossier accessible en lecture à tout le monde, comme /tmp (par défaut), les autres utilisateurs pourront exploiter ces sessions en obtenant la liste de fichiers dans ce dossier.

Attention

Lors de l'utilisation de l'argument optionnel N déterminant la profondeur de répertoires, voir plus haut, veuillez noter que l'utilisation d'une valeur supérieure à 1 ou 2 n'est pas approprié pour la majorité des sites à cause du nombre de dossiers requis : par exemple, une valeur de 3 implique que (2 ** session.sid_bits_per_character) ** 3 dossiers existent sur le système de fichiers ce qui implique potentiellement un grand nombre d'espaces et d'inodes gaspillés.

N'utilisez une valeur de N supérieure à 2 uniquement si vous êtes certain que c'est nécessaire pour votre site.

session.name string
Spécifie le nom de la session, qui sera utilisé comme nom de cookie. Il ne doit contenir que des caractères alphanumériques. Par défaut, c'est PHPSESSID. Voir aussi session_name().
session.auto_start bool
Spécifie si le module de session doit démarrer automatiquement au début de chaque script PHP. Par défaut, c'est 0 (désactivé).
session.serialize_handler string
Définit le nom du gestionnaire qui est utilisé pour sérialiser et désérialiser les données. Le format de sérialisation PHP (nommé php_serialize), les formats internes à PHP (nommés php et php_binary) et WDDX (nommé wddx) sont supportés. WDDX est seulement disponible, si PHP a été compilé avec l'option WDDX. php_serialize utilise les fonctions de sérialisation/désérialisation en interne, et n'a pas les limitations que php et php_binary ont. Les anciens gestionnaires de sérialisation ne peuvent pas stocker d'index numérique, ni d'index sous forme de chaînes qui contiennent des caractères spéciaux (| et !) en $_SESSION. Utilisez php_serialize pour éviter ce genre d'erreur en fin de script. Par défaut, c'est php.
session.gc_probability int
Spécifie la probabilité, exprimée en pourcentage, en conjonction de session.gc_divisor, que la routine gc (garbage collection) soit démarrée à chaque requête. La valeur par défaut est 1. Voir session.gc_divisor pour plus de détails.
session.gc_divisor int
session.gc_divisor en conjonction avec session.gc_probability définit la probabilité que la routine gc (garbage collection) soit démarrée à chaque début de session. La probabilité est calculée en utilisant gc_probability/gc_divisor, par exemple 1/100 signifie qu'il y a 1 % de chance pour que la routine gc démarre à chaque requête. La valeur par défaut est 100.
session.gc_maxlifetime int
Spécifie la durée de vie des données sur le serveur, en nombre de secondes. Après cette durée, les données seront considérées comme obsolètes, et peuvent potentiellement être supprimées. Les données peuvent devenir obsolètes lors du démarrage de la session (suivant session.gc_probability et session.gc_divisor). La valeur par défaut est 1440 (24 minutes).

Note: Si des scripts différents ont des valeurs différentes de session.gc_maxlifetime mais partagent le même endroit pour y stocker les données de session, alors, le script dont la valeur est la plus petite effacera la donnée. Dans ce cas, utilisez cette directive conjointement avec session.save_path.

session.referer_check int
Contient une sous-chaîne que vous souhaitez retrouver dans tous les en-têtes HTTP Referer. Si cet en-tête a été envoyé par le client et que la sous-chaîne n'a pas été trouvée, l'identifiant de session sera considéré comme invalide. Par défaut, cette option est une chaîne vide.
session.entropy_file string
Est un chemin jusqu'à une source externe (un fichier), qui sera utilisée comme source additionnelle d'entropie pour la création de l'identifiant de session. Des exemples valides sont /dev/random et /dev/urandom, qui sont disponibles sur tous les systèmes Unix. Cette fonctionnalité est supportée sous Windows. Le fait de définir session.entropy_length à une valeur différente de zéro fera que PHP utilisera l'API aléatoire de Windows comme source d'entropie.

Note: Supprimé dans PHP 7.1.0. session.entropy_file vaut par défaut /dev/urandom ou /dev/arandom s'il est disponible.

session.entropy_length int
Spécifie le nombre d'octets qui seront lus dans le fichier défini ci-dessus. Par défaut 32. Supprimé dans PHP 7.1.0.
session.use_strict_mode bool
session.use_strict_mode spécifie si le module doit utiliser le mode d'identifiant de session strict. Si ce mode est activé, le module ne va pas accepter des identifiants de session non-initialisée. Si un identifiant de session non-initialisée est envoyé depuis le navigateur, un nouvel identifiant de session sera envoyé au navigateur. Les applications sont protégées des fixations de session via l'utilisation du mode strict des sessions. Par défaut, vaut 0 (désactivé).

Note: Activer session.use_strict_mode est obligatoire pour la sécurité générale des sessions. Il est conseillé de l'activer pour tous les sites. Voir l'exemple de code de session_create_id() pour plus de détails.

Avertissement

Si un gestionnaire de session enregistré via la fonction session_set_save_handler() n'implémente pas SessionUpdateTimestampHandlerInterface::validateId(), ni ne fournit la fonction de rappel validate_sid, respectivement, le mode d'identifiant de session strict sera effectivement désactivé, suivant la valeur de cette directive. Notez que SessionHandler n'implémente pas la méthode SessionHandler::validateId().

session.use_cookies bool
Spécifie si le module utilisera les cookies pour stocker l'id de session côté client. Par défaut, il vaut 1, c'est-à-dire actif.
session.use_only_cookies bool
Spécifie si le module doit utiliser seulement les cookies pour stocker les identifiants de sessions du côté du navigateur. En l'activant, vous éviterez les attaques qui utilisent des identifiants de sessions dans les URL. Par défaut, vaut 1 (activé).
session.cookie_lifetime int
Spécifie la durée de vie du cookie en secondes. La valeur de 0 signifie : "Jusqu'à ce que le navigateur soit éteint". La valeur par défaut est 0. Voir aussi session_get_cookie_params() et session_set_cookie_params().

Note: Le timestamp représentant la durée de vie du cookie est défini par rapport au temps du serveur, qui n'est pas forcément le même que le temps du navigateur.

session.cookie_path string
Spécifie le chemin utilisé lors de la création du cookie. Par défaut, il vaut /. Voir aussi session_get_cookie_params() et session_set_cookie_params().
session.cookie_domain string
Spécifie le domaine utilisé lors de la création du cookie. Par défaut, il ne vaut rien, cela signifie que c'est le nom de l'hôte du serveur qui génère le cookie en accord avec les spécifications sur les cookies. Voir aussi session_get_cookie_params() et session_set_cookie_params().
session.cookie_secure bool
Spécifie que les cookies ne doivent être émis que sur des connexions sécurisées. Avec cette option définie sur on, les sessions ne fonctionnent qu'avec des connexions HTTPS. Si elle est définie sur off, alors les sessions fonctionnent avec les connexions HTTP et HTTPS. Par défaut, elle est définie sur off. Voir aussi session_get_cookie_params() et session_set_cookie_params().
session.cookie_httponly bool
Marque le cookie pour qu'il ne soit accessible que via le protocole HTTP. Cela signifie que le cookie ne sera pas accessible par les langage de script, comme Javascript. Cette configuration permet de limiter les attaques comme les attaques XSS (bien qu'elle n'est pas supporté par tous les navigateurs).
session.cookie_samesite string
Permet qu'un cookie ne soit pas envoyé par le serveur avec des requêtes entre sites (cross-site). Cette assertion permet aux agents utilisateur de mitiger les riques de fuite d'informations d'origine du site (cross-origin), et fournit de la protection contre les attaques des fausses requêtes entre sites (cross-site request forgery). Notez que ceci n'est pas supporté par tous les navigateurs. Une valeur vide signifie qu'aucun attribut SameSite ne sera défini. Lax et Strict signifie que le cookie ne sera pas envoyé pour des requêtes POST entre domaines ; Lax enverra le cookie pour des requêtes GET entre domaines, tandis que Strict n'en enverra pas.
session.cache_limiter string
Spécifie le type de contrôle de cache utilisé pour les pages avec sessions. Les valeurs possibles sont : nocache, private, private_no_expire, public. Par défaut, il vaut nocache. Voir aussi session_cache_limiter() pour connaître la signification de ces valeurs.
session.cache_expire int
Spécifie la durée de vie des données de sessions, en minutes. Cette option n'a aucune conséquence sur le contrôle de cache. Par défaut, il vaut 180 (3 heures). Voir aussi session_cache_expire().
session.use_trans_sid bool
Spécifie si le support du SID est transparent ou pas. Par défaut vaut 0 (désactivé).

Note: Le système de gestion des sessions par URL pose un risque supplémentaire de sécurité : un utilisateur peut envoyer son URL avec l'identifiant de session par email à un ami, ou bien le mettre dans ses signets. Cela diffusera alors l'identifiant de session. Depuis PHP 7.1.0, le chemin URL complet, par exemple https://php.net/, est est géré par la fonctionnalité. Précédement, PHP gérait le chemin relatif uniquement. L'hote cible de la réécriture est défini par session.trans_sid_hosts.

session.trans_sid_tags string
session.trans_sid_tags spécifie les balises HTML qui sont réécrite pour include l'ID de session lorsque le support du SID transparent est activé. Par défaut a=href,area=href,frame=src,input=src,form= form est une balise spéciale. La variable de formulaire <input hidden="session_id" name="session_name"> est ajoutée.

Note: Avant PHP 7.1.0, url_rewriter.tags était utilisé à cette fin. Depuis PHP 7.1.0, fieldset n'est plus considéré comme une balise spéciale.

session.trans_sid_hosts string
session.trans_sid_hosts spécifie kes hôtes qui sont réécrit pour inclure l'ID de session lorsque le support du SID transparent est activé. Par défaut $_SERVER['HTTP_HOST']. Plusieurs hôtes peuvent être spécifiés séparé par ",", aucun espace n'est autorisé entre les hôtes. Par exemple : php.net,wiki.php.net,bugs.php.net
session.sid_length int
session.sid_length vous permet de spécifier la longueur de la chaine d'ID de session. La longueur de l'ID de session peut être comprise entre 22 et 256. La valeur par défaut est 32. Si vous avez besoin de compatibilité, vous pouvez spécifier 32, 40, etc. L'ID de session plus long est plus difficile à deviner. Au moins 32 caractères sont recommandés.
Astuce

Note de compatibilité: utiliser 32 au lieu de session.hash_function=0 (MD5) et session.hash_bits_per_character=4, session.hash_function=1 (SHA1) et session.hash_bits_per_character=6. Utiliser 26 au lieu de session.hash_function=0 (MD5) et session.hash_bits_per_character=5. Utiliser 22 au lieu de session.hash_function=0 (MD5) et session.hash_bits_per_character=6. Vous devez configurer les valeurs INI pour qu'il y ait 128 bits dans l'ID de session. N'oubliez pas de définir la valeur appropriée à session.sid_bits_per_character, sinon vous aurez des ID de session plus faible.

Note: Disponible à partir de PHP 7.1.0.

session.sid_bits_per_character int
session.sid_bits_per_character vous permet de spécifier le nombre de bits dans le caractère codé dans l'ID de session. Les valeurs possibles sont '4' (0-9, a-f), '5' (0-9, a-v), and '6' (0-9, a-z, A-Z, "-", ","). La valeur par défaut est 4. Plus de bits aboutit à un ID de session plus fort. 5 est la valeur recommandée pour la plupart des environnements.

Note: Disponible à partir de PHP 7.1.0.

session.hash_function mixed
session.hash_function vous permet de spécifier la fonction de hachage à utiliser pour générer les identifiants de session. '0' signifie MD5 (128 bits) et '1' signifie SHA-1 (160 bits).

Il est également possible de spécifier n'importe quel algorithme fourni par l'extension hash (s'il est disponible), comme sha512 ou whirlpool. Une liste complète d'algorithmes peut être obtenue avec la fonction hash_algos().

Note: Supprimé dans PHP 7.1.0.

session.hash_bits_per_character int
session.hash_bits_per_character vous permet de définir le nombre de bits utilisés pour chaque caractère lors des conversions des données binaires en éléments lisibles. Les valeurs possibles sont '4' (0-9, a-f), '5' (0-9, a-v), et '6' (0-9, a-z, A-Z, "-", ",").

Note: Supprimé dans PHP 7.1.0.

session.upload_progress.enabled bool
Active la surveillance de la progression d'un téléchargement, en peuplant la variable $_SESSION. Par défaut, vaut 1 (activé).
session.upload_progress.cleanup bool
Nettoie les informations de progression dès que toutes les données POST ont été lues (i.e. le téléchargement est terminé). Par défaut, vaut 1 (activé).

Note: Il est vivement recommandé de conserver active cette fonctionnalité.

session.upload_progress.prefix string
Un préfixe utilisé pour la clé relative à la progression du téléchargement dans le tableau $_SESSION. Cette clé sera concaténé avec la valeur de $_POST[ini_get("session.upload_progress.name")] pour fournir un index unique. Par défaut, vaut "upload_progress_".
session.upload_progress.name string
Le nom de la clé à utiliser dans le tableau $_SESSION pour y stocker les informations de progression. Voir aussi session.upload_progress.prefix. Si $_POST[ini_get("session.upload_progress.name")] n'est pas fourni ou disponible, la progression d'un téléchargement ne sera pas enregistrée. Par défaut, vaut "PHP_SESSION_UPLOAD_PROGRESS".
session.upload_progress.freq mixed
Définit le nombre de fois où les informations de progression de téléchargement doivent être mises à jour. Peut être défini en octets (i.e. "mettre à jour les informations de progression de téléchargement tous les 100 octets), ou en pourcentage (i.e. "mettre à jour les informations de progression de téléchargement tous les 1% de réception du poids total du fichier"). Par défaut, vaut "1%".
session.upload_progress.min_freq int
Le délai minimal entre les mises à jour, en seconde. Par défaut, vaut "1" (une seconde).
session.lazy_write bool
session.lazy_write, quand défini à 1, cela signifie que la donnée de session ne sera réécrite uniquement si celle ci change. Par défaut 1, activé.

La progression de téléchargement ne sera pas enregistrée tant que session.upload_progress.enabled n'est pas actif, et que la variable $_POST[ini_get("session.upload_progress.name")] n'est pas définie. Voir la progression de téléchargement de session pour plus d'informations sur cette fonctionnalité.

add a note

User Contributed Notes 25 notes

up
34
Walerian Walawski - https://w87.eu/
5 months ago
Can't find mod_files.sh? Here it is:
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

#!/usr/bin/env bash

if [[ "$2" = "" ]] || [[ "$3" = "" ]]; then
echo "Usage: $0 BASE_DIRECTORY DEPTH BITS_PER_CHAR"
echo "BASE_DIRECTORY will be created if it doesn't exist"
echo "DEPTH must be an integer number >0"
echo "BITS_PER_CHAR(session.sid_bits_per_character) should be one of 4, 5, or 6."
# http://php.net/manual/en/session.configuration.php#ini.session.sid-bits-per-character
exit 1
fi

if [[ "$2" = "0" ]] && [[ ! "$4" = "recurse" ]]; then
echo "Can't create a directory tree with depth of 0, exiting."
fi

if [[ "$2" = "0" ]]; then
exit 0
fi

directory="$1"
depth="$2"
bitsperchar="$3"

hash_chars="0 1 2 3 4 5 6 7 8 9 a b c d e f"

if [[ "$bitsperchar" -ge "5" ]]; then
hash_chars="$hash_chars g h i j k l m n o p q r s t u v"
fi

if [[ "$bitsperchar" -ge "6" ]]; then
hash_chars="$hash_chars 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 X Y Z - ,"
fi

while [[ -d $directory ]] && [[ $( ls $directory ) ]]; do
echo "Directory $directory is not empty! What would you like to do?"

options="\"Delete directory contents\" \"Choose another directory\" \"Quit\""
eval set $options
select opt in "$@"; do

if [[ $opt = "Delete directory contents" ]]; then
echo "Deleting $directory contents... "
rm -rf $directory/*
elif [[ $opt = "Choose another directory" ]]; then
echo "Which directory would you like to choose?"
read directory
elif [[ $opt = "Quit" ]]; then
exit 0
fi

break;
done
done

if [[ ! -d $directory ]]; then
mkdir -p $directory
fi

echo "Creating session path in $directory with a depth of $depth for session.sid_bits_per_character = $bitsperchar"

for i in $hash_chars; do
newpath="$directory/$i"
mkdir $newpath || exit 1
bash $0 $newpath `expr $depth - 1` $bitsperchar recurse
done
up
77
Christopher Kramer
9 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 .
up
18
GreenReaper
9 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.
up
16
info at thimbleopensource dot com
8 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.
up
1
zch1
2 months ago
the pwd should be urlencode when it contanis special chars.
eg:

save_handler:redis
save_path: tcp://127.0.0.1:6739?auth=urlencode('xxxxx')
up
5
boan dot web at outlook dot com
5 years ago
session.cache_limiter may be empty string to disable cache headers entirely.

Quote:
> Setting the cache limiter to '' will turn off automatic sending of cache headers entirely.

http://php.net/manual/en/function.session-cache-limiter.php
up
8
Wouter
13 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)
up
7
jlevene at etisoftware dot com
11 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
up
7
hassankhodadadeh at NOSPAM dot gmail dot com
11 years ago
max value for "session.gc_maxlifetime" is 65535. values bigger than this may cause php session stops working.
up
2
li-lingjie
6 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
up
3
Nicholas
13 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
up
1
theking2(at)king.ma
21 days ago
Please be careful with the 'sid_length' when setting 'sid_bits_per_character' to six.

Setting sid_bits_per_character to 6 includes the character "," to the list of possible characters. A comma will be escaped and transmitted as "%2C" (tested on Chromium Version 119.0.6045.199) adding two extra characters for each comma to the SESSION_ID.
up
0
theking2(at)king.ma
15 days ago
To prevent mitm-attacks you want to make sure the session cookie is only transmitted over a secure channel prefix it with the magic string "__Secure-". [1]

Like :
<?php
session_start
( [ 'name' => '__Secure-Session-ID' ] );
?>

The cookie will not be available on non-secure channel.

(Putting this note it here probably goes unnoticed because of all the noise)

[1]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
up
-1
usrhlp at yahoo dot com
13 days ago
The session.save-path doesn't work in 8.3.3 as it did in previous versions on windows / IIS.

upgrading from 8.1 to 8.3 causes the session save path to be interpreted differently.

To fix this you have to write the absolute path to the session folder location within php.ini.

An example on windows using IIS would be something along the lines of

C:\inetpub\wwwroot\sessiontmp

Leaving the session path line commented out or even specifying "\tmp" within php.ini causes the session path to be incorrectly assigned which prevents all sessions from being created. After manually adding the full local server path for your session temporary folder within PHP.INI, can sessions be created again.

Even creating the folders in the correct location within your inetpub folder fails to fix the issue with the 8.3.3.

Reverting back to PHP 8.1.26 also reverts the behaviour back to previous and all default PHP.INI settings work correctly and sessions can be created as expected. This shows it is an issue with PHP 8.3.3.

I spent 3 hours diagnosing that error hopefully i have saved you time too.
up
0
ohcc at 163 dot com
6 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.
up
-1
AskApache
13 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.
up
-2
00 at f00n dot com
15 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
up
-2
mikaelkael at php dot net
15 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'));
up
-3
orbill
13 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.
up
-4
white-gandalf at web dot de
6 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.
up
-2
polygon dot co dot in at gmail dot com
2 years 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.
up
-1
descartavel1+php at gmail dot com
10 months ago
You should set `session.name` to use either prefix `__Host-` or `__Secure-`. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
up
-6
sony-santos at bol dot com dot br
15 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).
up
-16
phpforcharity dot 5 dot pistos at geoshell dot com
15 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!
up
-21
Anonymous
7 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.
To Top