Configuración en tiempo de ejecución

El comportamiento de estas funciones es afectado por la configuración en el archivo php.ini.

Opciones de configuración para las sesiones
Nombre Por defecto Cambiable Historial de cambios
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 Anterior a PHP 7.2.0, el valor por omisión era "".
session.cookie_httponly "0" INI_ALL Anterior a PHP 7.2.0, el valor por omisión era "".
session.cookie_samesite "" INI_ALL Disponible a 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 a partir de PHP 7.1.0.
session.trans_sid_hosts $_SERVER['HTTP_HOST'] INI_ALL Disponible a partir de PHP 7.1.0.
session.sid_length "32" INI_ALL Disponible a partir de PHP 7.1.0. Obsolète a partir de PHP 8.4.0.
session.sid_bits_per_character "4" INI_ALL Disponible a partir de PHP 7.1.0. Obsolète a partir de PHP 8.4.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 Eliminado a partir de PHP 7.1.0
session.hash_bits_per_character "4" INI_ALL Eliminado a partir de PHP 7.1.0
session.entropy_file "" INI_ALL Eliminado a partir de PHP 7.1.0.
session.entropy_length "0" INI_ALL Eliminado a partir de PHP 7.1.0.
Para más detalles sobre los modos INI_*, refiérase a Dónde una directiva de configuración puede ser modificada.

El sistema de sesiones dispone de un gran número de directivas en el archivo php.ini. A continuación se presenta una descripción:

session.save_handler string
Define el nombre del controlador de sesiones que se utiliza para almacenar y leer los datos. Por omisión, es el sistema integrado por archivos: files. Tenga en cuenta que las extensiones individuales deben registrar sus propios controladores de sesiones. Consulte también session_set_save_handler().
session.save_path string
Define la ruta que debe pasarse al controlador de guardado. Si decide elegir el controlador por omisión (por archivos), este argumento se utilizará como carpeta de guardado de las sesiones. Consulte también session_save_path().

Existe un argumento opcional N para esta directiva que determina la profundidad de directorios donde su archivo de sesión será almacenado. Por ejemplo, si define '5;/tmp', su archivo estará ubicado en /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If. Si desea utilizar N, debe crear todos estos directorios antes de usarlos. Existe un pequeño script shell en ext/session para realizar estas creaciones y se denomina mod_files.sh, y su versión Windows lleva el nombre mod_files.bat. Tenga en cuenta también que si N se utiliza y es superior a 0, entonces la rutina automática gc (recolección de basura) no se ejecutará; consulte una copia de php.ini para más información. Asimismo, si utiliza N, asegúrese de rodear session.save_path con "comillas dobles" ya que el separador (;) también se utiliza para los comentarios en php.ini.

El módulo de almacenamiento de archivos crea archivos utilizando el modo 600 por omisión. Este modo por omisión puede modificarse utilizando el argumento opcional MODE: N;MODE;/path donde MODE es la representación octal del modo. El hecho de definir el argumento MODE no afecta al proceso umask.

Advertencia

Si esta opción se configura con una carpeta accesible en lectura para todos, como /tmp (por omisión), otros usuarios podrán explotar estas sesiones obteniendo la lista de archivos en esta carpeta.

Precaución

Al utilizar el argumento opcional N que determina la profundidad de directorios, como se indicó anteriormente, tenga en cuenta que el uso de un valor superior a 1 o 2 no es apropiado para la mayoría de los sitios debido al número de directorios requeridos: por ejemplo, un valor de 3 implica que (2 ** session.sid_bits_per_character) ** 3 directorios existen en el sistema de archivos lo que implica potencialmente un gran número de espacios y inodos desperdiciados.

No utilice un valor de N superior a 2 a menos que esté seguro de que es necesario para su sitio.

