Множественные параллельные запросы Laravel, по-видимому, приводят к использованию неправильного соединения

#php #ajax #database #laravel

#php #ajax #База данных #laravel

Вопрос:

У меня есть одностраничное приложение Laravel 5.2, которое после рендеринга в DOM извлекает некоторые настройки с помощью вызовов AJAX. Очень возможно, что многие вызовы ajax выполняются одновременно.

Иногда я получаю сообщение об ошибке 500, потому что пользователи таблицы не могут быть найдены (что действительно существует). Если я извлеку запрос, я увижу, что используемый язык запросов — sqlite, в то время как в настройках моей базы данных указано, что это должен быть sqlsrv. Похоже, Laravel использует sqlite в качестве подключения к базе данных.

У кого-нибудь есть какие-либо идеи о том, почему это происходит и что я могу сделать, чтобы предотвратить это?

Конфигурация базы данных:

 'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => env('DB_DATABASE', database_path('database.sqlite')),
        'prefix' => '',
    ],
    'acti' => [
        'driver' => env('DB_ACTI_DRIVER', 'sqlite'),
        'host' => env('DB_ACTI_HOST', null),
        'database' => env('DB_ACTI_DATABASE', ':memory:'),
        'username' => env('DB_ACTI_USERNAME', null),
        'password' => env('DB_ACTI_PASSWORD', null),
        'charset' => env('DB_ACTI_CHARSET', 'utf8'),
        'prefix' => env('DB_ACTI_PREFIX', ''),
        'strict' => false,
        'engine' => null,
    ],
    'aspect' => [
        'driver' => env('DB_ASPECT_DRIVER', 'sqlite'),
        'host' => env('DB_ASPECT_HOST', null),
        'database' => env('DB_ASPECT_DATABASE', ':memory:'),
        'username' => env('DB_ASPECT_USERNAME', null),
        'password' => env('DB_ASPECT_PASSWORD', null),
        'charset' => env('DB_ASPECT_CHARSET', 'utf8'),
        'prefix' => env('DB_ASPECT_PREFIX', ''),
        'strict' => false,
        'engine' => null,
    ],
    'navision' => [
        'driver' => env('DB_NAVISION_DRIVER', 'sqlite'),
        'host' => env('DB_NAVISION_HOST', null),
        'database' => env('DB_NAVISION_DATABASE', ':memory:'),
        'username' => env('DB_NAVISION_USERNAME', null),
        'password' => env('DB_NAVISION_PASSWORD', null),
        'charset' => env('DB_NAVISION_CHARSET', 'utf8'),
        'prefix' => env('DB_NAVISION_PREFIX', ''),
        'strict' => false,
        'engine' => null,
    ]
]
  

Код ajax выглядит следующим образом:

         $.ajax({
            type: 'GET',
            dataType: 'json',
            url: laroute.route('acti.preference.get', {
                pluginName: this.plugin.name,
                name: this.name
            }),
            success: $.proxy(function (data) {
                this.updateFromApi(data.value);
                if (data.value === undefined) {
                    this.saveToApi();
                }
            }, this),
            error: function () {
                console.log('receive error', arguments);
            }
        })
  

Стандартное соединение — ‘acti’, а .env содержит правильную информацию.

После некоторого тестирования я могу подтвердить, что метод env не всегда возвращает правильную информацию. Я вижу, что иногда вместо фактических данных в файле .env возвращается значение по умолчанию (которое является sqlite).

Комментарии:

1. Давайте посмотрим ваш ajax-код, ваш файл конфигурации .env или базы данных и, наконец, используете ли вы два приложения на одном сервере?

2. У меня много приложений Laravel на моем локальном хостинге. Но я использую только этот сейчас. Вызовы ajax выполняются с помощью стандартного метода jQuery: $.ajax() .

3. Кажется, что одновременно выполняется множество экземпляров.env-файл не может быть прочитан, и он будет использовать значение по умолчанию метода env, которым в данном случае является sqlite …

4. Вы пробовали указывать соединение в своей пользовательской модели? protected $connection = 'acti';

5. Да, я это сделал, но, похоже, это не влияет на поведение, которое, я думаю, связано с неправильной настройкой соединения. Модель использует соединение acti, однако оно настроено как соединение sqlite (чего не должно быть)