过去2天我一直在尝试从appengine连接到cloudql,我可以通过IP从linux网络服务器连接,但不能从具有相同设置的app引擎连接。
我的连接字符串如下: 请注意实际的appid被替换以及dbname
在app.yaml
中env_variables:
MYSQL_DSN: mysql:unix_socket=/cloudsql/appid:us-central1:sql-instance-1;dbname=dbname
MYSQL_USER: root
MYSQL_PASSWORD: ''
在phpfile中
$dsn = getenv('MYSQL_DSN');
$user = getenv('MYSQL_USER');
$password = getenv('MYSQL_PASSWORD');
if (!isset($dsn, $user) || false === $password) {
throw new Exception('Set MYSQL_DSN, MYSQL_USER, and MYSQL_PASSWORD environment variables');
}
$conn = new PDO($dsn, $user, $password);
上述内容来自https://cloud.google.com/appengine/docs/standard/php/cloud-sql/ 我尝试过使用密码,而不是使用密码。我尝试过用户名root,作为用户名,密码和用户名没有。
我正在使用第二代设置和flex php环境,我一直收到的错误如下:
短错误
SQLSTATE[HY000] [2002] No such file or directory
完整错误
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /app/dbconn.php:12 Stack trace: #0 /app/dbconn.php(12): PDO->__construct('mysql:unix_sock...', 'root', '') #1 /app/api.user.php(2): include_once('/app/dbconn.php') #2 {main} thrown in /app/dbconn.php on line 12
我现在真的没有想法了。请注意,sql和app都在同一个项目中。
答案 0 :(得分:4)
如果您通过SSH连接实例(这将使其处于调试模式),您可以检查是否存在套接字文件。您可以从云控制台打开连接。
然后,
ls /cloudsql
此目录应包含名为<project-id>:<region>:<instance-name>
的项目,跟随您的MYSQL_DSN
环境变量。
如果不存在,请确保您启用了相关API 。在文档页面Using Cloud SQL中,按照“开始之前”中的说明进行操作 - 特别是“启用API”。 (您的日志也可能会通知您:“未配置访问权限。项目之前尚未使用Cloud SQL Administration API或已禁用它。”)在重新部署
你可能已经这样做了,但根据我的经验,这是一个容易被忽视的步骤。
此外,确保您的app.yaml文件包含以下内容:
beta_settings:
cloud_sql_instances: "<project-id>:<region>:<instance-name>"
最后,尝试将 MYSQL_DSN
的值放在app.yaml文件的引号中。