【问题标题】:Connection Timeout on Openshift MySQL CartgridgeOpenshift MySQL Cartgridge 上的连接超时
【发布时间】:2015-05-05 11:50:33
【问题描述】:

我正在部署一个 PHP 应用程序,它在 Openshift 中使用 Doctrine 作为 ORM。在我的 post_deploy 操作挂钩中,我运行了学说 orm schema-tool 来更新数据库,但我收到了连接超时错误。 由于我是 Openshift 的新手,在 Openshift 上设置数据库的最佳方法是什么?

更新 我有两个齿轮,一个用于应用程序,另一个用于 MySQL。我 ssh 进入应用程序并运行

doctrine orm:schema-tool:update

这会导致连接超时错误。 如果我尝试

  mysql -h $OPENSHIFT_MYSQL_DB_HOST
        -p $OPENSHIFT_MYSQL_DB_PORT 
        -u $OPENSHIFT_MYSQL_DB_USERNAME 
        -P $OPENSHIFT_MYSQL_DB_PASSWORD
        -

输入 Openshift 通知的 MySQL 密码后出现提示和后续错误。

Enter password: 
ERROR 1049 (42000): Unknown database '<obsfucated_password>'

UDPATE 2: 正如下面Martin指出的不相关的事情,mysql语法是错误的。修复后发现

 mysql -u $OPENSHIFT_MYSQL_DB_USERNAME
       -h $OPENSHIFT_MYSQL_DB_HOST
       -P $OPENSHIFT_MYSQL_DB_PORT
       -D $OPENSHIFT_APP_NAME 
       -p $OPENSHIFT_MYSQL_DB_PASSWORD

结果

Enter password: 
ERROR 1045 (28000): Access denied for user 'adminjbEnwMq'@'10.63.71.68' (using password: NO)

运行时

mysql -u $OPENSHIFT_MYSQL_DB_USERNAME -h $OPENSHIFT_MYSQL_DB_HOST -P $OPENSHIFT_MYSQL_DB_PORT -D $OPENSHIFT_APP_NAME

连接成功。

更新 3 在 PHP 方面,我正在运行以下测试代码,感谢this answer:

  <?php

    require_once "vendor/autoload.php";
    require_once "vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php";
    use Doctrine\DBAL\Configuration;

    $config = new \Doctrine\DBAL\Configuration();

    define('DB_HOST', getenv('OPENSHIFT_MYSQL_DB_HOST'));
    define('DB_PORT',getenv('OPENSHIFT_MYSQL_DB_PORT')); 
    define('DB_USER',getenv('OPENSHIFT_MYSQL_DB_USERNAME'));
    define('DB_PASS',getenv('OPENSHIFT_MYSQL_DB_PASSWORD'));
    define('DB_NAME',getenv('OPENSHIFT_GEAR_NAME'));
    $connectionParams = array(
        'dbname' => DB_NAME,
        'user' => DB_USER,
        'password' => DB_PASS,
        'host' => DB_HOST,
        'driver' => 'pdo_mysql',
    );
    $conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);
    var_dump($conn);
    echo $conn->query("SHOW TABLES"); 
?>

我得到同样的超时错误。

【问题讨论】:

  • 我托管了一个 java 应用程序,然后发生这种类型的事情,然后应用程序崩溃但没有正确关闭连接。
  • 您是否尝试过 SSH 进入您的设备并手动运行 post_deploy 挂钩来尝试调试问题?
  • 另外,您使用的是任何特定的 PHP 框架还是仅使用 PHP + Doctrine?
  • 我正在使用 Doctrine for ORM 运行纯 PHP。我确实 ssh 进入了齿轮并运行了两个学说的 orm:schema-tool:update ,这导致了超时错误。我还尝试运行“mysql --host $OPENSHIFT_MYSQL_DB_HOST --port $OPENSHIFT_MYSQL_DB_PORT --user $OPENSHIFT_MYSQL_DB_USERNAME --password $OPENSHIFT_MYSQL_DB_PASSWORD”并得到密码提示。如果我告知密码,我会收到一条错误消息,提示以密码命名的数据库不存在。
  • 你能告诉我们你的学说配置吗?

标签: php mysql doctrine timeout openshift


【解决方案1】:

我无法帮助您解决您的教义问题,但 mysql 命令语法实际上是错误的。

Usage: mysql [OPTIONS] [database]

正如您在输出中看到的,mysql 将您的密码解释为数据库名称。

如果您想像上面显示的那样指定选项,则需要在选项和选项值之间添加一个“=”。

mysql --host=$OPENSHIFT_MYSQL_DB_HOST
      --port=$OPENSHIFT_MYSQL_DB_PORT 
      --user=$OPENSHIFT_MYSQL_DB_USERNAME 
      --password=$OPENSHIFT_MYSQL_DB_PASSWORD

如果要在命令中添加数据库名称,默认数据库名称为$OPENSHIFT_APP_NAME。只需将其添加到 mysql 命令的末尾即可。

要查看所有 mysql 选项,请执行mysql --help

【讨论】:

  • 谢谢马丁!我昨天真的想通了。查看编辑以获取更新。
【解决方案2】:

也许是因为我总是在 23 小时后处理这个问题,但今天早上我意识到我没有设置端口连接参数。下面的代码就像一个魅力:

$dbParams = array(
      'driver'   => 'pdo_mysql',
      'host' => getenv('OPENSHIFT_MYSQL_DB_HOST')?: '127.0.0.1',
      'port'  => getenv('OPENSHIFT_MYSQL_DB_PORT')?:'3306',
      'user'     => getenv('OPENSHIFT_MYSQL_DB_USERNAME')?: 'stpe',
      'password' => getenv('OPENSHIFT_MYSQL_DB_PASSWORD')?: 'thefallen1',
      'dbname'   => getenv('OPENSHIFT_APP_NAME')?:'stpe',
  );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多