session.name string
Especifica el nombre de la sesión, que se utilizará como nombre de cookie. Solo debe contener caracteres alfanuméricos. Por omisión, es PHPSESSID. Consulte también session_name().
session.auto_start bool
Especifica si el módulo de sesiones debe iniciarse automáticamente al comienzo de cada script PHP. Por omisión, es 0 (desactivado).
session.serialize_handler string
Define el nombre del controlador que se utiliza para serializar y deserializar los datos. El formato de serialización PHP (llamado php_serialize), los formatos internos a PHP (llamados php y php_binary) y WDDX (llamado wddx) son soportados. WDDX solo está disponible, si PHP ha sido compilado con la opción WDDX. php_serialize utiliza las funciones de serialización/deserialización en interno, y no tiene las limitaciones que php y php_binary tienen. Los antiguos controladores de serialización no pueden almacenar índices numéricos, ni índices en forma de cadenas que contengan caracteres especiales (| y !) en $_SESSION. Utilice php_serialize para evitar este tipo de error al final del script. Por omisión, es php.
session.gc_probability int
Especifica la probabilidad, expresada en porcentaje, en conjunción de session.gc_divisor, que la rutina gc (garbage collection) se inicie en cada solicitud. El valor por omisión es 1. Debe ser superior o igual a 0. Consulte session.gc_divisor para más detalles.
session.gc_divisor int
session.gc_divisor en conjunción con session.gc_probability define la probabilidad que la rutina gc (garbage collection) se inicie en cada inicio de sesión. La probabilidad se calcula utilizando gc_probability/gc_divisor, por ejemplo 1/100 significa que hay un 1% de probabilidad de que la rutina gc se inicie en cada solicitud. El valor por omisión es 100. Debe ser superior o igual a 0.
session.gc_maxlifetime int
Especifica la duración de vida de los datos en el servidor, en número de segundos. Después de este tiempo, los datos serán considerados obsoletos, y pueden potencialmente ser eliminados. Los datos pueden volverse obsoletos al inicio de la sesión (siguiendo session.gc_probability y session.gc_divisor). El valor por omisión es 1440 (24 minutos).

Nota: Si diferentes scripts tienen valores diferentes de session.gc_maxlifetime pero comparten el mismo lugar para almacenar los datos de sesión, entonces, el script con el valor más pequeño borrará los datos. En este caso, utilice esta directiva conjuntamente con session.save_path.

session.referer_check int
Contiene una subcadena que desea encontrar en todos los encabezados HTTP Referer. Si este encabezado ha sido enviado por el cliente y la subcadena no ha sido encontrada, el identificador de sesión será considerado inválido. Por omisión, esta opción es una cadena vacía.
session.entropy_file string
Es un camino hasta una fuente externa (un archivo), que será utilizada como fuente adicional de entropía para la creación del identificador de sesión. Ejemplos válidos son /dev/random y /dev/urandom, que están disponibles en todos los sistemas Unix. Esta funcionalidad es soportada en Windows. El hecho de definir session.entropy_length a un valor diferente de cero hará que PHP utilice la API aleatoria de Windows como fuente de entropía.

Nota: Eliminado en PHP 7.1.0. session.entropy_file vale por omisión /dev/urandom o /dev/arandom si está disponible.

session.entropy_length int
Especifica el número de bytes que serán leídos en el archivo definido anteriormente. Por omisión 32. Eliminado en PHP 7.1.0.
session.use_strict_mode bool
session.use_strict_mode especifica si el módulo debe utilizar el modo de identificador de sesión estricto. Si este modo está activado, el módulo no aceptará identificadores de sesión no inicializados. Si un identificador de sesión no inicializado es enviado desde el navegador, un nuevo identificador de sesión será enviado al navegador. Las aplicaciones están protegidas de la fijación de sesiones mediante el uso del modo estricto de sesiones. Por omisión, vale 0 (desactivado).

Nota: Activar session.use_strict_mode es obligatorio para la seguridad general de las sesiones. Se recomienda activarlo para todos los sitios. Consulte el ejemplo de código de session_create_id() para más detalles.

Advertencia

Si un controlador de sesiones registrado mediante la función session_set_save_handler() no implementa SessionUpdateTimestampHandlerInterface::validateId(), ni proporciona la función de devolución de llamada validate_sid, respectivamente, el modo de identificador de sesión estricto estará efectivamente desactivado, siguiendo el valor de esta directiva. Tenga en cuenta que SessionHandler no implementa el método SessionHandler::validateId().

session.use_cookies bool
Especifica si el módulo utilizará cookies para almacenar el id de sesión en el lado del cliente. Por omisión, vale 1, es decir, activo.
session.use_only_cookies bool
Especifica si el módulo debe utilizar solo cookies para almacenar los identificadores de sesiones en el lado del navegador. Al activarlo, evitará ataques que utilicen identificadores de sesiones en las URL. Por omisión, vale 1 (activado).
session.cookie_lifetime int
Especifica la duración de vida de la cookie en segundos. El valor de 0 significa: "Hasta que el navegador se apague". El valor por omisión es 0. Consulte también session_get_cookie_params() y session_set_cookie_params().

Nota: El timestamp que representa la duración de vida de la cookie se define en relación con el tiempo del servidor, que no es necesariamente el mismo que el tiempo del navegador.

