我在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中实现其他方法。愿意听到这个问题的解决方案。
发布于 2018-06-04 02:45:53
也许这可以帮助https://www.phpfastcache.com/减少数据库/ can服务调用
您的网站有10,000名在线访问者,而您的动态页面在每次加载页面时都必须向数据库或WS服务发送10,000次相同的查询。\使用phpFastCache,您的页面只向DB/WS发送1个查询,并使用缓存为其他9,999名访问者提供服务。\您显然可以决定与您的需求相匹配的TTL。
https://stackoverflow.com/questions/50668622
复制相似问题