PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.1.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.1.0
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / ErrorHandler.php
matomo / app / core Last commit date
API 2 years ago Access 2 years ago Application 2 years ago Archive 2 years ago ArchiveProcessor 2 years ago Archiver 2 years ago AssetManager 2 years ago Auth 2 years ago Category 2 years ago Changes 2 years ago CliMulti 2 years ago Columns 2 years ago Concurrency 2 years ago Config 2 years ago Container 2 years ago CronArchive 2 years ago DataAccess 2 years ago DataFiles 2 years ago DataTable 2 years ago Db 2 years ago DeviceDetector 2 years ago Email 2 years ago Exception 2 years ago Http 2 years ago Intl 2 years ago Log 2 years ago Mail 2 years ago Measurable 2 years ago Menu 2 years ago Metrics 2 years ago Notification 2 years ago Period 2 years ago Plugin 2 years ago ProfessionalServices 2 years ago Report 2 years ago ReportRenderer 2 years ago Scheduler 2 years ago Segment 2 years ago Session 2 years ago Settings 2 years ago Tracker 2 years ago Translation 2 years ago Twig 2 years ago UpdateCheck 2 years ago Updater 2 years ago Updates 2 years ago Validators 2 years ago View 2 years ago ViewDataTable 2 years ago Visualization 2 years ago Widget 2 years ago .htaccess 2 years ago Access.php 2 years ago Archive.php 2 years ago ArchiveProcessor.php 2 years ago AssetManager.php 2 years ago Auth.php 2 years ago AuthResult.php 2 years ago BaseFactory.php 2 years ago Cache.php 2 years ago CacheId.php 2 years ago CliMulti.php 2 years ago Common.php 2 years ago Config.php 2 years ago Console.php 2 years ago Context.php 2 years ago Cookie.php 2 years ago CronArchive.php 2 years ago DI.php 2 years ago DataArray.php 2 years ago DataTable.php 2 years ago Date.php 2 years ago Db.php 2 years ago DbHelper.php 2 years ago Development.php 2 years ago ErrorHandler.php 2 years ago EventDispatcher.php 2 years ago ExceptionHandler.php 2 years ago FileIntegrity.php 2 years ago Filechecks.php 2 years ago Filesystem.php 2 years ago FrontController.php 2 years ago Http.php 2 years ago IP.php 2 years ago Log.php 2 years ago LogDeleter.php 2 years ago Mail.php 2 years ago Metrics.php 2 years ago NoAccessException.php 2 years ago Nonce.php 2 years ago Notification.php 2 years ago NumberFormatter.php 2 years ago Option.php 2 years ago Period.php 2 years ago Piwik.php 2 years ago Plugin.php 2 years ago Profiler.php 2 years ago ProxyHeaders.php 2 years ago ProxyHttp.php 2 years ago QuickForm2.php 2 years ago RankingQuery.php 2 years ago ReportRenderer.php 2 years ago Request.php 2 years ago Segment.php 2 years ago Sequence.php 2 years ago Session.php 2 years ago SettingsPiwik.php 2 years ago SettingsServer.php 2 years ago Singleton.php 2 years ago Site.php 2 years ago SiteContentDetector.php 2 years ago SupportedBrowser.php 2 years ago TCPDF.php 2 years ago Theme.php 2 years ago Timer.php 2 years ago Tracker.php 2 years ago Twig.php 2 years ago Unzip.php 2 years ago UpdateCheck.php 2 years ago Updater.php 2 years ago UpdaterErrorException.php 2 years ago Updates.php 2 years ago Url.php 2 years ago UrlHelper.php 2 years ago Version.php 2 years ago View.php 2 years ago bootstrap.php 2 years ago dispatch.php 2 years ago testMinimumPhpVersion.php 2 years ago
ErrorHandler.php
190 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik;
10
11 use Piwik\Container\StaticContainer;
12 use Piwik\Exception\ErrorException;
13 use Piwik\Log\LoggerInterface;
14 /**
15 * Piwik's error handler function.
16 */
17 class ErrorHandler
18 {
19 private static $fatalErrorStackTrace = [];
20 private static $lastError = '';
21 /**
22 * Fatal errors in PHP do not leave behind backtraces, which can make it impossible to determine
23 * the exact cause of one. We can, however, save a partial stack trace by remembering certain execution
24 * points. This method and popFatalErrorBreadcrumb() are used for that purpose.
25 *
26 * To use this method, surround a function call w/ pushFatalErrorBreadcrumb() & popFatalErrorBreadcrumb()
27 * like so:
28 *
29 * public function theMethodIWantToAppearInFatalErrorStackTraces()
30 * {
31 * try {
32 * ErrorHandler::pushFatalErrorBreadcrumb(static::class);
33 *
34 * // ...
35 * } finally {
36 * ErrorHandler::popFatalErrorBreadcrumb();
37 * }
38 * }
39 *
40 * If a fatal error occurs, theMethodIWantToAppearInFatalErrorStackTraces will appear in the stack trace,
41 * if PIWIK_PRINT_ERROR_BACKTRACE is true.
42 */
43 public static function pushFatalErrorBreadcrumb($className = null, $importantArgs = null)
44 {
45 $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit = 2);
46 $backtrace[1]['class'] = $className;
47 // knowing the derived class name is far more useful
48 $backtrace[1]['args'] = empty($importantArgs) ? [] : array_map('json_encode', $importantArgs);
49 array_unshift(self::$fatalErrorStackTrace, $backtrace[1]);
50 }
51 public static function popFatalErrorBreadcrumb()
52 {
53 array_shift(self::$fatalErrorStackTrace);
54 }
55 public static function getFatalErrorPartialBacktrace()
56 {
57 $result = '';
58 foreach (self::$fatalErrorStackTrace as $index => $entry) {
59 $function = $entry['function'];
60 if (!empty($entry['class'])) {
61 $function = $entry['class'] . $entry['type'] . $function;
62 }
63 $args = '';
64 if (!empty($entry['args'])) {
65 $isFirst = true;
66 foreach ($entry['args'] as $name => $value) {
67 if ($isFirst) {
68 $isFirst = false;
69 } else {
70 $args .= ', ';
71 }
72 $args .= $name . '=' . $value;
73 }
74 }
75 $result .= sprintf("#%s %s(%s): %s(%s)\n", $index, $entry['file'], $entry['line'], $function, $args);
76 }
77 return $result;
78 }
79 /**
80 * Returns a string description of a PHP error number.
81 *
82 * @param int $errno `E_ERROR`, `E_WARNING`, `E_PARSE`, etc.
83 * @return string
84 */
85 public static function getErrNoString($errno)
86 {
87 switch ($errno) {
88 case E_ERROR:
89 return "Error";
90 case E_WARNING:
91 return "Warning";
92 case E_PARSE:
93 return "Parse Error";
94 case E_NOTICE:
95 return "Notice";
96 case E_CORE_ERROR:
97 return "Core Error";
98 case E_CORE_WARNING:
99 return "Core Warning";
100 case E_COMPILE_ERROR:
101 return "Compile Error";
102 case E_COMPILE_WARNING:
103 return "Compile Warning";
104 case E_USER_ERROR:
105 return "User Error";
106 case E_USER_WARNING:
107 return "User Warning";
108 case E_USER_NOTICE:
109 return "User Notice";
110 case E_STRICT:
111 return "Strict Notice";
112 case E_RECOVERABLE_ERROR:
113 return "Recoverable Error";
114 case E_DEPRECATED:
115 return "Deprecated";
116 case E_USER_DEPRECATED:
117 return "User Deprecated";
118 default:
119 return "Unknown error ({$errno})";
120 }
121 }
122 public static function registerErrorHandler()
123 {
124 set_error_handler(array('Piwik\\ErrorHandler', 'errorHandler'));
125 }
126 public static function errorHandler($errno, $errstr, $errfile, $errline)
127 {
128 self::$lastError = self::createLogMessage($errno, $errstr, $errfile, $errline);
129 // if the error has been suppressed by the @ we don't handle the error
130 if (!(error_reporting() & $errno)) {
131 return;
132 }
133 switch ($errno) {
134 case E_ERROR:
135 case E_PARSE:
136 case E_CORE_ERROR:
137 case E_CORE_WARNING:
138 case E_COMPILE_ERROR:
139 case E_COMPILE_WARNING:
140 case E_USER_ERROR:
141 \Piwik\Common::sendResponseCode(500);
142 // Convert the error to an exception with an HTML message
143 $e = new \Exception();
144 $backtrace = \Piwik_ShouldPrintBackTraceWithMessage() ? $e->getTraceAsString() : '';
145 $message = self::getHtmlMessage($errno, $errstr, $errfile, $errline, $backtrace);
146 throw new ErrorException($message, 0, $errno, $errfile, $errline);
147 case E_WARNING:
148 case E_NOTICE:
149 case E_USER_WARNING:
150 case E_USER_NOTICE:
151 case E_STRICT:
152 case E_RECOVERABLE_ERROR:
153 case E_DEPRECATED:
154 case E_USER_DEPRECATED:
155 default:
156 $context = array('trace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 15));
157 try {
158 StaticContainer::get(LoggerInterface::class)->warning(self::createLogMessage($errno, $errstr, $errfile, $errline), $context);
159 } catch (\Exception $ex) {
160 // ignore (it's possible for this to happen if the StaticContainer hasn't been created yet)
161 }
162 break;
163 }
164 }
165 public static function getLastError()
166 {
167 $lastError = error_get_last();
168 if (!empty($lastError['message'])) {
169 return $lastError['message'];
170 }
171 return self::$lastError;
172 }
173 private static function createLogMessage($errno, $errstr, $errfile, $errline)
174 {
175 return sprintf("%s(%d): %s - %s - Matomo " . (class_exists('Piwik\\Version') ? \Piwik\Version::VERSION : '') . " - Please report this message in the Matomo forums: https://forum.matomo.org (please do a search first as it might have been reported already)", $errfile, $errline, \Piwik\ErrorHandler::getErrNoString($errno), $errstr);
176 }
177 private static function getHtmlMessage($errno, $errstr, $errfile, $errline, $trace)
178 {
179 $trace = \Piwik\Log::$debugBacktraceForTests ?: $trace;
180 $message = \Piwik\ErrorHandler::getErrNoString($errno) . ' - ' . $errstr;
181 $html = "<p>There is an error. Please report the message (Matomo " . (class_exists('Piwik\\Version') ? \Piwik\Version::VERSION : '') . ")\n and full backtrace in the <a target='_blank' rel='noreferrer noopener' href='https://forum.matomo.org'>Matomo forums</a> (please do a search first as it might have been reported already!).</p>";
182 $html .= "<p><strong>{$message}</strong> in <em>{$errfile}</em>";
183 $html .= " on line {$errline}</p>";
184 $html .= "Backtrace:<pre>";
185 $html .= str_replace("\n", "\n", $trace);
186 $html .= "</pre>";
187 return $html;
188 }
189 }
190