session.cookie_path string
Especifica el camino utilizado al crear la cookie. Por omisión, vale /. Consulte también session_get_cookie_params() y session_set_cookie_params().
session.cookie_domain string
Especifica el dominio utilizado al crear la cookie. Por omisión, no vale nada, lo que significa que es el nombre del host del servidor que genera la cookie de acuerdo con las especificaciones sobre cookies. Consulte también session_get_cookie_params() y session_set_cookie_params().
session.cookie_secure bool
Especifica que las cookies solo deben emitirse en conexiones seguras. Con esta opción definida en on, las sesiones solo funcionan con conexiones HTTPS. Si está definida en off, entonces las sesiones funcionan con las conexiones HTTP y HTTPS. Por omisión, está definida en off. Consulte también session_get_cookie_params() y session_set_cookie_params().
session.cookie_httponly bool
Marca la cookie para que solo sea accesible a través del protocolo HTTP. Esto significa que la cookie no será accesible por los lenguajes de script, como Javascript. Esta configuración permite limitar ataques como los ataques XSS (aunque no es soportado por todos los navegadores).
session.cookie_samesite string
Permite que una cookie no sea enviada por el servidor con solicitudes entre sitios (cross-site). Esta afirmación permite a los agentes de usuario mitigar los riesgos de fuga de información de origen del sitio (cross-origin), y proporciona protección contra las ataques de falsificación de solicitudes entre sitios (cross-site request forgery). Tenga en cuenta que esto no es soportado por todos los navegadores. Un valor vacío significa que ningún atributo SameSite será definido. Lax y Strict significa que la cookie no será enviada para solicitudes POST entre dominios; Lax enviará la cookie para solicitudes GET entre dominios, mientras que Strict no lo hará.
session.cache_limiter string
Especifica el tipo de control de caché utilizado para las páginas con sesiones. Los valores posibles son : nocache, private, private_no_expire, public. Por omisión, vale nocache. Consulte también session_cache_limiter() para conocer el significado de estos valores.
session.cache_expire int
Especifica la duración de vida de los datos de sesiones, en minutos. Esta opción no tiene ninguna consecuencia en el control de caché. Por omisión, vale 180 (3 horas). Consulte también session_cache_expire().
session.use_trans_sid bool
Especifica si el soporte del SID es transparente o no. Por omisión vale 0 (desactivado).

Nota: El sistema de gestión de sesiones por URL representa un riesgo adicional de seguridad: un usuario puede enviar su URL con el identificador de sesión por correo electrónico a un amigo, o bien ponerla en sus marcadores. Esto difundirá entonces el identificador de sesión. Desde PHP 7.1.0, la URL completa, por ejemplo https://php.net/, es gestionada por la funcionalidad. Anteriormente, PHP gestionaba solo el camino relativo únicamente. El host objetivo de la reescritura está definido por session.trans_sid_hosts.

session.trans_sid_tags string
session.trans_sid_tags especifica las etiquetas HTML que son reescritas para incluir el ID de sesión cuando el soporte del SID transparente está activado. Por omisión a=href,area=href,frame=src,input=src,form= form es una etiqueta especial. La variable de formulario <input hidden="session_id" name="session_name"> es añadida.

Nota: Antes de PHP 7.1.0, url_rewriter.tags era utilizado para este propósito. Desde PHP 7.1.0, fieldset ya no es considerado como una etiqueta especial.

session.trans_sid_hosts string
session.trans_sid_hosts especifica los hosts que son reescritos para incluir el ID de sesión cuando el soporte del SID transparente está activado. Por omisión $_SERVER['HTTP_HOST']. Varios hosts pueden ser especificados separados por ",", ningún espacio está permitido entre los hosts. Por ejemplo: php.net,wiki.php.net,bugs.php.net
session.sid_length int
session.sid_length permite especificar la longitud de la cadena de ID de sesión. La longitud del ID de sesión puede ser comprendida entre 22 y 256. El valor por omisión es 32. Si necesita compatibilidad, puede especificar 32, 40, etc. El ID de sesión más largo es más difícil de adivinar. Al menos 32 caracteres son recomendados.
Sugerencia

Nota de compatibilidad: utilizar 32 en lugar de session.hash_function=0 (MD5) y session.hash_bits_per_character=4, session.hash_function=1 (SHA1) y session.hash_bits_per_character=6. Utilizar 26 en lugar de session.hash_function=0 (MD5) y session.hash_bits_per_character=5. Utilizar 22 en lugar de session.hash_function=0 (MD5) y session.hash_bits_per_character=6. Debe configurar los valores INI para que haya 128 bits en el ID de sesión. No olvide definir el valor apropiado a session.sid_bits_per_character, de lo contrario tendrá ID de sesión más débiles.

