我是几个持有Magento站点的服务器的Sysadmin,偶尔会填充会话文件。

有人告诉我,管理这些文件不是在Magento内部可以做的事情,我认为它们的临时使用意味着它们不能仅仅被关闭,但是Magento无法处理这些删除这些东西似乎很奇怪文件?

我的解决方案是夜间的crontab,可以执行这样的操作 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 用于配置。我从未在生产中使用它,但听说这可能有些棘手。

  • 处理 Redis的会议 使用Colin Mollenhours出色的扩展 cm_redissession. 。设置redis不应占用太长时间,也可以用于缓存(请参阅 cm_cache_backend_redis)并将RAM缓存与磁盘上的持久性(反对模因,RAM磁盘等)相结合,以防您的服务器崩溃。

其他提示

借助基于文件的会话,它们将通过PHP会话清理CRON自动进行 - 因此,这些文件可能会在创建的7200秒内删除。因此,即使在繁忙的站点(每天30k唯一的唯一)中,通常只有大约4,000个会话文件。

但是,清理实际上依赖于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套接字,从而删除开销并提供更好的安全性。但是,即使您的客户会议仍然会被截断/有限,您可以分配的RAM数量。平均Magento会话为4KB - 因此,您可以分配的MB支持256个活动会话。因此,请确保设置适当的限制,以避免客户随机丢失购物车/会话。还要记住,Memcache守护程序重新启动将消除所有现有的会话(不好!)。

对于Redis(不是本地的,但可以通过扩展名获得),您将获得与Memcache相似的支持水平,但具有持久性的额外好处(如果您希望使用它)。使用CM_REDIS扩展程序,您还可以利用会话压缩。我们发现此扩展程序在CE和EE部署都非常有效。

使用DB,默认的西梅过期设置是一个强大的1周,因此以上商店的大小为例(每天30k唯一的唯一唯一),您将查看7GB左右的core_cache_session的db表大小 - 这将磨碎几乎每个基于会话的操作,您的商店都会完全停止。

从托管的经验 我们的建议是:

单人部署 - 文件

多服务器部署-REDIS(使用主要Magento Cache的单独数据库)

我在这里写了一些非常彻底的答复 http://magebase.com/magento-tutorials/magento-session-session-session-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-probibalibal

通常,克朗的工作就足够了,但是这里有一些要记住的事情:

1)将会话设置为持续时间不超过 session.gc_maxlifetime (php -i | grep session.gc_maxlifetime)秒(这将设置已过期的会话,为php.ini或.htaccess准备垃圾收集)

2)您可能想在数据库中存储会话 这里 有关如何执行此操作的更多信息(此选项可能更易于通过自定义Magento模块管理)

3)要考虑的另一个选择是纪念女巫也可以加快服务器的速度(尽管与问题没有完全连接,但我认为知道这很有用)

有关更多信息,请参阅此问题: https://stackoverflow.com/questions/4353875/how-long-do-the-magento-sessise-files-files-need-need-to-be-beept

在我们的所有设置上,我们都有一个维护.php文件,该文件会偶尔处理日志和var目录的清洁。由于必须将会话保存在数据库中或文件系统中,因此此维护文件将两者都清除。 (请参阅下面的代码)。

您可以将以下命令作为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等(没有清理旧会话),我只是根据PHP.Ini设置使用CRON作业。

php5/ubuntu 14.04/debian

php5的系统cron.d设置不清洁洋红色./ var/session(或除默认会话文件夹(ubuntu和/var/lib/php5)外,以及/var/var/lib/lib/php5/sessions或/tmp/for其他大多数Linux区)。

但是您仍然可以根据默认的PHP5/Debian System Cron使用“ SessionClean”和“ Maxlifetime”:

示例您可以从命令行尝试:

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

因此,只需将其纳入已读/写入会话文件的用户的系统/root 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)

或 - 由于我们知道这些文件/dir存在:

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脚本已被删除。对于系统/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”号码插入这样的标准:

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

(61为年龄(以分钟为单位)和“ MysessionClean”为重命名的PHP5脚本,从上面下载或复制)。

通过这种方式,我们完全避免使用PHP.Ini/Env完全调用。

(编辑13dec2016:更新的Debian档案存储储备链接)

我从所有这些旧会话文件中清除了DB Regually。直到我安装 洋红色优化器 这使所有这些常规都对我有用。另外,我的缓存不断刷新,在更换产品和静态块之后,我不会手动。哦,是的,错误报告和废弃的购物车也被清洁。

在上面的所有评论中,我认为这是一个简单的解决方案,希望它比长脚本和安装第三方扩展程序更好,以管理旧会话文件并保留新的会话文件。

  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脚本(修订2),我认为它可以在几个方面进行优化。我愿意为任何优化建议。

该脚本可以检索到: https://gist.github.com/nolwennig/a75dc2f8628be2864bb2

我创建了一个清空var/session目录的脚本。您可以将其添加到Cron工作中以每天运行一次,这应该足够并根据需要进行调整。您会注意到会话目录被填写时,不可能通过CPANEL或SSH删除文件,此脚本将在Magento Root Directory中完成问题。

<?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归因
scroll top