У меня есть класс базы данных на php, который подключается к базе данных при запуске и используется для выполнения запросов и возврата данных из базы данных пользователям через запрос RestAPI. Возникающая здесь проблема заключается в том, что каждый раз, когда пользователь делает запрос HTTP, запускается новый класс базы данных и устанавливается новое соединение при каждом запросе пользователя с помощью RestAPI.
Класс базы данных выглядит следующим образом:
<?php
class DbHandler
{
private $conn;
function __construct()
{
require_once dirname(__FILE__) . '/db_connect.php';
$db = new DbConnect();
$this->conn = $db->connect();
}
public function getSpotlight($user_id) {
$stmt = $this->conn->prepare("SELECT *, (SELECT COUNT(*) FROM followers WHERE following = u.id) as followers, (SELECT COUNT(*) FROM posts WHERE user_id = u.id) as totalPosts from users u WHERE u.id NOT IN (select if(user_id = :var1, user_with, user_id) from friends where user_id = :var1 OR user_with = :var1) AND u.id != :var1 order by followers desc limit 10;");
$stmt->bindParam(":var1", $user_id);
$stmt->execute();
$users = $stmt;
$stmt = null;
return $users;
}
DbConnect выглядит так:
<?php
class DbConnect
{
private $conn;
function __construct()
{
}
function connect()
{
include_once dirname(__FILE__) . '/config.php';
$host = DB_HOST;
$db_name = DB_NAME;
$user = DB_USERNAME;
$pass = DB_PASSWORD;
$this->conn = new PDO("mysql:host=$host;dbname=$db_name", $user, $pass);
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
return $this->conn;
}
}
?>
Так что теперь, когда пользователь вызывает index.php, запускается новый класс базы данных, и каждый раз, когда выполняется запрос, новое соединение устанавливается каждый раз и после завершения запроса закрывается.
Это не было проблемой, пока мы не получили более 1000 пользователей, и каждый раз, когда она увеличивает время отклика, и я проверил список процессов в mysql, и соединения увеличивались, а выход и новые соединения шли.
Я совершенно не уверен, что должно быть решением этой проблемы. Есть ли какой-либо подход, который делает его постоянным соединение с этим файлом DbHandler? или есть другие подходы в PHP, которые мы могли бы реализовать. Желаю услышать решения по этой проблеме.
возможно, это может помочь https://www.phpfastcache.com/ Уменьшить вызовы базы данных/веб-службы
На вашем веб-сайте есть 10 000 посетителей, которые подключены к сети, и ваша динамическая страница должна отправлять 10 000 раз тем же запросам в базу данных или веб-сервис при каждой загрузке страницы.\С phpFastCache ваша страница отправляет только 1 запрос на ваш DB/WS и использует кеш, чтобы обслуживать 9 999 других посетителей.\Вы, очевидно, можете выбрать TTL, который будет соответствовать вашим потребностям.