2016-09-07 79 views
0

我正在創建一個具有Codeignitor框架的休息API,該框架將在GAE中託管,並與雲SQL數據庫進行通信。Codigniter與GAE雲sql

我已經根據此處所述的步驟更改並配置了我的Codeignitor框架。 How do I connect to a Google Cloud SQL database using CodeIgniter?

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

Severity: Warning 

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

Filename: mysqli/mysqli_driver.php 

Line Number: 120 

請幫我弄清楚這個問題,因爲我已經浪費了很多時間在這個問題上。

謝謝

回答

0

我不知道你使用哪個笨的版本,但是由於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文件中傳遞socket作爲數組參數。你有沒有嘗試過?

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

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