Merge pull request #1622 from EXreaction/ticket/11373

[ticket/11373] Prune old read notifications with cron
This commit is contained in:
David King 2013-09-12 22:01:11 -07:00
commit fc7a35be38
5 changed files with 97 additions and 2 deletions

View file

@ -328,6 +328,7 @@ class acp_board
'session_length' => array('lang' => 'SESSION_LENGTH', 'validate' => 'int:60:9999999999', 'type' => 'number:60:9999999999', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']), 'session_length' => array('lang' => 'SESSION_LENGTH', 'validate' => 'int:60:9999999999', 'type' => 'number:60:9999999999', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'active_sessions' => array('lang' => 'LIMIT_SESSIONS', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true), 'active_sessions' => array('lang' => 'LIMIT_SESSIONS', 'validate' => 'int:0:9999', 'type' => 'number:0:9999', 'explain' => true),
'load_online_time' => array('lang' => 'ONLINE_LENGTH', 'validate' => 'int:0:999', 'type' => 'number:0:999', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']), 'load_online_time' => array('lang' => 'ONLINE_LENGTH', 'validate' => 'int:0:999', 'type' => 'number:0:999', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']),
'read_notification_expire_days' => array('lang' => 'READ_NOTIFICATION_EXPIRE_DAYS', 'validate' => 'int:0', 'type' => 'number:0', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']),
'legend2' => 'GENERAL_OPTIONS', 'legend2' => 'GENERAL_OPTIONS',
'load_notifications' => array('lang' => 'LOAD_NOTIFICATIONS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_notifications' => array('lang' => 'LOAD_NOTIFICATIONS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),

View file

@ -367,6 +367,8 @@ $lang = array_merge($lang, array(
'LOAD_JQUERY_CDN_EXPLAIN' => 'If this setting is enabled, jQuery will be served from Googles AJAX API CDN instead of the copy included with phpBB on your server. If the CDN fails, phpBB will attempt to fall back to the copy included with phpBB.', 'LOAD_JQUERY_CDN_EXPLAIN' => 'If this setting is enabled, jQuery will be served from Googles AJAX API CDN instead of the copy included with phpBB on your server. If the CDN fails, phpBB will attempt to fall back to the copy included with phpBB.',
'LOAD_USER_ACTIVITY' => 'Show users activity', 'LOAD_USER_ACTIVITY' => 'Show users activity',
'LOAD_USER_ACTIVITY_EXPLAIN' => 'Displays active topic/forum in user profiles and user control panel. It is recommended to disable this on boards with more than one million posts.', 'LOAD_USER_ACTIVITY_EXPLAIN' => 'Displays active topic/forum in user profiles and user control panel. It is recommended to disable this on boards with more than one million posts.',
'READ_NOTIFICATION_EXPIRE_DAYS' => 'Read Notification Expiration',
'READ_NOTIFICATION_EXPIRE_DAYS_EXPLAIN' => 'Number of days that will elapse before a read notification will automatically be deleted. Set this value to 0 to make notifications permanent.',
'RECOMPILE_STYLES' => 'Recompile stale style components', 'RECOMPILE_STYLES' => 'Recompile stale style components',
'RECOMPILE_STYLES_EXPLAIN' => 'Check for updated style components on filesystem and recompile.', 'RECOMPILE_STYLES_EXPLAIN' => 'Check for updated style components on filesystem and recompile.',
'YES_ANON_READ_MARKING' => 'Enable topic marking for guests', 'YES_ANON_READ_MARKING' => 'Enable topic marking for guests',

View file

@ -0,0 +1,65 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Prune notifications cron task.
*
* @package phpBB3
*/
class phpbb_cron_task_core_prune_notifications extends phpbb_cron_task_base
{
protected $config;
protected $notification_manager;
/**
* Constructor.
*
* @param phpbb_config $config The config
* @param phpbb_notification_manager $notification_manager Notification manager
*/
public function __construct(phpbb_config $config, phpbb_notification_manager $notification_manager)
{
$this->config = $config;
$this->notification_manager = $notification_manager;
}
/**
* {@inheritdoc}
*/
public function run()
{
// time minus expire days in seconds
$timestamp = time() - ($this->config['read_notification_expire_days'] * 60 * 60 * 24);
$this->notification_manager->prune_notifications($timestamp);
}
/**
* {@inheritdoc}
*/
public function is_runnable()
{
return (bool) $this->config['read_notification_expire_days'];
}
/**
* {@inheritdoc}
*/
public function should_run()
{
return $this->config['read_notification_last_gc'] < time() - $this->config['read_notification_gc'];
}
}

View file

@ -0,0 +1,25 @@
<?php
/**
*
* @package migration
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_db_migration_data_310_notifications_cron extends phpbb_db_migration
{
static public function depends_on()
{
return array('phpbb_db_migration_data_310_notifications');
}
public function update_data()
{
return array(
array('config.add', array('read_notification_expire_days', 30)),
array('config.add', array('read_notification_last_gc', 0)), // last run
array('config.add', array('read_notification_gc', (60 * 60 * 24))), // seconds between run; 1 day
);
}
}

View file

@ -797,11 +797,13 @@ class phpbb_notification_manager
* Delete all notifications older than a certain time * Delete all notifications older than a certain time
* *
* @param int $timestamp Unix timestamp to delete all notifications that were created before * @param int $timestamp Unix timestamp to delete all notifications that were created before
* @param bool $only_unread True (default) to only prune read notifications
*/ */
public function prune_notifications($timestamp) public function prune_notifications($timestamp, $only_read = true)
{ {
$sql = 'DELETE FROM ' . $this->notifications_table . ' $sql = 'DELETE FROM ' . $this->notifications_table . '
WHERE notification_time < ' . (int) $timestamp; WHERE notification_time < ' . (int) $timestamp .
(($only_read) ? ' AND notification_read = 1' : '');
$this->db->sql_query($sql); $this->db->sql_query($sql);
} }