#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, что приведет к созданию дополнительных подключений для обслуживания этих других модулей.