Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Как узнать какой скрипт генерит sessions
цитата
04/06/08 в 17:17
 localhost
Ситуация: в /tmp/ скапливаются sess_* нулевого размера, не так что бы быстро, чтобы подозревать что сервер ддосят, но неприятно. ну инодов в /tmp примерно 140к, скорость забивания примерно 1 файл типа sess_ccc3bab6f353a43d1cc67ad2f69eb158 в 3 секунды.
на сервере пицот доров и штук 10 сайтов, из которых как я знаю 2 сайта работают с $_SESSION переменными, 3 сиджа на ST+AT3 и пара wp-блогов.

я ковырял логи и скрипты примерно час, но ничего не нашел, а тем временем в /tmp набилось около тысячи пустых sess_* файлов.


LA показывает допустимые параметры, до 1.5, auth.log молчит, error_log и прочие логи ничего не показывают. вообщем я хз как найти скрипт который дергаются и который генерит sessions.

насколько я понимаю, файл типа sess_d14fb8a1fc4812424689e1f52ef752fd создается когда инитится session_start(), либо включен register_globals, либо как вариант кто-то спамит awstats?

доры точно исключаются, там простой скрипт, задачей которого вычислить ботов и записать в лог, вордпресс-блоги хз, но имхо с сессиями они не работают, а работают с куками, остается либо австатс, либо сиджи

есть конечно подозрение, что какой-нибудь говнобот типа майлру дрочит сайт, но вот уж хз.

apachectl status увы не работает :(


вообщем хелп, рейтинги само собой по максимуму.
цитата
04/06/08 в 19:08
 _s_[sov]
Попробуй сравнить имена сессий в браузере при заходе на сиджи. Методом исключения попробуй. Я больше даже хз что предложить, нада детально смареть. Часть лога можешь выложить?
цитата
04/06/08 в 19:48
 Corex
Проверь значение директивы session.auto_start в php.ini, оно должно быть 0. Если оно равно 1, то переуставновка значения в 0 должна решить проблему, если уже стоит 0, то надо копать...
цитата
04/06/08 в 20:05
 localhost
Corex писал:
Проверь значение директивы session.auto_start в php.ini, оно должно быть 0. Если оно равно 1, то переуставновка значения в 0 должна решить проблему, если уже стоит 0, то надо копать...


стоит ноль,

вот секция:

[Session]
session.save_handler = files
session.save_path = /tmp
session.use_cookies = 1
; session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 50
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
цитата
04/06/08 в 22:16
 Corex
Ага, значит, скорее всего, проблема в уборщике мусора.
Garbage Collector (сопсна уборщик), работает в PHP по заданной случайности, дабы не грузить сервак. При каждом запросе с заданной вероятностью запускается удаление временных файлов. У тебя в конфиге эта вероятность равна 2% (session.gc_probability/session.gc_divisor = 1/50=2%), т.е. только при каждом 50-м запуске интерпретатора удаляется 1 временный файл сессии (а может и не сессии, а ещё какой-нить временный файл). Короче, если каждый запуск плодит sess_ файл, а удаляется он очень редко, то понятно, откуда набралось такое кол-во файлов.

Первый вариант решения проблемы - сделать вероятность около 100%, файлы будут удаляться все, но будут проблемы с нагрузками.

Вариант второй - просто удалять все лишние файлы, в юниксе можно заюзать tmpwatch, либо написать небольшой шел-скрипт, либо php-скрипт, которые будут сносить устаревшие файлы. Устаревший файл легко определить: взять время его последней модификации, прибавить значение session.gc_maxlifetime (1440 секунд) и удалить всё, что меньше текущей временной метки.
Вроде как одмины примерно так и делают... icon_smile.gif
цитата
05/06/08 в 01:43
 localhost
удалять по шедулеру не проблема
проблема однако в том, что я не знаю кто плодит сессии
цитата
05/06/08 в 07:26
 Corex
Какой конкретно скрипт создаёт определённую сессию просто так узнать не получится. В принципе, как ты и написал, любой скрипт, который содержит вызов session_start инициирует создание файла сессии.
Можно попробовать вычислить как предложил _s_[sov] - посмотреть какие скрипты генерят сессии. Вруби в конфиге session.use_trans_sid = 1, у ссылок на сайтах, где стартуют сессии, появятся постфиксы вида PHPSESSID=ccc3bab6f353a43d1cc67ad2f69eb158.
цитата
07/06/08 в 12:27
 Sha
Ещё как вариант создать для каждого сиджа NAME свой подкаталог /tmp/cjNAME
И вначале скриптов перед вызовом
session_start()
раздать вызовы
session_save_path('/tmp/cjNAME')
Потом смотреть в чьём каталоге бардак. Далее смотреть логи сиджа и т.п.


Эта страница в полной версии