我应该如何处理太多的会话文件?
-
16-10-2019 - |
题
我是几个持有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。直到我安装 洋红色优化器 这使所有这些常规都对我有用。另外,我的缓存不断刷新,在更换产品和静态块之后,我不会手动。哦,是的,错误报告和废弃的购物车也被清洁。
在上面的所有评论中,我认为这是一个简单的解决方案,希望它比长脚本和安装第三方扩展程序更好,以管理旧会话文件并保留新的会话文件。
- 在您的下方创建文件名“ clean_session.sh”
magento
文件夹。 - 粘贴这些线。
#!/bin/bash
# delete session files older than 14 days
find /home/DOMAIN/public_html/var/session -name 'sess_*' -type f -mtime +14 -exec rm {} \;
- 然后,您可以每周安排Cronjob进行清理。
1 1 * * 6 /bin/sh /home/DOMAIN/public_html/clean_session.sh
- 不要忘记使文件可执行
chmod u+x clean_session.sh
- 而且您也可以将其运行
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);