/** * 自定义错误处理器,仅捕捉 WP_Object_Cache::add 的空键错误 * 兼容不同 PHP 版本(某些错误可能只传递 4 个参数) */ function custom_error_handler_for_cache($errno, $errstr, $errfile, $errline, $errcontext = null) { // 只处理 E_NOTICE 级别的错误,并且消息中包含“缓存键不能为空字符串” if ($errno === E_NOTICE && strpos($errstr, '缓存键不能为空字符串') !== false) { error_log('[CACHE_KEY_EMPTY] 捕获到空缓存键错误: ' . $errstr); error_log('[CACHE_KEY_EMPTY] 错误位置: ' . $errfile . ':' . $errline); // 获取调用栈,忽略前两层(当前函数和错误处理函数自身) $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 10); // 移除前两帧(错误处理器的内部调用) array_shift($backtrace); // 移除本函数 custom_error_handler_for_cache array_shift($backtrace); // 移除 WordPress 错误处理包装 $log = "[CACHE_KEY_EMPTY] 调用栈:\n"; foreach ($backtrace as $index => $frame) { $file = isset($frame['file']) ? $frame['file'] : '[unknown file]'; $line = isset($frame['line']) ? $frame['line'] : '[unknown line]'; $function = isset($frame['function']) ? $frame['function'] : '[unknown function]'; $class = isset($frame['class']) ? $frame['class'] . $frame['type'] : ''; $log .= sprintf(" #%d: %s%s() called at [%s:%s]\n", $index, $class, $function, $file, $line); } error_log($log); // 不要阻止默认的错误处理(不影响 WordPress 正常运行) return true; // 表示已处理,不交给 PHP 默认处理器 } // 其他错误继续交给默认处理器 return false; }