PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 3.4.3
WP STAGING – WordPress Backup, Restore, Migration & Clone v3.4.3
4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / wp-staging-error-handler.php
wp-staging Last commit date
Backend 2 years ago Backup 2 years ago Basic 2 years ago Core 2 years ago Duplicator 2 years ago Framework 2 years ago Frontend 2 years ago assets 2 years ago languages 3 years ago vendor_wpstg 2 years ago Deactivate.php 2 years ago README.md 3 years ago SECURITY.md 2 years ago autoloader.php 3 years ago bootstrap.php 2 years ago constantsFree.php 2 years ago freeBootstrap.php 2 years ago install.php 2 years ago opcacheBootstrap.php 2 years ago readme.txt 2 years ago runtimeRequirements.php 2 years ago uninstall.php 2 years ago wp-staging-error-handler.php 2 years ago wp-staging.php 2 years ago
wp-staging-error-handler.php
136 lines
1 <?php
2
3 /*
4 * Low-level error handler and debugger for WP STAGING
5 */
6
7 namespace WPStaging\functions;
8
9 /**
10 * @param string $message The debug message.
11 * @param string $logType A PSR-3 compatible-log type. If "debug", it only logs if WPSTG_DEBUG is true.
12 * @param bool $logInDebugLog Whether to log the message in the WP_DEBUG_LOG file.
13 *
14 * @see \Psr\Log\LogLevel
15 */
16 function debug_log($message, $logType = 'info', $logInDebugLog = true)
17 {
18 // Keep the file handler open for the duration of the request for performance.
19 static $fileHandler;
20
21 if ($logType === 'debug' && !defined('WPSTG_DEBUG') || defined('WPSTG_DEBUG') && !WPSTG_DEBUG) {
22 return;
23 }
24
25 if ($logInDebugLog && defined('WP_DEBUG_LOG') && WP_DEBUG_LOG) {
26 error_log('[' . $logType . '] WP Staging - ' . $message, 0);
27 }
28
29 if (!defined('WPSTG_DEBUG_LOG_FILE')) {
30 return;
31 }
32
33 if (is_null($fileHandler)) {
34 // Open the file handler once per request, and keep it open, as we might need to write to it multiple times.
35 $fileHandler = @fopen(WPSTG_DEBUG_LOG_FILE, 'a');
36
37 // On Windows OS we need to remove the lock handle first before locking it again.
38 if (stripos(PHP_OS, "WIN") === 0) {
39 flock($fileHandler, LOCK_UN);
40 }
41
42 // Make sure the lock is shared, as we might need to open the handler again if a fatal error occurs.
43 if (is_resource($fileHandler)) {
44 flock($fileHandler, LOCK_SH | LOCK_NB);
45 }
46 }
47
48 $message = sprintf(
49 "[WP STAGING Manual Logging][%s][%s] %s\n",
50 $logType,
51 current_time('mysql'),
52 $message
53 );
54
55 if (is_resource($fileHandler)) {
56 fwrite($fileHandler, $message, 5 * MB_IN_BYTES);
57 }
58 }
59
60 /**
61 * Logs fatal errors in the WP STAGING debug file.
62 */
63 function shutdown_function()
64 {
65 if (!defined('WPSTG_DEBUG_LOG_FILE') || !defined('WPSTG_PLUGIN_SLUG')) {
66 return;
67 }
68
69 $error = error_get_last();
70
71 if (!is_array($error)) {
72 return;
73 }
74
75 // Errors that bring PHP to a halt.
76 $fatalErrorTypes = [
77 E_ERROR => 'E_ERROR',
78 E_PARSE => 'E_PARSE',
79 E_USER_ERROR => 'E_USER_ERROR',
80 E_COMPILE_ERROR => 'E_COMPILE_ERROR',
81 E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
82 ];
83
84 // Provide friendly-names for the error codes
85 $allErrorTypes = [
86 E_ERROR => "E_ERROR",
87 E_WARNING => "E_WARNING",
88 E_PARSE => "E_PARSE",
89 E_NOTICE => "E_NOTICE",
90 E_CORE_ERROR => "E_CORE_ERROR",
91 E_CORE_WARNING => "E_CORE_WARNING",
92 E_COMPILE_ERROR => "E_COMPILE_ERROR",
93 E_COMPILE_WARNING => "E_COMPILE_WARNING",
94 E_USER_ERROR => "E_USER_ERROR",
95 E_USER_WARNING => "E_USER_WARNING",
96 E_USER_NOTICE => "E_USER_NOTICE",
97 E_STRICT => "E_STRICT",
98 E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR",
99 E_DEPRECATED => "E_DEPRECATED",
100 E_USER_DEPRECATED => "E_USER_DEPRECATED",
101 E_ALL => "E_ALL",
102 ];
103
104 $isFatalError = isset($fatalErrorTypes[$error['type']]);
105 $comesFromWpStaging = strpos($error['file'], WPSTG_PLUGIN_SLUG) !== false;
106
107 /*
108 * Logs fatal errors that happens anywhere,
109 * and notices, warnings that comes from a WP STAGING file.
110 *
111 * (It will only log notices and errors from WP STAGING
112 * if it was the last notice/warning triggered before PHP shutdown)
113 */
114 if ($isFatalError || $comesFromWpStaging) {
115 // Opening a file handler gives us more control than error_log('foo', 3, 'custom-file.log');
116 $fileHandler = @fopen(WPSTG_DEBUG_LOG_FILE, 'a');
117
118 $message = sprintf(
119 "[WP STAGING Shutdown Function][%s][%s] %s - File: %s Line: %s | Is it Fatal Error? %s | Is it Thrown by WP STAGING? %s\n",
120 $allErrorTypes[$error['type']],
121 current_time('mysql'),
122 $error['message'],
123 $error['file'],
124 $error['line'],
125 $isFatalError ? 'Yes' : 'No',
126 $comesFromWpStaging ? 'Yes' : 'No'
127 );
128
129 if (is_resource($fileHandler)) {
130 fwrite($fileHandler, $message, 5 * MB_IN_BYTES);
131 }
132 }
133 }
134
135 register_shutdown_function('\WPStaging\functions\shutdown_function');
136