Как Laravel поддерживает постоянное соединение с базой данных - PullRequest
0 голосов
/ 05 декабря 2018

Я разрабатывал приложение Laravel в настройке LAMP на моей локальной машине (моем ноутбуке).

В целях тестирования я попытался использовать службу mysql Aws RDS вместо моего локального mysql server.Обнаружено, что вызов API, который имеет только один вызов БД без соединения (запрос: show tables ) - занимает в среднем 12 секунд.Это нелепо.Когда я использую локальный сервер MySQL, он составляет около 600 мс.До сих пор PDO :: ATTR_PERSISTANT не был включен.

Вход в систему Illuminate\Database\Connectors\Connector.php [внутри createConnection() метод], я обнаружил, что этот метод вызывается для каждого запроса.Это для обоих серверов MySQL.

Затем я устанавливаю PDO::ATTR_PERSISTANT на true.Но время отклика примерно одинаковое.

Посмотрев поближе, нашел это в том же файле:

/**
 * Create a new PDO connection instance.
 *
 * @param  string  $dsn
 * @param  string  $username
 * @param  string  $password
 * @param  array  $options
 * @return \PDO
 */
protected function createPdoConnection($dsn, $username, $password, $options)
{
    if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
        return new PDOConnection($dsn, $username, $password, $options);
    }

    return new PDO($dsn, $username, $password, $options);
}

И PDOConnection - , который используется extends PDO, что используетсякогда постоянное значение ложно - конструктор:

public function __construct($dsn, $user = null, $password = null, array $options = null)
{
    try {
        parent::__construct($dsn, $user, $password, $options);
        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, ['Doctrine\DBAL\Driver\PDOStatement', []]);
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (\PDOException $exception) {
        throw new PDOException($exception);
    }
}

Кажется, установка PDO::ATTR_PERSISTANT в true не имеет никакого эффекта.Это меня смутило.

  1. Как на самом деле играет постоянная связь с базой данных в Laravel?
  2. В чем причина длительного времени ответа (при использовании службы mysql Aws RDS)?

1 Ответ

0 голосов
/ 05 декабря 2018

MySQL - это база данных, которая известна легкими издержками соединения.По этой причине опасения относительно повторного использования соединений редко появляются, но в любом случае соединения в PHP привязаны к процессам.Вы действительно увидите только преимущество повторного использования соединений под нагрузкой, когда достаточно запущенных php-процессов, и устойчивый PHP-процесс может повторно использовать клиентское соединение mysql.

Другими словами, ваши клиентские соединения mysqlМожет / будет / может быть закрыт в зависимости от конфигурации вашего веб-сервера, даже если вы используете постоянные MySQL-соединения, или потребуется новое соединение, если у процесса apache для запроса еще нет постоянного соединения.

Даже если у вас есть постоянное соединение, это НЕ означает, что в вашем сценарии все будет быстрее, потому что вы предполагаете, что время соединения с RDS через общедоступный Интернет медленное если на самом деле все клиентское соединение mysql из вашего локального приложения через общедоступный интернет работает медленно .Запросы будут медленными, выборка набора результатов будет медленной, и в целом это будет плохой опыт.

Соединение, занимающее 12 секунд, - это не то, что вы бы увидели, если бы весь хостинг вашего сайта размещался в AWS.и используя RDS для вашего хранилища данных.Это будет намного ближе к типу производительности, которую вы получаете на своем локальном хосте с локальной базой данных.

Кроме того, весь предикат идеи не годится.

  1. RDS - это продукт премиум-класса.Вы не должны использовать это для разработки вообще.Если вы используете свободный уровень, производительность базы данных для чего угодно, кроме крошечной базы данных, будет довольно медленной.
  2. MySQL изначально не имеет защиты сетевого уровня.В вашем развертывании AWS должен использоваться VPC, где RDS находится в VPC, а ваши серверы приложений PHP - в VPC.
  3. В вашем приложении нет ничего особенного для использования RDS.Он выглядит для вашего приложения как любая другая база данных mysql с параметром не-localhost -h.

Вы пытаетесь настроить то, что буквально никто не использовал бы в реальном мире, таким образом, вы пытаетесь решитьСамостоятельная проблема, которая не принесет долгосрочной выгоды вашему проекту.

С учетом сказанного, если вы хотите лучше понять, почему вы испытываете то, что вы есть, и как работают как PHP, так и связанные с ними ресурсы, то база данных, которая ДОЛЖНА иметь тяжелый и трудоемкий процесс соединения, - это Oracle.Люди, использующие Oracle с PHP, на законных основаниях должны быть обеспокоены повторным использованием соединения, потому что Oracle ожидает, что соединение будет установлено, и тогда произойдет много «сеансов».Хотя эта статья Oracle Cookbook сейчас несколько устарела, она хорошо иллюстрирует связь между процессами PHP (по крайней мере, с Apache и Mod_php) и соединениями с базами данных.

И последнее, но не менее важное:Эта тема усложняется тем, что PHP можно запустить разными способами.Apache имеет несколько различных конфигураций, которые отличаются от IIS, который отличается от Nginx / php-fpm, который стал популярным в последние годы. Этот вопрос / ответ SO уже адресован конкретному параметру PDO, который вы пытаетесь использовать, который в конечном итоге просто передает его в клиентскую библиотеку MySQL, вместе с некоторыми важными предостережениями и проблемами, объясняющими, почему соединения MySQL редко стоятвероятность неприятностей, которые они могут вызвать.

...