簡體   English   中英

使用GAE Cloud SQL的Codeigniter

[英]Codeigniter with GAE cloud sql

我正在使用Codeigniter框架創建一個Rest API,該框架將托管在GAE中,並與雲SQL數據庫通信。

我已經按照此處描述的步驟更改並配置了Codeigniter框架。 如何使用CodeIgniter連接到Google Cloud SQL數據庫?

但是當我調用$this->load->database(); 在我的控制器中,它導致以下錯誤。

Severity: Warning

Message: mysqli_connect(): (HY000/2002): No such file or directory

Filename: mysqli/mysqli_driver.php

Line Number: 120

請幫助我找出這個問題,因為我已經在這個問題上浪費了很多時間。

我不確定您使用的是哪個版本的Codeigniter,但是,由於版本為3.0,因此這是框架中db_connect函數的默認代碼

public function db_connect($persistent = FALSE)
{
    // Do we have a socket path?
    if ($this->hostname[0] === '/')
    {
        $hostname = NULL;
        $port = NULL;
        $socket = $this->hostname;
    }
    else
    {
        // Persistent connection support was added in PHP 5.3.0
        $hostname = ($persistent === TRUE && is_php('5.3'))
            ? 'p:'.$this->hostname : $this->hostname;
        $port = empty($this->port) ? NULL : $this->port;
        $socket = NULL;
    }

    $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
    $this->_mysqli = mysqli_init();

    $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);

    if (isset($this->stricton))
    {
        if ($this->stricton)
        {
            $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")');
        }
        else
        {
            $this->_mysqli->options(MYSQLI_INIT_COMMAND,
                'SET SESSION sql_mode =
                REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                @@sql_mode,
                "STRICT_ALL_TABLES,", ""),
                ",STRICT_ALL_TABLES", ""),
                "STRICT_ALL_TABLES", ""),
                "STRICT_TRANS_TABLES,", ""),
                ",STRICT_TRANS_TABLES", ""),
                "STRICT_TRANS_TABLES", "")'
            );
        }
    }

    if (is_array($this->encrypt))
    {
        $ssl = array();
        empty($this->encrypt['ssl_key'])    OR $ssl['key']    = $this->encrypt['ssl_key'];
        empty($this->encrypt['ssl_cert'])   OR $ssl['cert']   = $this->encrypt['ssl_cert'];
        empty($this->encrypt['ssl_ca'])     OR $ssl['ca']     = $this->encrypt['ssl_ca'];
        empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath'];
        empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher'];

        if ( ! empty($ssl))
        {
            if (isset($this->encrypt['ssl_verify']))
            {
                if ($this->encrypt['ssl_verify'])
                {
                    defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE);
                }
                // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT
                // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another
                // constant ...
                //
                // https://secure.php.net/ChangeLog-5.php#5.6.16
                // https://bugs.php.net/bug.php?id=68344
                elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'))
                {
                    $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE);
                }
            }

            $client_flags |= MYSQLI_CLIENT_SSL;
            $this->_mysqli->ssl_set(
                isset($ssl['key'])    ? $ssl['key']    : NULL,
                isset($ssl['cert'])   ? $ssl['cert']   : NULL,
                isset($ssl['ca'])     ? $ssl['ca']     : NULL,
                isset($ssl['capath']) ? $ssl['capath'] : NULL,
                isset($ssl['cipher']) ? $ssl['cipher'] : NULL
            );
        }
    }

    if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags))
    {
        // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails
        if (
            ($client_flags & MYSQLI_CLIENT_SSL)
            && version_compare($this->_mysqli->client_info, '5.7.3', '<=')
            && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value)
        )
        {
            $this->_mysqli->close();
            $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!';
            log_message('error', $message);
            return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE;
        }

        return $this->_mysqli;
    }

    return FALSE;
}

從這段代碼中,我可以弄清楚的是,您可以將套接字作為數組參數直接傳遞到database.php文件中。 你曾經嘗試過嗎?

另外,也不建議修改框架的核心文件。 這可能會導致其他問題。

編輯 :否則,您可以創建一個自定義庫函數以使用默認參數手動連接到數據庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM