Как мне обрабатывать файлы сеансов, которые становятся слишком многочисленными?

magento.stackexchange https://magento.stackexchange.com/questions/41

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

Мое решение - ночной кронтаб, который выполняет что -то подобное find /path/to/magento/sessions/ -name "sess*" -type f -delete Но это кажется неэлегантным, если не сказать больше.

Как лучше всего справиться с ними?

Это было полезно?

Решение

Помимо удаления файлов сеанса с find Используя пользовательское время модификации, как упомянуто другие, вы также можете:

  • Спасти сеансы в вашей базе данных. Анкет Конечно, это будет нагрузка на вашу базу данных, и это не самый быстрый способ, но вы можете справиться с большим количеством сеансов таким образом, и вы можете поделиться сеансами между несколькими фронтальными серверами. Вы можете изменить настройку в app/etc/local.xml переключив

    <session_save><![CDATA[files]]></session_save>
    

    к

    <session_save><![CDATA[db]]></session_save>
    
  • Использовать мемкахед в качестве хранилища сеанса. Magento также поддерживает это по умолчанию. Посмотри на app/etc/local.xml.additional Для конфигурации. Я никогда не использовал его в производстве, но слышал, что это может быть немного сложно.

  • Обрабатывать Сессии в Редисе Использование Colin Mollenhours блестящее расширение Cm_redissession. Анкет Настройка Redis не должна занимать слишком долго, также может использоваться для кэширования (см. Cm_cache_backend_redis) и объединяет кеш оперативной памяти с постоянством на диске (в противоположность Memcached, Ram -диски или тому подобное), что всегда на случай, если ваш сервер сбой.

Другие советы

Благодаря сеансам на основе файлов они будут автоматически подготовиться к PHP Session Cron-Up-поэтому файлы, вероятно, будут удалены в течение ~ 7200 секунд создания. Таким образом, даже на оживленном сайте (30 тыс. Uniques в день), обычно только около 4000 файлов сеанса в.

Тем не менее, очистка на самом деле зависит от работы Cron, что обычно не смотрит в каталоге Magento ./var/session. Итак, вы должны настроить новый системный Cron

/usr/bin/find /home/myuser/public_html/var/session -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 -exec rm {} \; >/dev/null 2>&1

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

Благодаря сеансам Memcache TCP/IP является единственным накладным расходом, который для развертывания одного сервера сделает его медленнее, чем на основе файлов. Итак, вы бы использовали вместо этого сокет UNIX, который удаляет эту накладную расходы и обеспечивает лучшую безопасность. Но даже тем не менее, ваши сессии клиентов будут усечены/ограничены в отношении количества оперативной памяти, которую вы можете выделить. Средний сеанс Magento составляет 4 КБ - так что вы сможете поддерживать 256 активных сеансов, на MB, вы распределяете. Поэтому обязательно установите соответствующий лимит, чтобы избежать случайной теряющейся корзины/сеанса. А также имейте в виду, что перезапуск Daemon Memcache вытирает все существующие сеансы (плохие!).

С Redis (не родным, но доступным через расширение), вы получаете аналогичный уровень поддержки, как и Memcache, но с дополнительными преимуществами настойчивости (если вы хотите использовать его). С расширением CM_Redis вы также сможете воспользоваться сжатием сеанса. Мы обнаружили, что это расширение очень хорошо работает как для развертывания CE, так и для EE.

Настройка срока действия сношения по умолчанию составляет мощную 1 неделю, поэтому при примере вышеуказанного размера хранилища (30 тыс. Уникальных Ваш магазин полностью останавливается, почти для каждой операции на основе сеанса.

От опыта хостинга Как крупные (230 тыс. Уникальных посетителей в день), так и небольшие (<1K уникальные посетители в день), наша рекомендация:

Развертывание одного сервера - файлы

Развертывание с несколькими серверами - Redis (используя отдельную базу данных из основного кэша Magento)

Я написал здесь действительно тщательные ответы http://magebase.com/magento-tutorials/magento-session-storage-which-to-choose-and-why/comment-page-1/#comment-1980

Я задал связанный вопрос некоторое время назад:

https://stackoverflow.com/questions/7828975/php-garbage-collection-clarification

То, чего я никогда не узнал (я оставил эту работу для новой, и первоначальная проблема стала чужой), так это то, что сессии Magento выполнят эти настройки, или если они реализуют свою сессию, используя Zend (и, по -видимому, какой -то какой -то Zend.ini файл конфигурации).

Настройки PHP, чтобы посмотреть:

session.gc_maxlifetime session.gc_probability session.gc_divisor

http://php.net/manual/en/session.configuration.php#ini.session.gc-probability

Обычно достаточная работа Cron достаточно, но вот несколько вещей, которые нужно помнить:

1) Установите сеанс, чтобы продлиться не дольше, чем session.gc_maxlifetime (php -i | grep session.gc_maxlifetime) Секунды (это создаст истекшие сессии, которые будут готовы к сбору мусора Php.ini или .htaccess)

2) Вы можете хранить сеансы в базе данных. здесь Для получения дополнительной информации о том, как это сделать (этой опцией может быть легче управлять с помощью пользовательского модуля Magento)

3) Еще один вариант, который нужно рассмотреть, заключается в том, что Witch Memcached также может ускорить серверы (хотя и не полностью связанный с вопросом, я думаю, что это полезно знать)

Смотрите этот вопрос для получения дополнительной информации: https://stackoverflow.com/questions/4353875/how-long-do-the-magento-session-files-need-be-kept

Во всех наших настройках у нас есть файл maintains.php, который время от времени заботится о очистке журналов и WAR Directory. Поскольку сеансы должны быть сохранены в базе данных или в файловой системе, этот файл обслуживания очистит их обоих. (См. Код ниже).

Вы можете запустить следующую команду в качестве задания Cron, чтобы очистить журналы:

php maintenance.php clean=log

Приведенная выше команда будет создавать следующий выход:

catalogindex_aggregation has been truncated
catalogindex_aggregation_tag has been truncated
catalogindex_aggregation_to_tag has been truncated
catalog_compare_item has been truncated
dataflow_batch_export has been truncated
dataflow_batch_import has been truncated
log_customer has been truncated
log_quote has been truncated
log_summary has been truncated
log_summary_type has been truncated
log_url has been truncated
log_url_info has been truncated
log_visitor has been truncated
log_visitor_info has been truncated
log_visitor_online has been truncated
report_compared_product_index has been truncated
report_event has been truncated
report_viewed_product_index has been truncated

Вы можете запустить следующую команду в качестве задания Cron, чтобы очистить папку VAR:

php maintenance.php clean=var

Приведенная выше команда будет создавать следующий выход:

