Многие IP-камеры и видеорегистраторы имеют функцию загрузки записей на FTP-сервер. У такого подхода есть множество преимуществ, как минимум, записи хранятся не только на самом записывающем устройстве, но и на удаленном сервере. Это гарантирует сохранность записей даже в случае возникновения внештатных ситуаций на объекте.
При использовании только стандартных средств прошивки, по мере накопления записей, возникает необходимость периодической чистки хранилища. Делать это вручную — можно, но неудобно. А, в том случае, если запись ведется по движению, понять когда нужно чистить хранилище — практически невозможно.
PHP-скрипт для автоматической очистки FTP-сервера
После непродолжительного поиска готовых решений, ввиду их отсутствия, было принято решение написать простой PHP-скрипт, который будет каждую ночь запускаться по Cron. В его задачи будет входить проверка «веса» директории с записями на сервере и, в случае превышения определенного, — удаление старых записей. Также он записывает названия удаляемых файлов и их количество в лог. Вот код получившегося скрипта:
<?php
$ftp_server = "ftp.example.com"; //Адрес FTP сервера
$port = 21; //Порт FTP сервера
$ftp_username = "username"; //Имя пользователя
$ftp_userpass = "password"; //Пароль
$main_dir = "/Camera/"; //Путь к папке с записями
$main_size = 21474836480; //Нужный размер архива в Байтах (20 Гигабайт = 21474836480 Байт)
$conn = ftp_connect($ftp_server, $port);
ftp_login($conn, $ftp_username, $ftp_userpass);
ftp_pasv($conn, true);
$count_delete = 0;
$names_delete = "";
while (calculate_whole_directory($conn, $main_dir) > $main_size) {
$contents = ftp_nlist($conn, $main_dir);
if (!empty($contents)) {
foreach ($contents as $file) {
$array[] = ftp_mdtm($conn, $file);
}
$delete_file = $contents[array_search(min($array), $array)];
ftp_rrmdir($conn, $main_dir . $delete_file);
$count_delete++;
$names_delete = $names_delete . " " . $delete_file;
}
}
file_put_contents('log.txt', date("d.m.Y H:i:s") . " Удалено " . $count_delete . " директорий:" . $names_delete . "\n", FILE_APPEND);
ftp_close($conn);
function ftp_rrmdir($conn_id, $directory)
{
$lists = ftp_mlsd($conn_id, $directory);
unset($lists[0]);
unset($lists[1]);
foreach ($lists as $list) {
$full = $directory . '/' . $list['name'];
if ($list['type'] == 'dir') {
ftp_rrmdir($conn_id, $full);
} else {
ftp_delete($conn_id, $full);
}
}
ftp_rmdir($conn_id, $directory);
return true;
}
function calculate_whole_directory($ftp_conn, $directory)
{
$lines = ftp_rawlist($ftp_conn, $directory);
$result = 0;
foreach ($lines as $line) {
$tokens = preg_split("/\s+/", $line);
$name = $tokens[8];
if ($tokens[0][0] === 'd') {
$size = calculate_whole_directory($ftp_conn, "$directory/$name");
} else {
$size = intval($tokens[4]);
}
$result += $size;
}
return $result;
}
Для установки, создадим файл с названием «ftp_delete.php» в домашней папке нашего пользователя. Затем, откроем его на редактирование. Скопируем туда код скрипта. Нам потребуется изменить значения следующих переменных:
$ftp_server = "ftp.example.com"; //Адрес FTP сервера
$port = 21; //Порт FTP сервера
$ftp_username = "username"; //Имя пользователя
$ftp_userpass = "password"; //Пароль
$main_dir = "/Camera/"; //Путь к папке с записями
$main_size = 21474836480; //Нужный размер архива в Байтах (20 Гигабайт = 21474836480 Байт)
Чтобы скрипт выполнялся автоматически в нужное нам время, добавим его в Cron. Выполним «crontab -e» и скопируем туда строку:
0 4 * * * /usr/bin/php /home/user/ftp_delete.php >/dev/null 2>&1
В данном случае, скрипт «ftp_delete.php» по адресу: /home/user/ будет выполняться каждый день в 4 часа утра интерпретатором PHP. Установка завершена.