Как мне реализовать постоянное подключение к базе данных MySQL с помощью PHP?

#php #mysql #database

#php #mysql #База данных

Вопрос:

Мне нужна некоторая помощь с архитектурой PHP-кода и лучшими практиками. Мне нужно запустить обновление для 4000 строк в базе данных MySQL.

Вот функция / код, который я использую для подключения к базе данных:

     function connectToDB(){
      $uname = "USERNAME";
      $pword = "PASSWORD";
      try {
        $db_conn = new PDO('mysql:host=SERVERHOSTNAME;dbname=DATABASENAME;port=PORTNUMBER', $uname, $pword);
        $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      } catch (PDOException $pdoe){
        //fandle exception
      }
      return $db_conn;
    }
  

Теперь, когда я выполняю фактическую работу, вот код, который я использую в цикле,

     $all_array = array("1", "2", ......, "4000");
    foreach ($all_array as $key => $value) {
      $sqlcode = "INSERT INTO table .....";
      $conn_db = connectToDB();
      $conn_db_prepare = $conn_db->prepare($sqlcode);
      $conn_db_prepare->execute();
    }

  

При этом код будет запускать connectToMitsubishiComfortDB для каждого ключа в lop, что будет 4000 раз, то есть 4000 разных подключений.
Я не уверен, что это лучшая практика.
Есть ли у меня способ подключиться к базе данных один раз, а не запускать 4000 циклов, чтобы мне не приходилось подключаться каждый раз?

Есть ли у меня способ улучшить код?

Это приложение, которое запускается каждый день и вставляется в 4000 строк в таблице. База данных — MySQL, а используемый код — PHP.

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

1.Выйти за $conn_db = connectToDB(); пределы цикла?

2. просто выведите свой $conn_db = connectToDB(); из цикла foreach (перед ним)

3. Также подготовленный оператор может быть подготовлен один раз , но выполнен несколько раз.

4. Просто для проверки: есть ли какая-либо конкретная причина, по которой вы не разместили этот вызов connect вне цикла самостоятельно?

5. @NicoHaase без причины. просто не был уверен, будет ли это работать вне цикла. Спасибо за предупреждение.

Ответ №1:

вам нужно переместить строку $conn_db = connectToDB(); из вашего цикла

Ответ №2:

Переместите как соединение, так и подготовку за пределы цикла. Вам нужно подключиться только один раз, и вам нужно только один раз подготовиться.

 $conn_db = connectToDB();
$conn_db_prepare = $conn_db->prepare('INSERT INTO table .....');
$all_array = array("1", "2", ......, "4000");
foreach ($all_array as $key => $value) {
    $conn_db_prepare->execute();
}
  

Ответ №3:

Лучший способ включить постоянное соединение в PDO, перейдя array(PDO::ATTR_PERSISTENT => true) в строку подключения.

 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  

https://www.php.net/manual/en/pdo.connections.php

Примечание:

Если вы используете драйвер ODBC PDO и ваши библиотеки ODBC поддерживают объединение в пулы соединений ODBC (unixODBC и Windows — это два, которые поддерживают; может быть больше), тогда рекомендуется не использовать постоянные соединения PDO, а вместо этого оставить кэширование соединений на уровне пула соединений ODBC. Пул соединений ODBC используется совместно с другими модулями в процессе; если PDO указано кэшировать соединение, то это соединение никогда не будет возвращено в пул соединений ODBC, что приведет к созданию дополнительных подключений для обслуживания этих других модулей.