Fix PHP 8.4 breakage: drop deprecated mysqli::ping(), harden dep handler
Lint / PHP (phpcs PSR-12) (push) Successful in 20s
Lint / JS (eslint) (push) Successful in 7s
Lint / PHP requirements (version + extensions) (push) Successful in 19s
Lint / PHP (phpcs PSR-12) (pull_request) Successful in 29s
Lint / JS (eslint) (pull_request) Successful in 14s
Lint / PHP requirements (version + extensions) (pull_request) Successful in 39s
Security / PHP Security (semgrep) (push) Successful in 1m15s
Security / PHP Security (semgrep) (pull_request) Successful in 1m23s
Lint / Deploy (push) Successful in 2s
Lint / Notify on failure (push) Has been skipped
Lint / Deploy (pull_request) Has been skipped
Lint / Notify on failure (pull_request) Has been skipped

The hosts were upgraded to PHP 8.4, where mysqli::ping() is deprecated
(auto-reconnect was removed in 8.2). Database::getConnection() called it on
every reused connection, and api/ticket_dependencies.php's custom error
handler treated the deprecation as a fatal 500 ('A server error occurred'),
breaking the ticket Dependencies tab.

- Database.php: remove the redundant ping()/reconnect check (connection is
  request-scoped; no liveness check needed on PHP 8.2+).
- ticket_dependencies.php: only abort on genuine errors; log notices/
  warnings/deprecations and continue, so a future deprecation can't 500 it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 19:12:10 -04:00
co-authored by Claude Opus 4.8
parent d6214a0339
commit 622cae8bbd
2 changed files with 14 additions and 7 deletions
+11 -2
View File
@@ -27,10 +27,19 @@ register_shutdown_function(function () {
ini_set('display_errors', 0); ini_set('display_errors', 0);
error_reporting(E_ALL); error_reporting(E_ALL);
// Custom error handler // Custom error handler. Only genuine errors abort the request; notices,
// warnings and deprecations (e.g. new deprecations on a PHP upgrade) are
// logged but must not take the endpoint down with a 500.
set_error_handler(function ($errno, $errstr, $errfile, $errline) { set_error_handler(function ($errno, $errstr, $errfile, $errline) {
// Log detailed error server-side // Respect the @-operator / error_reporting.
if (!(error_reporting() & $errno)) {
return false;
}
error_log("PHP Error in ticket_dependencies.php: $errstr in $errfile:$errline"); error_log("PHP Error in ticket_dependencies.php: $errstr in $errfile:$errline");
if (!in_array($errno, [E_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE], true)) {
// Non-fatal: log and continue.
return true;
}
ob_end_clean(); ob_end_clean();
http_response_code(500); http_response_code(500);
header('Content-Type: application/json'); header('Content-Type: application/json');
+3 -5
View File
@@ -22,11 +22,9 @@ class Database
self::$connection = self::createConnection(); self::$connection = self::createConnection();
} }
// Check if connection is still alive // Note: no ping()/reconnect check — mysqli auto-reconnect was removed in
if (!self::$connection->ping()) { // PHP 8.2 and mysqli::ping() is deprecated in 8.4. The connection is
self::$connection = self::createConnection(); // request-scoped and short-lived, so a liveness check is unnecessary.
}
return self::$connection; return self::$connection;
} }