ОсновноеRadiotalkПользовательское
Webserv24 - Панель управления хостингом
11   •   Посмотреть все темы

Как зашедулить очистку каталога?

 

9
SMax @SMax
можно ли использовать команду find?
Чтобы запланировать выполнение команды такого вида: 00 20 * * * /usr/bin/find /home/backup/ -name "*.gz" -mtime +8 -delete

проблема возникла из следующего.
1. На нашем сайте слетали сессии по времени.
Стало понятно, что ID-сессий у вас на хостинге хранятся в общем каталоге, которые чистится раз приблизительно в 20минут.

2. Для того чтобы решить эту проблему и "не пинать" сапорт, я вынес хранение ID-сессий в отдельный каталог своего хостинга.

3. Сегодня возникла проблема, что каталог достиг лимита по кол-ву файлов.

Помогите решить эту проблему.


P.S.
пользуюсь хостингами большого кол-ва компаний и работаю по сайтостроительству с 2000го года, но на проблему с удалением ID-сессий натолкнулся первый раз и только у вас.

9
SMax @SMax
passthru() разрешить самому можно?

363
Максим @Максим
passthru - для использовании ее необходим шелл, т.е. от тарифов Профи

20090
Dimitry @Dimitry
Для очистки своих сессий нужно активировать

ini_set(‘session.gc_probability’,1);


также настроить эти параметры если надо
ini_set(‘session.gc_maxlifetime’,3000);
ini_set(‘session.gc_divisor’,100);

9
SMax @SMax
я установил gc_maxlifetime в 86400 и не протестировал, из-за чего место в папке и закончилось..

а сейчас увидел:
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.

а gc_probability/dc_divisor я так понимаю, поудаляют всё равно все sess_id, когда вероятность сработает...

и что получается, только ради этой задачи мне на тарифный план ПРО переходить?

20090
Dimitry @Dimitry
gc_probability/dc_divisor
это и есть garbage collection, как написано что работать не будет вообще (
следовательно надо свой скрипт запускать по крону для очистки, зачем про? нужен крон - это стандарт
А вообще у нас своя чистка для улучшенной защиты сессий, иначе пользователи одного сервера смогут у друг друга сессии воровать.

/usr/bin/find /home/user/sess_path/ -type f -cmin +1440 -delete

команда как то так, жирным число минут

6600
Александр @admiral
Так же можно выполнять php скрипт очистки папки по расписанию (по cron), например как простенький вариант очистки:
<?php
$directory = '/home/user/sess_path';

if ($handle = opendir($directory)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
unlink ("$directory/$file");
}
}
closedir($handle);
}
?>

Тут только путь до папки с сессиями нужно указать - /home/user/sess_path и в планировщике задать время на выполнение этого скрипта:
1 1 * * * /usr/local/bin/php /home/user/cron_clear_sess.php

Где 1 1 * * * - запуск скрипта раз в сутки, а cron_clear_sess.php - сам скрипт, при чем даже прав на выполнение не нужно такому скрипту, достаточно стандартных - 644

6600
Александр @admiral
Или вот более продвинутый вариант, в комментариях на сколько можно больше объяснил его работу, думаю этого будет достаточно понять его работу, можно обернуть в функцию и вызывать в любом месте вручную или прямо так как есть запускать по cron'у
<?php
/**
* @author admiral
* @copyright 2012
*/

// Время через которое файл считается устаревшим (в секундах)
$expire_time = 300;
// Директория с файлами сессий
$directory = $_SERVER['DOCUMENT_ROOT']."/tmp/";
// проверяем, что $directory - каталог
if (is_dir($directory)) {
// открываем каталог
if ($handle = opendir($directory)) {
// читаем и выводим все файлы
while (($file = readdir($handle)) !== false) {
// текущее время
$time_sec=time();
// время изменения файла
$time_file=filemtime($directory . $file);
// тепрь узнаем сколько прошло времени (в секундах)
$time=$time_sec-$time_file;
// удаляем устаревшие файлы
$unlink = $_SERVER['DOCUMENT_ROOT'].'/tmp/'.$file;
if (is_file($unlink)){
if ($time>$expire_time){
if (unlink($unlink)){
echo 'Файл ',$file,' удален <br />';
}else {
echo 'Ошибка при удалении файла ',$file,'<br />';
}}}}
// и закрываем каталог
closedir($handle);
}}

?>

$_SERVER['DOCUMENT_ROOT'] - директория, где лежит файл скрипта
tmp - папка с в этой директории с файлами сессий
Лишнее чего ненужно в этом скрипте, например вывод удаления файлов или ошибки при удалении файлов, можно удалить с скрипта, написал чисто для проверки работы и вообще для полноты картины

6600
Александр @admiral
Dimitry пишет:

/usr/bin/find /home/user/sess_path/ -type f -cmin +1440 -delete

команда как то так, жирным число минут

Dimitry, это проверил, крон в панели + не пропускает )

9
SMax @SMax
admiral пишет:

Dimitry, это проверил, крон в панели + не пропускает )

да я тоже попробовал сначала подобное, прежде чем сюда писать.

в результате, получается, что только PHP-скриптом всё-таки обрабатывать.

20090
Dimitry @Dimitry
Ну так плюсик мы разрешим, какой сервер?

9
SMax @SMax
спасибо. я уже PHP-скрипт настроил и зашедулил.

Может быть лучше поправите момент, из-за которого это всё и завязалось?
Чтобы garbage collection хранилась/чистилась для каждого хостинга отдельно?

6600
Александр @admiral
Dimitry пишет:

Ну так плюсик мы разрешим, какой сервер?

Я на своем проверял и выборочно для проверки на s23, так что думаю это на всех серверах с + не проходит

20090
Dimitry @Dimitry
$SMax$ пишет:

спасибо. я уже PHP-скрипт настроил и зашедулил.

Может быть лучше поправите момент, из-за которого это всё и завязалось?
Чтобы garbage collection хранилась/чистилась для каждого хостинга отдельно?

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

6600
Александр @admiral
$SMax$, вариант с планировщиком попробуй, обновили, сейчас должно через cron работать