Skip to content

LostConnectionDetector only supports English servers #59024

@Francismori7

Description

@Francismori7

class LostConnectionDetector implements LostConnectionDetectorContract

Claude Code recently helped me troubleshoot this error:

Error Details

  • Message: SQLSTATE[HY000] [2002] Connexion terminée par expiration du délai d'attente (Connection: mysql, Host: res01-sql.systeme.local, Port: 3306, Database: {redacted}, SQL: select * from users where id = 91 and users.deleted_at is null limit 1)
  • Class: Illuminate\Database\QueryException
  • Occurrence: 27489
  • Received: 2026-02-27 15:05:06
  • Entry Point: {redacted}
  • Stage: production
  • Version: 7f333df
  • Framework: 12.53.0
  • Language: 8.3.21
  • File: /var/www/{redacted}/app/Http/Middleware/EnsureADPasswordIsFresh.php:20
  • Method: App\Http\Middleware\EnsureADPasswordIsFresh::handle

Stack Trace (first 20 frames)

Frame 1: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:838
Illuminate\Database\Connection::runQueryCallback()
Frame 2: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:794
Illuminate\Database\Connection::run()
Frame 3: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:411
Illuminate\Database\Connection::select()
Frame 4: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3475
Illuminate\Database\Query\Builder::runSelect()
Frame 5: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3460
Illuminate\Database\Query\Builder::Illuminate\Database\Query\{closure}()
Frame 6: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:4050
Illuminate\Database\Query\Builder::onceWithColumns()
Frame 7: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3459
Illuminate\Database\Query\Builder::get()
Frame 8: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:902
Illuminate\Database\Eloquent\Builder::getModels()
Frame 9: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:884
Illuminate\Database\Eloquent\Builder::get()
Frame 10: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php:366
Illuminate\Database\Eloquent\Builder::first()
Frame 11: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:58
Illuminate\Auth\EloquentUserProvider::retrieveById()
Frame 12: /var/www/{redacted}/vendor/directorytree/ldaprecord-laravel/src/Auth/DatabaseUserProvider.php:112
LdapRecord\Laravel\Auth\DatabaseUserProvider::retrieveById()
Frame 13: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php:189
Illuminate\Auth\SessionGuard::user()
Frame 14: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php:56
Illuminate\Auth\SessionGuard::check()
Frame 15: /var/www/{redacted}/app/Http/Middleware/EnsureADPasswordIsFresh.php:20
App\Http\Middleware\EnsureADPasswordIsFresh::handle()
Frame 16: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}()
Frame 17: /var/www/{redacted}/app/Http/Middleware/RecordPageViewsToActivityLog.php:23
App\Http\Middleware\RecordPageViewsToActivityLog::handle()
Frame 18: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}()
Frame 19: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50
Illuminate\Routing\Middleware\SubstituteBindings::handle()
Frame 20: /var/www/{redacted}/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}()

It told me that the LostConnectionDetector does NOT trigger on French messages, which is an issue.
It implemented a fix like this:

app\Database\FrenchLostConnectionDetector.php

<?php

namespace App\Database;

use Illuminate\Database\LostConnectionDetector;
use Throwable;

class FrenchLostConnectionDetector extends LostConnectionDetector
{
    public function causedByLostConnection(Throwable $e): bool
    {
        if (parent::causedByLostConnection($e)) {
            return true;
        }

        return str_contains($e->getMessage(), 'expiration du délai');
    }
}

app\Providers\AppServiceProvider.php

    public function register(): void
    {
        $this->app->singleton(
            \Illuminate\Contracts\Database\LostConnectionDetector::class,
            \App\Database\FrenchLostConnectionDetector::class,
        );
    }

It says: After deploy, the 2002 timeout errors should now auto-retry silently instead of crashing.

Maybe this should be explored?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions