From 460b6d1c75c5187bb8e51c39c847ff9f8cf37a73 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 20 Dec 2020 06:22:31 +0000 Subject: [PATCH] Remove unused cached avatar photo entries --- src/Worker/Cron.php | 2 + src/Worker/RemoveUnusedAvatars.php | 60 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/Worker/RemoveUnusedAvatars.php diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index be102bca8..1901766d3 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -119,6 +119,8 @@ class Cron Worker::add(PRIORITY_LOW, 'RemoveUnusedContacts'); + Worker::add(PRIORITY_LOW, 'RemoveUnusedAvatars'); + // check upstream version? Worker::add(PRIORITY_LOW, 'CheckVersion'); diff --git a/src/Worker/RemoveUnusedAvatars.php b/src/Worker/RemoveUnusedAvatars.php new file mode 100644 index 000000000..0d9c0f6fb --- /dev/null +++ b/src/Worker/RemoveUnusedAvatars.php @@ -0,0 +1,60 @@ +. + * + */ + +namespace Friendica\Worker; + +use Friendica\Core\Logger; +use Friendica\Core\Protocol; +use Friendica\Core\Worker; +use Friendica\Database\DBA; +use Friendica\Model\Photo; + +/** + * Removes cached avatars from public contacts that aren't in use + */ +class RemoveUnusedAvatars +{ + public static function execute() + { + $condition = ["`uid` = ? AND NOT `self` AND NOT `nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` != ?) + AND `id` IN (SELECT `contact-id` FROM `photo`) AND NOT `id` IN (SELECT `author-id` FROM `item`) + AND NOT `id` IN (SELECT `owner-id` FROM `item`) AND NOT `id` IN (SELECT `causer-id` FROM `item`) + AND NOT `id` IN (SELECT `cid` FROM `post-tag`) AND NOT `id` IN (SELECT `contact-id` FROM `item`)", 0, 0]; + + $total = DBA::count('contact', $condition); + Logger::notice('Starting removal', ['total' => $total]); + $count = 0; + $contacts = DBA::select('contact', ['id'], $condition); + while ($contact = DBA::fetch($contacts)) { + DBA::update('contact', ['photo' => '', 'thumb' => '', 'micro' => ''], ['id' => $contact['id']]); + Photo::delete(['contact-id' => $contact['id'], 'album' => Photo::CONTACT_PHOTOS]); + if ((++$count % 1000) == 0) { + if (!Worker::isInMaintenanceWindow()) { + Logger::notice('We are outside of the maintenance window, quitting'); + return; + } + Logger::notice('In removal', ['count' => $count, 'total' => $total]); + } + } + DBA::close($contacts); + Logger::notice('Removal done', ['count' => $count, 'total' => $total]); + } +}