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
Configurações em Execução
O comportamento dessas funções podem ser modificado pelas configurações do php.ini.
| Nome | Padrão | Modificável | Changelog |
|---|---|---|---|
| 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_ALL | |
| session.gc_probability | "1" | PHP_INI_ALL | |
| session.gc_divisor | "100" | PHP_INI_ALL | Disponível desde 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 | Disponível desde PHP 4.0.4. |
| session.cookie_httponly | "" | PHP_INI_ALL | Disponível desde PHP 5.2.0. |
| session.use_cookies | "1" | PHP_INI_ALL | |
| session.use_only_cookies | "1" | PHP_INI_ALL | Disponível desde 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 in PHP <= 4.2.3. PHP_INI_PERDIR in PHP < 5. Disponível desde PHP 4.0.3. |
| session.bug_compat_42 | "1" | PHP_INI_ALL | Available since PHP 4.3.0. Removido no PHP 5.4.0. |
| session.bug_compat_warn | "1" | PHP_INI_ALL | Available since PHP 4.3.0. Removido no PHP 5.4.0. |
| session.hash_function | "0" | PHP_INI_ALL | Disponível desde PHP 5.0.0. |
| session.hash_bits_per_character | "4" | PHP_INI_ALL | Disponível desde PHP 5.0.0. |
| url_rewriter.tags | "a=href,area=href,frame=src,form=,fieldset=" | PHP_INI_ALL | Disponível desde PHP 4.0.4. |
| session.upload_progress.enabled | "1" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
| session.upload_progress.cleanup | "1" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
| session.upload_progress.prefix | "upload_progress_" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
| session.upload_progress.name | "PHP_SESSION_UPLOAD_PROGRESS" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
| session.upload_progress.freq | "1%" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
| session.upload_progress.min_freq | "1" | PHP_INI_PERDIR | Disponível desde PHP 5.4.0. |
O sistema de gerenciamento de sessões suporta um número de opções de configuração que você pode colocar em seu arquivo php.ini. A seguir um breve resumo.
-
session.save_handlerstring - session.save_handler define o nome do manipulador que será utilizado para armazenar a recuperar dados associados à sessão. Padrão para files. Note que extensões podem registrar seus próprios save_handlers; manipuladores registrados podem ser obtidos ao se vefificar o phpinfo(). Veja também session_set_save_handler().
-
session.save_pathstring -
session.save_path define o argumento que é passado
para o manipulador de gravação. Se você escolher o manipulador de
padrão (files), este é o caminho onde os arquivos serão criados. Veja também
session_save_path().
Há um argumento N opcional para esta dietiva que determina o número de níveis de diretório que seus arquivos de sessão serão espalhados. Por exemplo, definindo para '5;/tmp' pode levar a criação de um arquivo de sessão e localização como /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If . Para fazer uso do N você deve criar todos estes diretórios antes do uso. Um pequeno script shell existe em ext/session para fazer isto, chamado mod_files.sh, com uma versão para o Windows chamada mod_files.bat. Também note se N é usada e maior do que 0 então a limpeza de sessões não será executada, veja uma cópia do php.ini para mais informações. Se você usar N, certifique-se de cercar session.save_path com "aspas" porque o separador (;) é também usado para comentátios no php.ini.
AvisoSe você deixar isto definido num diretório de leitura público, tal como /tmp (o padrão), outros usuários no servidor poderão raptar sessõoes pegando a lista de arquivos nesse diretório.
Nota: Antes do PHP 4.3.6 os usuários de Windows tem que mudar esta variável para fazer funções de sessão no PHP. Certifique-se de especifica um caminho válido, ex.: c:/temp.
-
session.namestring - session.name especifíca o nome da sessão que é usada como um nome de cookie. Deve conter apenas caracteres alfanuméricos. Padrão inicial PHPSESSID. Veja também session_name().
-
session.auto_startboolean - session.auto_start especifíca se o módulo da sessão de executar automaticamente início da execução. Padrão 0 (desabilitado).
-
session.serialize_handlerstring - session.serialize_handler define o nome do manipulador que é usado para serializar/desserializar dados. Disponibilizado o formato interno do PHP (nome php ou php_binary) e WDDX (nome wddx). WDDX está apenas disponível se o PHP estiver compilado com suporte a WDDX . Definição inicial php.
-
session.gc_probabilityinteger - session.gc_probability em conjunto com session.gc_divisor é usado para gerenciar a probabilidade que o gc (coletor de lixo) seja iniciado. O padrão é 1. Veja session.gc_divisor para detalhes.
-
session.gc_divisorinteger - session.gc_divisor em conjunto com session.gc_probability define a probabilidade que o processo do gc (coletor de lixo) seja iniciado na inicialização de cada sessão. A propabilidade é cauculada usando gc_probability/gc_divisor, ex. 1/100 indica que existe 1% de chance que o processo GC comece em cada requisição. O padrão para session.gc_divisor é 100.
-
session.gc_maxlifetimeinteger -
session.gc_maxlifetime especifíca o número de
segundos após os dados terem sido considerados como lixo ('garbage')
e eventualmente limpados. Isso pode ocorrer no início da sessão
(dependendo de session.gc_probability e
session.gc_divisor).
Nota:
Se scripts diferentes tem valores diferentes para session.gc_maxlifetime mas compartilham o mesmo lugar para guardar os dados da sessão então o script com o menor valor estará limpando os dados. Neste caso, use esta diretiva em conjunto com session.save_path.
Nota: Se você está usando o file-based session handler como padrão, seu sistema de arquivos deve manter registrado quantidade de acessos (atime). Windows FAT não faz dessa forma, então você terá de lidar de outra forma com a limpeza de dados de sessão se você estiver preso um sistema de arquivos FAT ou outro sistema de arquivos que não tenha rastreamento de atime. Desde a versão 4.2.3 está sendo utilizado o mtime (tempo de modificação) em vez de atime. Assim não deve haver muitos problemas nos sistemas de arquivos que não tenham atime.
-
session.referer_checkstring - session.referer_check contém a substring que você quer checar contra cada HTTP Referer. Se o Referer for enviado pelo cliente e a sustring não foi encontrada, a id de sessão será marcada como inválida. O padrão é uma string vazia.
-
session.entropy_filestring - session.entropy_file informa o caminho para um recurso externo (arquivo) que será usado como uma fonte de entropia no processo de criação da id da sessão. Exemplos são /dev/random ou /dev/urandom que são disponíveis em muitos sistemas UNIX. Esse recurso foi disponibilizado no Windows a partir do PHP 5.3.3. Configurando session.entropy_length para um valor diferente de zero fará o PHP utilizar o Windows Random API como fonte de entropia.
-
session.entropy_lengthinteger - session.entropy_length especifíca o número de bytes que serão lidos do arquivo especificado acima. Padrão em 0 (desabilitado).
- session.use_cookies especifica se módulo utilizará cookies para guardar a id da sessão no lado do cliente. O padrão é 1 (habilitado).
- session.use_only_cookies especifica que o módulo usará somente cookies para guardar a id no lado do cliente. Habilitando esta configuração previne ataques envolvendo passagem de ids de sessão nas URLs. Esta configuração foi adicionada no PHP 4.3.0. Padrão 1 (ativado) desde o PHP 5.3.0.
-
session.cookie_lifetime especifica o tempo de
vida do cookie em segundos que é enviado para o browser. O valor 0
significa "até o browser ser fechado". O padrão é
0. Veja também
session_get_cookie_params() e
session_set_cookie_params().
Nota:
O timestamp de expiração é informado em relação à hora do servidor, que não necessariamente coincide com o horário do navegador do cliente.
- session.cookie_path especifica o caminho para definir em session_cookie. O padrão é /. Veja também session_get_cookie_params() e session_set_cookie_params().
- session.cookie_domain especifica o domínio para definir no cookie de sessão. O padrão é nenhum significando o nome do servidor que gerou o cookie de arcordo com a especificação dos cookies. Veja também session_get_cookie_params() e session_set_cookie_params().
- session.cookie_secure especifíca se o cookie seria apenas enviado sob conexões seguras. O padrão é off. Esta definição foi adicionada no PHP 4.0.4. Veja também session_get_cookie_params() e session_set_cookie_params().
- Marca o cookie para ser acessível apenas atráves do protocolo HTTP. Isto significa que o cookie não será acessível por linguagens de script, como o JavaScript. Esta definição pode efetivamente reduzir o roubo de identidade atráves de ataques XSS (mesmo não sendo suportado por todos os browsers).
-
session.cache_limiterstring - session.cache_limiter especifíca o método de controle do cache para usar em páginas de sessão. Pode ser um dos seguintes valores: nocache, private, private_no_expire ou public. Padrão nocache. Veja também a documentação de session_cache_limiter() para ver o que os valores significam.
-
session.cache_expireinteger - session.cache_expire especifíca o time-to-live (tempo de vida) para páginas de sessão, em minutos, não tendo efeito na limitação de nocache. O padrão é 180. Veja também session_cache_expire().
-
session.use_trans_sidboolean -
session.use_trans_sid se o suporte a
sid transparente está habilitado ou não. O padrão é
0 (desabilitado).
Nota: Para PHP 4.1.2 ou inferior, ele só é habilitado se fizer a opção na compilação com --enable-trans-sid. A partir do PHP 4.2.0, está sempre compilado. Gerenciamentode sessões baseadas na URL tem riscos de segurança adicionais comparados ao gerenciamento baseado em cookies. Usuários podem enviar uma URL que contenha uma ID de sessão ativa para seus amigos por e-mail ou usuários pode salvar uma URL que contenha uma ID de sessão em seus bookmarks e acessar seu site sempre com a mesma ID de sessão, por exemplo.
-
session.bug_compat_42boolean - Versões do PHP 4.2.3 ou inferior tem um recurso/bug não documentado que permite inicializar uma variável de sessão no escopo global, embora register_globals esteja desabilitado. PHP 4.3.0 e mais novos avisarão você, se este atributo está sendo usado, e se session.bug_compat_warn está também habilitado. Este funcionamento/bug pode ser desativado se desativando esta diretiva.
-
session.bug_compat_warnboolean - Versões do PHP 4.2.0 e inferiores tem um recurso/bug não documentado que que permite inicializar uma variável de sessão no escopo global, embora register_globals esteja desabilitado. HP 4.3.0 e posteriores avisarão a você, se este atributo estiver sendo utilizado com a habilitação de session.bug_compat_42 e session.bug_compat_warn.
-
session.hash_functioninteger -
session.hash_function permite a você especificar o algoritimo de
hash usado para gerar os IDs de sessão. '0' indica MD5 (128 bits) e
'1' indica SHA-1 (160 bits).
Desde o PHP 5.3.0 também é possível especificar qualquer um dos algoritmos disponibilizados pela extensão hash (se habilitada), como sha512 ou whirlpool. A lista completa de algoritmos suportados pode ser obtida na função hash_algos().
Nota:
Isto foi introduzido no PHP 5.
-
session.hash_bits_per_characterinteger -
session.hash_bits_per_character permite a você definir
quantos bits são guardaddos em cada caractere ao converter os dados binários
de hash para algo que possa ser legível. Os valores possíveis são '4' (0-9, a-f),
'5' (0-9, a-v), e '6' (0-9, a-z, A-Z, "-", ",").
Nota:
Isto foi introduzido no PHP 5.
-
url_rewriter.tags epecifíca quais tags HTML
são reescritas para incluir a id de sessão se o suporte a sid transparente
estiver habilitado. O padrão é
a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=
Nota: Se você quer conformidade HTML/XHTML, remova a entrada form e utilize as tags <fieldset> em volta dos campos de formulário.
-
session.upload_progress.enabledboolean - Permite o rastreamento do progresso de upload, populando a variável $_SESSION. Defaults to 1, enabled.
-
session.upload_progress.cleanupboolean -
Limpa a informação de progresso assim que todos os dados POST foram lidos
(o upload completado). Padrão 1, habilitador.
Nota: É altamente recomendável manter esse recurso ligado.
-
session.upload_progress.prefixstring - Um prefixo utilizado como chave na variável $_SESSION. Essa chave será concatenada com o valor de $_POST[ini_get("session.upload_progress.name")] para prover um índice único. Padrão "upload_progress_".
-
session.upload_progress.namestring - O nome da chave utilizada em $_SESSION para armazenar a informação de progresso. Veja também session.upload_progress.prefix. Se $_POST[ini_get("session.upload_progress.name")] não for passado ou indisponível, o progresso de upload não será registrado. Padrão "PHP_SESSION_UPLOAD_PROGRESS".
-
session.upload_progress.freqmixed - Define o quão frequentemente a informação de progresso de upload será atualizada. Isso pode ser definido em bytes ("atualize a informação a cada 100 bytes"), ou em percentagens ("atualize a informação de progresso a cada 1% do total do arquivo"). Padrão "1%".
-
session.upload_progress.min-freqinteger - O intervalo mínimo entre as atualizações, em segundos. Padrão "1" (um segundo).
As definições de configuração track_vars e register_globals influenciam como as variáveis de sessão são guardadas e restauradas.
O progresso de upload será registrado apenas se session.upload_progress.enabled estiver habilitado e a variável $_POST[ini_get("session.upload_progress.name")] existente. Veja Progresso de Upload em sessões para mais detalhes da funcionalidade.
Nota:
No PHP 4.0.3, track_vars está sempre ligada.
max value for "session.gc_maxlifetime" is 65535. values bigger than this may cause php session stops working.
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.
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
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.
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)
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'));
session.auto_start should always be "Off".
session.auto_start=On is considered "wrong" by Zend_Session as it causes an E_NOTICE to be thrown when Zend_Session::start() is called (either directly or indirectly, e.g., through Zend_Session_Namespace).
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).
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!
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