downloader/.cache/* has been emptied
downloader/pearlib/cache/* has been emptied
downloader/pearlib/download/* has been emptied
var/cache/ has been emptied
var/locks/ has been emptied
var/log/ has been emptied
var/report/ has been emptied
var/session/ has been emptied
var/tmp/ has been emptied

Фактический код (не забудьте настроить путь к вашему файлу local.xml):

<?php
$xml = simplexml_load_file('./app/etc/local.xml', NULL, LIBXML_NOCDATA);

$db['host'] = $xml->global->resources->default_setup->connection->host;
$db['name'] = $xml->global->resources->default_setup->connection->dbname;
$db['user'] = $xml->global->resources->default_setup->connection->username;
$db['pass'] = $xml->global->resources->default_setup->connection->password;
$db['pref'] = $xml->global->resources->db->table_prefix;

if (!isset($argv[1]) || !stristr($argv[1], 'clean=')) {
    echo 'Please use one of the commands below:' . PHP_EOL;
    echo 'php maintenance.php clean=log' . PHP_EOL;
    echo 'php maintenance.php clean=var' . PHP_EOL;
    die;
}

$method = str_replace('clean=', '', $argv[1]);

switch ($method) {
case 'log':
    clean_log_tables();
    break;
case 'var':
    clean_var_directory();
    break;
default:
    echo 'Please use one of the commands below:' . PHP_EOL;
    echo 'php maintenance.php clean=log' . PHP_EOL;
    echo 'php maintenance.php clean=var' . PHP_EOL;
    break;
}

function clean_log_tables() {
    global $db;

    $tables = array(
        'catalogindex_aggregation',
        'catalogindex_aggregation_tag',
        'catalogindex_aggregation_to_tag',
        'catalog_compare_item',
        'dataflow_batch_export',
        'dataflow_batch_import',
        'log_customer',
        'log_quote',
        'log_summary',
        'log_summary_type',
        'log_url',
        'log_url_info',
        'log_visitor',
        'log_visitor_info',
        'log_visitor_online',
        'report_compared_product_index',
        'report_event',
        'report_viewed_product_index'
    );

    mysql_connect($db['host'], $db['user'], $db['pass']) or die(mysql_error());
    mysql_select_db($db['name']) or die(mysql_error());

    foreach($tables as $v => $k) {
        @mysql_query('TRUNCATE `'.$db['pref'].$k.'`');
        echo $db['pref'] . $k . ' has been truncated' . PHP_EOL;
    }
}

function clean_var_directory() {
    $dirs = array(
        'downloader/.cache/*',
        'downloader/pearlib/cache/*',
        'downloader/pearlib/download/*',
        'var/cache/',
        'var/locks/',
        'var/log/',
        'var/report/',
        'var/session/',
        'var/tmp/'
    );

    foreach($dirs as $v => $k) {
        exec('rm -rf '.$k);
        echo $k . ' has been emptied' . PHP_EOL;
    }
}

Для Magento CMS и тому подобного (которые не очищают старые сеансы), я просто использую задания Cron на основе настройки PHP.INI.

Php5/ubuntu 14.04/debian

System Cron.d Setup для PHP5 не очищает magento ./var/session (или что -то, кроме папки сеанса по умолчанию (/var/lib/php5 для Ubuntu и/var/lib/php5/sessions или/tmp/для большинства других Linux Dists).

Но вы все равно можете использовать «SessionClean» и «maxlifetime» в соответствии с по умолчанию PHP5/Debian System Cron:

Пример вы можете попробовать из командной строки:

# sudo /usr/lib/php5/sessionclean /var/www/{yoursite}/var/session $(/usr/lib/php5/maxlifetime)

Так что просто включите это в систему/корневую Crontab или Crontab пользователя, который имеет разрешение на чтение/запись для файлов сеанса:

$ sudo crontab -e

Добавьте это, вы хотите, чтобы это выглядело похоже на систему Php Cron:

20,40 * * * * [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/www/*/var/session ] && /usr/lib/php5/sessionclean /var/www/{yoursite}/var/session $(/usr/lib/php5/maxlifetime)

или - так как мы знаем, что эти файлы/режимы существуют:

20,40 * * * * /usr/lib/php5/sessionclean /var/www/*/var/session $(/usr/lib/php5/maxlifetime)

Теперь у меня есть управляемое количество сеансов, и оно сохраняется чистым с помощью сбора/срока службы мусора по умолчанию через настройки PHP.INI (CLI).

(Вы можете покинуть подстановку выше или заменить на SiteName.)

Изменить (PHP7 / Ubuntu 16.xx / Debian):

Сценарий «SessionClean» изменился, и сценарий Maxlifetime был удален. Для работы System/Php Cron это теперь один сценарий. Вы не можете больше использовать это, так как файловые вызовы теперь статичны для скрипта.

Более старый Php5 SessionClean Скрипт все еще может работать для вас, если система не убирает. Что вы можете сделать, это взять старше Debian PHP5 пакет и извлечь sessionclean от него. Или вы можете просто скопировать это в область сценариев (давая правильное/var/www/(сайт) разрешения/владение):

#!/bin/sh

# first find all used files and touch them (hope it's not massive amount of files)
[ -x /usr/bin/lsof ] && /usr/bin/lsof -w -l +d "${1}" | awk -- '{ if (NR > 1) { print $9; } }' | xargs -i touch -c {}

# find all files older then maxlifetime
find "${1}" -depth -mindepth 1 -maxdepth 1 -ignore_readdir_race -type f -cmin "+${2}" -delete

Я также рекомендую переименовать его, поэтому это не путается с новым PHP 'SessionClean' Cronjob. Затем вы можете подключить свой собственный номер «maxlifetime», как SO:

     20,40 * * * * /home/-username-/scripts/MySessionClean /var/www/*/var/session 61

