动态循环链接多个数据库

fantasmic

问题描述

公司现有推广站100+(持续增加中),每个站后台都有文章功能,每次发文章会打包几千个txt上传然后解压读每个txt把内容存进数据库。

现在运营觉得每个站都要登上去操作不方便,想有一个总后台能对每个站发文章。

我想的是做成定时任务,先把推广站的数据库信息都存起来,在发布平台选站点并传文章,循环拿到站点数据库信息连接上后把文章内容写进去,功能感觉很简单,这样循环连接数据库有坑吗


7月7号:
功能现在全部做完了,由于测试时只循环测了3个库且连接正常就以为上线也行。
上线后站很多一下加了70多个站,但数据库其实只有2个只是库名不一样,运营一次性要对20个站上传文章,且是同一个库,我这就要循环20次检测连接代码是这样的

public static function testConnection(SiteInfo $site): bool
    {
        $connection = null;
        try {
            $pdo = new PDO(
                "mysql:host={$site->db_host};port={$site->port}",
                $site->db_username,
                $site->db_password,
                [
                    PDO::ATTR_PERSISTENT => false, // 禁用持久连接
                    // 添加TCP keepalive选项
                    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
                    PDO::ATTR_TIMEOUT => 2,
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                ]
            );

            $connection = new MySqlConnection($pdo);
//            $connection->select('SELECT 1');

            return true;
        } catch (\Exception $e) {
            Log::channel('conn')->error($e->getMessage());
            return false;
        } finally {
            // 释放连接资源
            if ($connection instanceof Connection) {
                $connection->disconnect();
            }
        }
    }

我的理解是即使是循环也是连上了就释放,下一个继续,不存在占用连接数,但实际上在循环大概10多次后就报Connection timed out,难道释放连接不是马上的?

502 4 0
4个回答

北月妖王

能跑就行。

如果只是针对发文章不想切换站点重复登录这个问题,你不如搞一个 webview 套壳的客户端,在服务端开个专用 API,授权验证用专门的 ApiKeyAppSecret,一次配置终生使用,体验不是更好吗

  • 暂无评论
vs7717

你单独开一个fpm 的程序,主要是把你那些数据库配置集中写,然后专门写一个发布文章的功能,webman 这边的程序,每次调用这个fpm 的程序,用来循环数据库插入
或者,你把数据库配置什么写到webman 这边数据库里,然后每个数据库信息对应标识,然后每次去调用fpm 的时候 把数据信息传递获取,那边根据你传递的数据库信息进行连接

  • 暂无评论
fantasmic

顶一下

晚安。
/**
 * 动态连接数据库--备份
 * @param string $name 数据库连接名字
 * @param array $newDbConfig 需要连接的新数据库配置
 */
function baseDb($name, $newDbConfig)
{
    try {
        $con = Db::connect($name);
    } catch (InvalidArgumentException $e) {
        $config                       = Db::getConfig();
        $config['connections'][$name] = $newDbConfig;
        Db::setConfig($config);
        $con = Db::connect($name);
    }
    return $con;
}

你吧数据库配置信息都存储到数据库一个表里面,调用这个方法执行就可以了

  • 暂无评论
🔝