Базы данных (PHP PDO): Приведите пример функции db_connect, которая устанавливает соединение с PostgreSQL и возвращает объект PDO с заданным таймаутом.
Ниже приведён подробный пример функции `db_connect`, которая устанавливает соединение с PostgreSQL через PHP PDO и позволяет задать таймаут подключения.
php
PDO::ERRMODE_EXCEPTION,
// Возвращаем строки в виде ассоциативных массивов по умолчанию
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// Отключаем эмуляцию подготовленных запросов (нативные prepared statements)
PDO::ATTR_EMULATE_PREPARES => false,
// Постоянное соединение (опционально, уберите если не нужно)
// PDO::ATTR_PERSISTENT => true,
];
try {
$pdo = new PDO($dsn, $user, $password, $options);
return $pdo;
} catch (PDOException $e) {
throw new RuntimeException(
‘Не удалось подключиться к PostgreSQL: ‘ . $e->getMessage(),
(int) $e->getCode(),
$e
);
}
}
// Пример использования:
try {
$pdo = db_connect(
host: ‘127.0.0.1’,
port: 5432,
dbname: ‘mydb’,
user: ‘postgres’,
password: ‘secret’,
timeout: 3
);
$stmt = $pdo->query(‘SELECT version()’);
echo $stmt->fetchColumn();
} catch (RuntimeException $e) {
echo ‘Ошибка: ‘ . $e->getMessage();
}
**Ключевые моменты:**
1. **`connect_timeout` в DSN** — параметр передаётся напрямую в строку DSN и обрабатывается драйвером `libpq`. Он задаёт максимальное время ожидания установки соединения в секундах. Если сервер недоступен, по истечении таймаута будет выброшено исключение `PDOException`.
2. **`PDO::ERRMODE_EXCEPTION`** — рекомендуемый режим обработки ошибок. При любой ошибке PDO будет выбрасывать исключение `PDOException`, что позволяет централизованно их перехватывать.
3. **`PDO::ATTR_EMULATE_PREPARES => false`** — отключает эмуляцию подготовленных запросов и использует нативные prepared statements PostgreSQL, что повышает безопасность и производительность.
4. **Оборачивание в `RuntimeException`** — хорошая практика скрывать детали реализации от вызывающего кода, пробрасывая исходное исключение через параметр `$previous`.
5. **Именованные аргументы (PHP 8.0+)** — в примере использования применяются именованные аргументы для наглядности.
Такой подход обеспечивает надёжное, безопасное и легко тестируемое подключение к PostgreSQL.