Nota: Disponible a partir de PHP 7.1.0.

session.sid_bits_per_character int
session.sid_bits_per_character permite especificar el número de bits en el carácter codificado en el ID de sesión. Los valores posibles son '4' (0-9, a-f), '5' (0-9, a-v), y '6' (0-9, a-z, A-Z, "-", ","). El valor por omisión es 4. Más bits resultan en un ID de sesión más fuerte. 5 es el valor recomendado para la mayoría de los entornos.

Nota: Disponible a partir de PHP 7.1.0.

session.hash_function mixed
session.hash_function permite especificar la función de hash a utilizar para generar los identificadores de sesión. '0' significa MD5 (128 bits) y '1' significa SHA-1 (160 bits).

También es posible especificar cualquier algoritmo proporcionado por la extensión hash (si está disponible), como sha512 o whirlpool. Una lista completa de algoritmos puede ser obtenida con la función hash_algos().

Nota: Eliminado en PHP 7.1.0.

session.hash_bits_per_character int
session.hash_bits_per_character permite definir el número de bits utilizados para cada carácter durante las conversiones de los datos binarios en elementos legibles. Los valores posibles son '4' (0-9, a-f), '5' (0-9, a-v), y '6' (0-9, a-z, A-Z, "-", ",").

Nota: Eliminado en PHP 7.1.0.

session.upload_progress.enabled bool
Activa la supervisión de la progresión de una subida, poblando la variable $_SESSION. Por omisión, vale 1 (activado).
session.upload_progress.cleanup bool
Limpia las informaciones de progresión tan pronto como todos los datos POST han sido leídos (es decir, la subida ha terminado). Por omisión, vale 1 (activado).

Nota: Se recomienda encarecidamente mantener activa esta funcionalidad.

session.upload_progress.prefix string
Un prefijo utilizado para la clave relativa a la progresión de la subida en el array $_SESSION. Esta clave será concatenada con el valor de $_POST[ini_get("session.upload_progress.name")] para proporcionar un índice único. Por omisión, vale "upload_progress_".
session.upload_progress.name string
El nombre de la clave a utilizar en el array $_SESSION para almacenar las informaciones de progresión. Consulte también session.upload_progress.prefix. Si $_POST[ini_get("session.upload_progress.name")] no es proporcionado o disponible, la progresión de una subida no será registrada. Por omisión, vale "PHP_SESSION_UPLOAD_PROGRESS".
session.upload_progress.freq mixed
Define el número de veces que las informaciones de progresión de subida deben ser actualizadas. Puede ser definido en bytes (es decir, "actualizar las informaciones de progresión de subida cada 100 bytes), o en porcentaje (es decir, "actualizar las informaciones de progresión de subida cada 1% de recepción del peso total del archivo"). Por omisión, vale "1%".
session.upload_progress.min_freq int
El retraso mínimo entre las actualizaciones, en segundos. Por omisión, vale "1" (un segundo).
session.lazy_write bool
session.lazy_write, cuando está definido a 1, significa que los datos de sesión solo serán reescritos si estos cambian. Por omisión 1, activado.

La progresión de subida no será registrada a menos que session.upload_progress.enabled esté activo, y que la variable $_POST[ini_get("session.upload_progress.name")] esté definida. Consulte la progresión de subida de sesión para más información sobre esta funcionalidad.

add a note

User Contributed Notes 21 notes

up
37
Walerian Walawski - https://w87.eu/
1 year 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
78
Christopher Kramer
10 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
5
zch1
1 year 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
4
theking2(at)king.ma
1 year 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
2
theking2(at)king.ma
1 year 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
18
GreenReaper
10 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
9 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
10
Wouter
15 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
8
jlevene at etisoftware dot com
12 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
3
boan dot web at outlook dot com
6 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
7
hassankhodadadeh at NOSPAM dot gmail dot com
13 years ago
max value for "session.gc_maxlifetime" is 65535. values bigger than this may cause php session stops working.
up
3
li-lingjie
7 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
1
Nicholas
14 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
ohcc at 163 dot com
7 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
00 at f00n dot com
17 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
AskApache
14 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
mikaelkael at php dot net
16 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
white-gandalf at web dot de
7 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
-4
orbill
14 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
-1
descartavel1+php at gmail dot com
2 years 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
-5
polygon dot co dot in at gmail dot com
3 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.
To Top