Как быть со старыми файлами сесий

Кощей

if(!$needle) die("ooh");
Как быть со старыми файлами сесий

Проблема в том что для каждого заходящего пользователя на сайт создается сесия стандартными пхп функциями open_session, пхп все файлы сесий хранит в определенной папке, не разделяя по папкам, изза этого за пару дней набирается очень много файликов которые уже нельзя удалить стандартным rm -f
Что посоветуете ?
 

Фанат

oncle terrible
Команда форума
использовать не open_session, а session_start
тогда пхп будет чистить файлы сам.
 

Кощей

if(!$needle) die("ooh");
Ошибся, session_start и используется, open_session ниводном файле не встречается даже
 

Кощей

if(!$needle) die("ooh");
может настройка какая чтобы пхп их по под-папкам раскладывал хотябы

-~{}~ 11.07.09 23:21:

Нет с файлами все понятно, настройка папки сесий указывает на папку, я ее один раз уже чистил что заняло 21 час, теперь она снова забилась
 

Активист

Активист
Команда форума
Под юникосом в кроне (дневной кажется) должен лежать скрипт, который чистит файлы сессий, возможно, проблемы со скриптом.

Еще как вариант, ты хранишь сессии в "нестрандартной папке", и ОС не чистит эти папки по крону (например tmp в домашней директории пользователя)

Я написал простой скрипт, который чистит всякое г... не нужное

Код:
serv001:/home# cat /etc/cron.daily/phpsessremover
#!/bin/sh
#FILE='1';
#echo \'$FILE\';
/usr/bin/find /home -type f -mtime +1 -name sess_* | egrep sess_[a-z0-9]+$ | while read FILE; do rm "$FILE"; done
/usr/bin/find /var/spool/sa-exim/SAtempreject/new -type f -mtime +4 | while read FILE; do rm "$FILE"; done
/usr/bin/find /var/spool/sa-exim/SApermreject/new/ -type f -mtime +4 | while read FILE; do rm "$FILE";  done

По умолчанию , php чистит у меня только /var/lib/php5
Код:
serv001:/home# cat /etc/cron.d/php5
# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
serv001:/home#
 

Фанат

oncle terrible
Команда форума
Активист
ты уверен, что правильно понял вопрос?
 

Активист

Активист
Команда форума
*****
Да, уверен.

- все файлы сесий хранит в определенной папке, не разделяя по папкам
- невозможно удалить стандартным rm -f

1. У меня была такая жа проблема. На сервере стоит ISPManager, который для каждого юзера в виртуальном хосте задает папку хранения временных файлов и файлов сессий в хоуме (н-р, /home/user/tmp), крон автоматически нихрена не чистил, начал разбираться, сначала, делал по крону

/usr/bin/find /home -type f -mtime +1 -name sess_* -print0 | xargs -0 rm -f (1)

Заметил, что в случае когда файлов сессий очень много - они не удалились, при попытке удалять файлы через (1)
выдавалось что-то вроде rm "agrument too long"


Решил проблему скриптом в предыдущем посте.
а) Чистить самому - не нужно, за это должен отвечать крон.
б) Импользования конструкции
/usr/bin/find /home -type f -mtime +1 -name sess_* | egrep sess_[a-z0-9]+$ | while read FILE; do rm "$FILE"; done
позволяет решить проблему rm'a - argument too long

Вообще, если папка одна (у меня их много и неизвестно где, поэтому иду от /home), то нужно каждые 30 минут запускать по крону комманду чистки (см выше) и тогда проблем таких не будет, финд и rm будет отрабатывать быстро, ибо рекурсивно идти не надо, и проблем не будет.

-~{}~ 12.07.09 14:37:

*****
Да, и PHP ведь ничего сам не чистит, за это отвечает крон или средства OS (в случае с WIN)
 

Активист

Активист
Команда форума
Не знаю как там про НУ-НУ, но по факту на Debian Etch PHP как CGI есть проблема, и есть единственное решение.
 

Кощей

if(!$needle) die("ooh");
Активист все понял на 101%, правда тут все хранится в tmp юзера система дебиан, вообще я это сам не настраивал такой сервер получил от хостера, все работает отлично кроме этой штуки

Спасибо, скрипт отличный даже учитывает настройку пхп про жизнь сессии =)
 

Активист

Активист
Команда форума
> Спасибо, скрипт отличный даже учитывает настройку пхп про жизнь
> сессии =)

На здоровье)

Да, вот это
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
PHP сам ставил при установки из пакетов) Я добавлял чек из home'а (то что перед ним)
 

Фанат

oncle terrible
Команда форума
Активист
Может, дело не в CGI, а в другом месте? Руках, например?
 

DiMA

php.spb.ru
Команда форума
у меня сессии хранятся вечно и каждые 10 минут запускается мой скрипт, сканирующий накопившиеся файлы

по ключевым словам в сериализованной строке все сессии делятся на категории и удаляются спустя таймаут:
- пустые сессии (1 хит) - 10 минут
- гости (чето поделали) - 3 часа
- юзеры - 30 дней
- админы - 1 год
 

dimagolov

Новичок
DiMA, а тебе не кажется, что таким образом ты увеличиваешь уязвимость сайта при перехвате админского SID-а? ведь все что надо, зацепить один раз админский SID и все, админские права у тебя навечно. и не нужно ломать пароли и т.п.

e.g. yahoo/gmail требуют перелогиниться раз в неделю или две, чтобы краденные куки отбросить, а ты как раз все с точностью до наоборот....
 

Активист

Активист
Команда форума
DiMA
Ну это в контексте проекта зависит, какой проект?

*****
Или в багах пакетов дебиана.
 

DiMA

php.spb.ru
Команда форума
осовывать безопасность на том, что админы рассылают свои сессии направо и налево, но сайт не ломается только из-за 30 минут хранения сессии... ну-ну .-)

а получив сессию, можно продлевать ее жизнь бесконечно

-~{}~ 12.07.09 18:35:

> Ну это в контексте проекта зависит, какой проект?

очевидно, что проект, где не больше 10-20 тыщ юзеров, иначе каталог с сессиями усрется и скрипт не будет успевать его разгрести
 

Активист

Активист
Команда форума
dimagolov
Я бы точно, год сессии не хранил, ибо утечка ссылок может быть банальной))
 

dimagolov

Новичок
DiMA, я могу понять логику чистить пустые сессии чаще чем непустые. Но какай смысл во всем остальном (хранить сессии дни и годы) при том, что они у пользователя живут не дольше, чем пользователь держит открытым браузер? Или ты утверждаешь, что большинство твоих юзеров тачки держит всегда включенными и перепускают браузер только чтобы накатить обновления? А админы и вовсе, даже обновления накатывают не чаще чем раз в год?
 
Сверху