在PHP中通过SSH2进行PDO?

时间:2015-06-10 13:24:56

标签: php mysql pdo ssh

我正在尝试访问只能在本地访问的远程MySQL数据库(localhost)。

我的代码如下:

$connection = ssh2_connect('IP to Server', 22);

    if (ssh2_auth_password($connection, 'User', 'Password')) {
        echo "Authentication Successful!\n";
    } else {
        die('Authentication Failed...');
    }

    $tunnel = ssh2_tunnel($connection, '127.0.0.1', 3306);

    try {
        $this->_connection = new PDO($dsn, $config['login'], $config['password'], $flags);
        $this->connected = true;
        if (! empty($config['settings'])) {
            foreach ($config['settings'] as $key => $value) {
                $this->_execute("SET $key=$value");
            }
        }
    } catch (PDOException $e) {
        throw new MissingConnectionException(array(
                'class' => get_class($this),
                'message' => $e->getMessage()
        ));
    }

脚本成功直到$ tunnel。 PDO连接失败并显示“连接被拒绝”。我认为PDO正试图连接到MAMP? $ dsn变量看起来像“mysql:host = 127.0.0.1; port = 3306; dbname = mydb”。

如何判断MAMP,127.0.0.1是否在通过SSH连接的远程服务器上?

谢谢!

1 个答案:

答案 0 :(得分:3)

正如您已经指出的那样,您的脚本正在尝试连接到本地MySQL服务器而不是远程服务器。为了使PDO与远程服务器建立连接,您可以建立SSH tunnel并将本地端口转发到服务器端口。如图所示http://brettrawlins.com/mysql-ssh-tunnel/

在php中运行ssh命令:shell_exec(ssh code here)

您可能希望看到:Connect to a MySQL server over SSH in PHP

然而,正如那里所指出的,这种方法相对较慢,因为每次查询数据库时都必须创建一个新的隧道,这使得查询需要更长的时间。我认为在开发环境中它是一个有效的选项,因为你没有static IP,但我不认为这在生产中有效。

如果您是为了加密而尝试这样做,我建议您使用SSL连接到您的数据库。但请注意,所有SSL版本可能都不支持PDO PHP