create(); $cache->setScope('error_reporting'); $cache->setkey($bridgeName . '_' . $code); $cache->purgeCache(86400); // 24 hours if ($report = $cache->loadData()) { $report = json_decode($report, true); $report['time'] = time(); $report['count']++; } else { $report = [ 'error' => $code, 'time' => time(), 'count' => 1, ]; } $cache->saveData(json_encode($report)); return $report['count']; } function create_sane_stacktrace(\Throwable $e): array { $frames = array_reverse($e->getTrace()); $frames[] = [ 'file' => $e->getFile(), 'line' => $e->getLine(), ]; $stackTrace = []; foreach ($frames as $i => $frame) { $file = $frame['file'] ?? '(no file)'; $line = $frame['line'] ?? '(no line)'; $stackTrace[] = sprintf( '#%s %s:%s', $i, trim_path_prefix($file), $line, ); } return $stackTrace; } /** * Trim path prefix for privacy/security reasons * * Example: "/var/www/rss-bridge/index.php" => "index.php" */ function trim_path_prefix(string $filePath): string { return mb_substr($filePath, mb_strlen(dirname(__DIR__)) + 1); }