(61 является примером возраста (за считанные минуты) и «MysessionClean» - это переименованный сценарий PHP5, загруженный или скопированный сверху).

Таким образом, мы избегаем полностью вызовов php.ini/env.

(Изменить 13dec2016: Обновленная ссылка на архив Debian Archive)

Я считал DB наоборот из всех этих старых файлов сеанса. Это была раздражающая ручная работа, пока я не установил Magento Optimizer Что делает для меня все эти обычные работы. Кроме того, мой кэш постоянно обновляется, и я не вручную после изменения продуктов и статических блоков. О, да, отчеты об ошибках и заброшенные тележки также очищаются.

Из всех приведенных выше комментариев, я думаю, это простое решение, и надеюсь, что оно лучше, чем длинные сценарии и установка расширения сторонних сторон для управления файлами старых сеансов и сохранения новых файлов сеансов.

  1. Создайте имя файла "clean_session.sh" под вашим magento папка.
  2. Вставьте эти линии.

#!/bin/bash
# delete session files older than 14 days
find /home/DOMAIN/public_html/var/session -name 'sess_*' -type f -mtime +14 -exec rm {} \;

  1. Затем вы можете запланировать еженедельный Cronjob для выполнения уборки.

1 1 * * 6 /bin/sh /home/DOMAIN/public_html/clean_session.sh

  1. Не забудьте сделать исполняемый файл как

chmod u+x clean_session.sh

  1. И вы также можете запустить это как

sh clean_session.sh

Для моего случая я запускаю этот сценарий magento/var/ каталог для удаления файлов сеанса более чем на неделю (-mtime +7) старый:

#!/bin/sh
# Place this script in magento/var/ directory

for n in `seq 0 9`
  do
    for u in `seq 0 9`
    do
      for m in `seq 0 9`
        do
          name="sess_"$n$u$m*
          echo $name
          find session/ -name $name -type f -mtime +7 -delete
          echo $name ok
      done
      for m in {a..z}
        do
          name="sess_"$n$u$m*
          echo $name
          find session/ -name $name -type f -mtime +7 -delete
          echo $name ok
      done
    done
      for u in {a..z}
      do
        for m in `seq 0 9`
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
        for m in {a..z}
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
    done
done

for n in {a..z}
  do
    for u in `seq 0 9`
      do
        for m in `seq 0 9`
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
        for m in {a..z}
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
    done
    for u in {a..z}
      do
        for m in `seq 0 9`
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
        for m in {a..z}
          do
            name="sess_"$n$u$m*
            echo $name
            find session/ -name $name -type f -mtime +7 -delete
            echo $name ok
        done
    done
done

Это мой первый сценарий Bash (Revision 2), и я думаю, что он может быть оптимизирован в нескольких аспектах. Я открыт для любого предложения оптимизации.

Этот сценарий можно получить по адресу: https://gist.github.com/nolwennig/a75dc2f8628be2864bb2

Я создал скрипт, который опустошает каталог VAR/Session. Вы можете добавить его к работе Cron, чтобы запустить один раз в день, что должно быть достаточно, и при необходимости отрегулировать. Вы заметите, что когда вы будете заполнены сеансом, невозможно удалить файлы через CPanel или SSH, этот скрипт сделает трюк просто место в каталоге Magento Root.

<?php
function adjustSessionFiles($dir, $pattern = "*")
{
    $files = glob($dir . "/$pattern");
    foreach ($files as $file) {
        if (is_dir($file) and !in_array($file, array('..', '.')))  {
            adjustSessionFiles($file, $pattern);
        }else if(is_file($file) and ($file != __FILE__)) {
            unlink($file);
        }
    }
}
$dir = __DIR__ . DIRECTORY_SEPARATOR . 'var' . DIRECTORY_SEPARATOR . 'session';
adjustSessionFiles($dir);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top