some image

Нюансы работы PHP session.gc_maxlifetime

Работа

… или почему на некоторых хостингах сессии долго не живут.

Использование ini_set(‘session.gc_maxlifetime’, value); в коде приложения отнюдь не гарантирует сессиям долгую жизнь. Устанавливая эту директиву, вы лишь обеспечиваете, что garbage collector, запущенный из вашего приложения будет  удалять во временной папке сессии, ориентируясь на это время.

Если же garbage был запущен из другого скрипта со своими или дефолтными настройками, он будет удалять файлы, естественно, не оглядываясь на параметр из первого абзаца.

Пример. Вы установили в своем main приложении время жизни сессии 7 дней. Garbage, инициированный вашим приложением, заходит и удаляет все файл старше семи дней.

Но тут вы запускаете на этом же сервере скрипт rebuildDatabase.php, у которого этих настроек нет и берутся дефолтные из php.ini: 1 день. И срабатывает GC. В лучшем случае он удалит все сессии, которые должны были жить несколько дней. В худшем — повесит весь сервер если файлов на удаление оказалось очень много.

Так что на хостинге, где на одном сервере крутится много сайтов и администраторы не позаботились о разделении папок сессий, не редки ситуации, когда изменение  session.gc_maxlifetime просто не работает, т.к. кто-то другой поставил его меньше и постоянно выкашивает ваши сессии.

Мораль: используя в своем проекте ini_set(‘session.gc_maxlifetime’, value), всегда меняйте дефолтную папку вызовом ini_set(‘session.save_path’, value). Ну и про глюки garbage collector php не забываем.

Не удаляются файлы сессий PHP

Метки: , , , Работа

Частая проблема — tmp папка web сервера вдруг содержит n миллионов файлов. Скорее всего это файлы сессий. И образовались они там не вдруг, а за пару месяцев/лет.

Диагностируем

Во первых, затруднительно посмотреть, что находится в папке, т.к. ни FAR, ни виндовый проводник (серверы с проблемой были на windows) не хотят такую папку открывать (FAR вылетал забрав 1гб оперативной памяти, где-то на чтении трехмиллионного файла). Как зайти в папку, содержащую много файлов? Переходим в папку в консоле через cd (переходит махом не зависимо от количества файлов) и пишем:

dir /p

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

Исправляем

Что же произошло и почему garbage collector (далее GC) PHP забил на вашу tmp папку и сто лет ее не чистил?

1) Возможно, не правильно заданы параметры php.ini  session.gc_probability и session.gc_divisor. Вероятность запуска GC при каждом запуске скрипта - session.gc_probability / session.gc_divisor. По умолчанию — 1/100. Соответственно, если задать session.gc_probability = 0 GC не запустится никогда. Соответсвующие параметры нужно проверить и в коде приложения.

2) Возможно, вы изменили session.save_path в своем приложении, и теперь она отличается от той, которая в php.ini. В этом случае GC чистить в вашей кастомной папке ничего не будет и вам нужно заботиться об этом самим, т.к. он чистит только папку, которая указана в 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

3) Последнее, самое непонятное. Возможно, вы стали жертвой бага - https://bugs.php.net/bug.php?id=55333 Не знаю, правда это или нет, и баг ли это php или криворукость админов, но у меня на двух серверах, где не была изменена папка сессий по умолчанию, и все сохранялось в «C:/Windows/Temp», GC не работал. И это при абсолютной идентичности других настроек с серверами, где папка была изменена и все было ок. Решил проблему просто — сменил папку с дефолтной на свою, чего и вам желаю.

Удаляем

В tmp папке на момент решения проблемы было 4 миллиона файлов. Удалил их просто:

del sess_*

Процесс удаления не слишком нагружает сервер, и было решено просто запустить операцию на сутки. Тихо мирно все старые файлы сессий были выкошены. Обязательно перед удалением меняйте tmp папку сессий, т.к. иначе пользователи вашего ресурса будут все сутки без конца разлогиниваться (в лучщем случае), а в худшем будут толстые дата лосы из-за вашей невнимательности. Сначала смените путь в php.ini, потом удаляйте.

Для Linux серверов есть хорошая статья на хабре: http://habrahabr.ru/post/152193/

Эта страна обречена

Метки: Обо всем

Собрался на почте забрать свежие фоточки гонщика от ГИБДД. На неделе вообще времени не было, решил, что в субботу то уж точно надо. Прихожу — хер. По выходным мое почтовое отделение не работает. Сраная чебуречная рядом шкварчит, а почта не работает! Эту дебильную контору спасет только полное уничтожение.

Rework. Бизнес без предрассудков.

Обо всем


Пару недель назад купил и прочитал эту книгу.

Ощущения противоречивые. С одной стороны, меня наебали. Книга, при объеме в 200 страниц и цене в 600 рублей, читается за 4 часа. Куча картинок ни о чем и крупный кегль говорят нам о том, что  авторы и издатели явно жаднющие до денег, и, по-хорошему, формат этой книги — мягкая обложка и 50 страниц. С другой стороны, я не жалею потраченного времени. Цитаты из нее остаются в голове и всплывают в жизненных ситуациях. Хотя многие выводы и советы противоречивы, большинство для меня пришлись кстати.

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

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

В целом понравилось.

Принудительное уменьшение объема файла данных SQL server

Метки: , Работа

Столкнулся с ситуацией: файл базы разросся за счет ошибки в приложении и заполнении одной из таблиц мусором. Ошибка исправлена, таблица вычищена, а файл базы не уменьшается. Это особенность mssql, при уменьшении объема данных свободное место системе не возвращается, а резервируется.

Read More

Initial post

Метки: Обо всем

Скажите, как часто вы слышите слово мотивация? Я — постоянно. Все себя мотивируют: читают книги, смотрят фильмы, даже музыку мотивирующую слушают. В социальных сетях есть группы любителей мотивации. А как ничего не делали так и не делают, как не работали так и не работают, как не могли жопу со стула поднять — так сидя и мотивируются.

Так вот, в первом посте я оставляю мотивирующую запись для себя в будущем:

ВОЗЬМИ И СДЕЛАЙ!