PHP动态网站:Heroku与Google Cloud SQL连接及IPv4必要性咨询
嘿,刚好我之前帮朋友弄过类似的低成本部署配置,来给你一步步说清楚怎么把Heroku上的PHP应用和Google Cloud SQL连起来,还有你关心的IPv4问题~
连接Heroku PHP应用到Google Cloud SQL的两种方案
考虑到你是面向少量用户的低成本需求,我推荐两种方案,其中第一种更安全也更省事儿:
方案1:使用Cloud SQL Auth Proxy(推荐,无需公开IPv4)
这个方法不需要把你的Cloud SQL实例暴露到公网,通过Google的代理工具建立安全连接,完全符合低成本+安全的需求。
步骤1:配置Google Cloud SQL实例
- 先在Google Cloud控制台确认你的SQL实例已经创建完成,记下它的连接名(格式是
你的项目ID:实例区域:实例名称,比如my-project:us-central1:my-sql-instance)。 - 创建一个新的服务账号,给它分配
Cloud SQL Client权限,然后下载这个账号的JSON密钥文件(后面会用到)。
步骤2:在Heroku上配置环境变量
- 首先把服务账号的JSON内容设为环境变量:
(把heroku config:set CLOUD_SQL_CREDENTIALS='{"type": "service_account", "project_id": "你的项目ID", ...}'...替换成你下载的JSON里的完整内容) - 接着设置数据库的基础连接信息:
heroku config:set DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=你的数据库名 DB_USER=你的数据库用户名 DB_PASSWORD=你的数据库密码 - 最后设置Cloud SQL实例的连接名:
heroku config:set CLOUDSQL_INSTANCES=你的项目ID:实例区域:实例名称=tcp:3306
步骤3:添加Cloud SQL Auth Proxy的Buildpack到Heroku
Buildpack会帮你自动安装和运行代理工具,直接运行命令:
heroku buildpacks:add https://github.com/GoogleCloudPlatform/heroku-buildpack-cloudsql.git
(记得先确保你的Heroku应用已经设置了PHP的buildpack,没有的话先加:heroku buildpacks:set heroku/php)
步骤4:PHP代码里的数据库连接
因为代理已经把本地的3306端口转发到了Cloud SQL实例,所以直接连接本地地址就行,比如用PDO:
$dsn = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=utf8mb4', getenv('DB_HOST'), getenv('DB_PORT'), getenv('DB_NAME') ); try { $pdo = new PDO($dsn, getenv('DB_USER'), getenv('DB_PASSWORD')); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('数据库连接失败: ' . $e->getMessage()); }
方案2:使用公共IPv4连接(需配置公网IP)
如果你不想用代理,也可以直接通过公网IP连接,但安全性会低一些,适合对配置步骤更敏感的场景:
步骤1:开启Cloud SQL实例的公共IPv4
- 进入Google Cloud控制台的SQL实例页面,切换到「连接」标签,找到「公共IP」模块,点击「添加网络」。
- 这里可以添加Heroku的出站IP段,嫌麻烦的话也可以暂时允许
0.0.0.0/0(不推荐长期这么做,毕竟公网暴露有风险)。 - 记下实例的公共IPv4地址(比如
192.168.1.100)。
步骤2:在Heroku上设置数据库环境变量
直接把公网IP填到DB_HOST里:
heroku config:set DB_HOST=你的实例公网IP DB_PORT=3306 DB_NAME=你的数据库名 DB_USER=你的用户名 DB_PASSWORD=你的密码
步骤3:PHP代码连接
和方案1的代码几乎一样,只是DB_HOST变成了公网IP,直接用就行。
关于IPv4的关键问题
- 如果用方案1(Cloud SQL Auth Proxy):你的Google Cloud SQL实例完全不需要配置公共IPv4,甚至可以只启用私有IP(私有IP没有额外费用,更安全),因为代理是通过Google内部网络建立的连接。
- 如果用方案2(公网IP连接):那必须配置公共IPv4,不然Heroku的应用根本没法通过公网访问到你的数据库实例。
最后补充一句:Heroku的免费dyno虽然有休眠限制,但少量用户完全够用;Google Cloud SQL的db-f1-micro实例每月有免费额度,刚好符合你的低成本需求~
内容的提问来源于stack exchange,提问作者narengi
相关产品推荐
相关产品推荐

