使用PHP或Python从轻量服务器连接腾讯云MySQL的正确配置方法?

以下是使用 PHP 和 Python 连接腾讯云 MySQL 的正确配置方法:

一、腾讯云 MySQL 准备工作

1. 创建数据库实例

  • 在腾讯云控制台创建 MySQL 实例
  • 记录以下信息:
    • 内网地址(轻量服务器与 MySQL 同地域可用内网)
    • 网络地址(如需网络访问)
    • 端口(默认 3306)
    • 数据库名
    • 用户名和密码

2. 配置安全组

  • 在轻量服务器安全组中开放 3306 端口
  • 在 MySQL 安全组中添加轻量服务器的 IP

二、PHP 连接方法

使用 PDO(推荐)

<?php
$host = 'cdb-xxxxxxxxxx.gz.tencentcdb.com'; // 腾讯云MySQL地址
$port = '3306'; // 端口
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';

try {
    // 创建PDO连接
    $dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
    $pdo = new PDO($dsn, $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false
    ]);

    echo "连接成功!";

    // 示例查询
    $stmt = $pdo->query("SELECT VERSION()");
    $version = $stmt->fetchColumn();
    echo "MySQL版本: " . $version;

} catch (PDOException $e) {
    die("连接失败: " . $e->getMessage());
}
?>

使用 MySQLi

<?php
$host = 'cdb-xxxxxxxxxx.gz.tencentcdb.com';
$port = 3306;
$username = 'your_username';
$password = 'your_password';
$database = 'your_database';

// 创建连接
$conn = new mysqli($host, $username, $password, $database, $port);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 设置字符集
$conn->set_charset("utf8mb4");

echo "连接成功!";

// 关闭连接
$conn->close();
?>

三、Python 连接方法

使用 PyMySQL

import pymysql
import sys

# 数据库配置
config = {
    'host': 'cdb-xxxxxxxxxx.gz.tencentcdb.com',
    'port': 3306,
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}

try:
    # 建立连接
    connection = pymysql.connect(**config)

    print("连接成功!")

    # 执行查询
    with connection.cursor() as cursor:
        # 查询MySQL版本
        cursor.execute("SELECT VERSION()")
        result = cursor.fetchone()
        print(f"MySQL版本: {result['VERSION()']}")

        # 示例:创建表
        # cursor.execute("""
        # CREATE TABLE IF NOT EXISTS users (
        #     id INT AUTO_INCREMENT PRIMARY KEY,
        #     name VARCHAR(100) NOT NULL,
        #     email VARCHAR(100) NOT NULL
        # )
        # """)

        # 示例:插入数据
        # sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
        # cursor.execute(sql, ('张三', 'zhangsan@example.com'))
        # connection.commit()

except pymysql.Error as e:
    print(f"数据库连接失败: {e}")
    sys.exit(1)

finally:
    if 'connection' in locals() and connection.open:
        connection.close()
        print("连接已关闭")

使用 SQLAlchemy(ORM)

from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker

# 连接字符串格式
# mysql+pymysql://用户名:密码@主机:端口/数据库名
DATABASE_URL = "mysql+pymysql://your_username:your_password@cdb-xxxxxxxxxx.gz.tencentcdb.com:3306/your_database?charset=utf8mb4"

try:
    # 创建引擎
    engine = create_engine(
        DATABASE_URL,
        pool_pre_ping=True,  # 自动检测连接是否有效
        pool_recycle=3600,   # 连接回收时间(秒)
        echo=False          # 是否显示SQL语句(调试时设为True)
    )

    # 创建会话
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

    # 测试连接
    with engine.connect() as conn:
        result = conn.execute(text("SELECT VERSION()"))
        version = result.fetchone()[0]
        print(f"连接成功!MySQL版本: {version}")

except Exception as e:
    print(f"连接失败: {e}")

四、SSL 连接配置(增强安全性)

PHP PDO SSL 连接

$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$options = [
    PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem',
    PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
];

$pdo = new PDO($dsn, $username, $password, $options);

Python PyMySQL SSL 连接

config = {
    'host': 'your_host',
    'port': 3306,
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database',
    'ssl': {
        'ca': '/path/to/ca.pem',
        'cert': '/path/to/client-cert.pem',
        'key': '/path/to/client-key.pem'
    }
}

五、连接池配置(Python)

from DBUtils.PooledDB import PooledDB
import pymysql

# 创建连接池
pool = PooledDB(
    creator=pymysql,
    maxconnections=20,  # 连接池最大连接数
    mincached=5,       # 初始化时创建的连接数
    maxcached=10,      # 连接池最大空闲连接数
    blocking=True,     # 连接数达到最大时是否阻塞等待
    host='your_host',
    port=3306,
    user='your_username',
    password='your_password',
    database='your_database',
    charset='utf8mb4'
)

# 从连接池获取连接
def get_connection():
    return pool.connection()

六、环境变量配置(推荐)

创建 .env 文件:

DB_HOST=cdb-xxxxxxxxxx.gz.tencentcdb.com
DB_PORT=3306
DB_NAME=your_database
DB_USER=your_username
DB_PASSWORD=your_password

使用 python-dotenv 读取:

from dotenv import load_dotenv
import os

load_dotenv()

config = {
    'host': os.getenv('DB_HOST'),
    'port': int(os.getenv('DB_PORT')),
    'user': os.getenv('DB_USER'),
    'password': os.getenv('DB_PASSWORD'),
    'database': os.getenv('DB_NAME')
}

七、常见问题排查

  1. 连接超时

    • 检查安全组设置
    • 确认网络连通性:telnet host port
    • 调整连接超时时间
  2. 认证失败

    • 检查用户名密码
    • 确认用户权限
    • 检查主机白名单
  3. 编码问题

    • 统一使用 utf8mb4 字符集
    • 确保数据库、表、连接字符集一致

八、最佳实践建议

  1. 使用连接池:避免频繁创建连接
  2. 异常处理:确保连接失败时有适当处理
  3. 环境分离:开发、测试、生产使用不同配置
  4. 定期维护:监控连接数,及时释放资源
  5. 使用内网地址:同地域服务器间使用内网连接,速度更快且免费

选择哪种方式取决于你的具体需求:

  • 简单项目:直接使用 PyMySQL 或 MySQLi
  • 复杂项目:推荐使用 SQLAlchemy(Python)或 PDO(PHP)
  • 高并发场景:使用连接池管理
云服务器