Passed
Pull Request — master (#4676)
by Nils
05:55
created

TaskSupervisor   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 35
c 1
b 0
f 0
dl 0
loc 72
rs 10
wmc 6
1
<?php
2
/**
3
 * Teampass - Task Supervisor
4
 * Supervise and clean up background tasks
5
 */
6
7
use TeampassClasses\ConfigManager\ConfigManager;
8
require_once __DIR__.'/../includes/config/include.php';
9
require_once __DIR__.'/../sources/main.functions.php';
10
11
class TaskSupervisor {
12
    private $db;
13
    private $settings;
14
15
    public function __construct() {
16
        $configManager = new ConfigManager();
17
        $this->settings = $configManager->getAllSettings();
18
        $this->db = DB::getInstance();
19
    }
20
21
    public function supervise() {
22
        $this->cleanStaleProcesses();
23
        $this->rebalanceTasks();
24
        $this->logTaskStatistics();
25
    }
26
27
    private function cleanStaleProcesses() {
28
        // Marquer les processus bloqués depuis plus de 30 minutes
29
        $this->db->query(
30
            'UPDATE ' . prefixTable('background_tasks') . ' 
31
            SET is_in_progress = -1, 
32
                status = "stale"
33
            WHERE is_in_progress = 1 
34
            AND started_at < %i',
35
            time() - 1800  // 30 minutes
36
        );
37
    }
38
39
    private function rebalanceTasks() {
40
        // Relancer les tâches marquées comme "stale"
41
        $staleTasks = $this->db->query(
42
            'SELECT increment_id, process_type, arguments 
43
            FROM ' . prefixTable('background_tasks') . '
44
            WHERE status = "stale"
45
            LIMIT 10'  // Limiter à 10 pour éviter une surcharge
46
        );
47
48
        foreach ($staleTasks as $task) {
49
            $this->db->update(
50
                prefixTable('background_tasks'),
51
                [
52
                    'is_in_progress' => 0,
53
                    'status' => 'pending',
54
                    'started_at' => null
55
                ],
56
                'increment_id = %i',
57
                $task['increment_id']
58
            );
59
        }
60
    }
61
62
    private function logTaskStatistics() {
63
        $stats = [
64
            'total_tasks' => $this->db->queryFirstField(
65
                'SELECT COUNT(*) FROM ' . prefixTable('background_tasks')
66
            ),
67
            'pending_tasks' => $this->db->queryFirstField(
68
                'SELECT COUNT(*) FROM ' . prefixTable('background_tasks') . ' WHERE is_in_progress = 0'
69
            ),
70
            'running_tasks' => $this->db->queryFirstField(
71
                'SELECT COUNT(*) FROM ' . prefixTable('background_tasks') . ' WHERE is_in_progress = 1'
72
            ),
73
            'completed_tasks' => $this->db->queryFirstField(
74
                'SELECT COUNT(*) FROM ' . prefixTable('background_tasks') . ' WHERE is_in_progress = -1 AND status = "completed"'
75
            ),
76
            'failed_tasks' => $this->db->queryFirstField(
77
                'SELECT COUNT(*) FROM ' . prefixTable('background_tasks') . ' WHERE is_in_progress = -1 AND status = "failed"'
78
            )
79
        ];
80
81
        // Log ou stocker ces statistiques selon votre configuration
82
        error_log('Teampass Task Statistics: ' . json_encode($stats));
83
    }
84
}
85
86
// Exécution du superviseur
87
$supervisor = new TaskSupervisor();
88
$supervisor->supervise();