O diretório de sessões PHP continua preenchendo até transbordar

1

Eu tenho um problema com a pasta de dados da sessão do PHP. Parece não estar expirando sessões e atingiu algum tipo de limite, presumivelmente o limite do sistema de arquivos para arquivos em um diretório. As solicitações que envolvem a gravação de sessões falham com erro fatal devido a falta de espaço em disco.

Eu trabalhei temporariamente com isso apontando o sessions.save_path para um novo diretório.

Gostaria de saber o que está errado com meu php.ini que está impedindo que as sessões expirem.

Também tentei truncar o diretório sessions usando rm , mas parece que ele fica pendurado para sempre?

Diretório do problema:

drwxr-xr-x  2 www-data www-data 294215680 Jan  5 13:42 sessions

Seção de sessão de php.ini :

[Session]
session.save_handler = files
session.save_path = "N;/var/www/data/sessions"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 2592000
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
    
por Tony H 05.01.2018 / 17:23

3 respostas

5
session.save_path = "N;/var/www/data/sessions"

O problema não parece estar causando problemas (já que o PHP obviamente está gerando sessões), mas não está certo.

Os dois formatos para esta opção são:

/path/to/sessions
N;/path/to/sessions

O inteiro N define quantos subdiretórios serão criados no caminho especificado, útil para distribuir os arquivos da sessão por vários diretórios, se você esperar muitos arquivos de sessão. (Você já descobriu que os sistemas não gostam de muitos arquivos em um diretório ...)

session.gc_probability = 0

Este é provavelmente o principal problema (a menos que o PHP automaticamente manipule alguém configurando isto incorretamente como 0)

A probabilidade de a limpeza acontecer é definida por probability/divisor . 0/1000 é 0, portanto, provavelmente nunca será executado.

Editar: Em relação à exclusão de arquivos, você pode ter que esperar que ele termine. Se são milhões de arquivos, provavelmente vai parecer que está pendurado.

    
por 05.01.2018 / 17:55
2

Sua configuração inclui a seguinte configuração:

session.save_path = "N;/var/www/data/sessions"

que parece incorreto. Os principais N no session.save_path deve ser um inteiro que define o número de níveis de subdiretórios que serão usados para distribuir arquivos de sessão.

Usar "N" (corretamente ou não) também impediria a coleta de lixo de acordo com o manual e você precisaria de uma tarefa cron para excluir arquivos antigos de sessões:

There is an optional N argument to this directive that determines the number of directory levels your session files will be spread around in. For example, setting to "5;/tmp" may end up creating a session file and location like /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174 . In order to use N you must create all of these directories before use. A small shell script exists in ext/session to do this, it's called mod_files.sh, with a Windows version called mod_files.bat. Also note that if N is used and greater than 0 then automatic garbage collection will NOT be performed, see a copy of php.ini for further information. Also, if you use N, be sure to surround session.save_path in "quotes" because the separator (;) is also used for comments in php.ini.

    
por 05.01.2018 / 17:54
1

Você precisa de um cron job para limpar os arquivos da sessão, eles não estão sendo limpos por eles mesmos. Ubuntu / Debian tem um script ( /etc/cron.d/php ) para fazer a limpeza automaticamente.

Se você não tiver esse script, coloque find /var/www/data/sessions -cmin +1440 -print0 | xargs -0 -r rm em um cronjob.

Ele limpará arquivos com mais de 24 horas de duração ou mais.

    
por 05.01.2018 / 17:52

Tags