2012-11-09 19 views
2

如何使MySQL數據庫在使用PHP交互式Shell時始終可用?在PHP交互式數據庫超時推動

我有問題,我在開始時連接到數據庫,並很快超時。系統管理員將MySQL數據庫的超時設置爲10秒(空閒),我無法更改該值。然而,這個值不夠長,不足以與Propel對象及時交互。我在不改變MySQL服務器的配置的情況下尋找方式。

例如

// Assume that User is the Propel class 
$con = User::create(); 
$first = $con->findPk(2); // Still alive 
sleep(11); 
$second = $con->findPk(1); // Dead -- Return NULL 

的MySQL變量(注意,我不允許改變這些變量)

+----------------------------+-------+ 
| Variable_name    | Value | 
+----------------------------+-------+ 
| connect_timeout   | 10 | 
| delayed_insert_timeout  | 300 | 
| innodb_lock_wait_timeout | 360 | 
| innodb_rollback_on_timeout | OFF | 
| interactive_timeout  | 28800 | 
| net_read_timeout   | 30 | 
| net_write_timeout   | 60 | 
| slave_net_timeout   | 3600 | 
| table_lock_wait_timeout | 50 | 
| wait_timeout    | 28800 | 
+----------------------------+-------+ 
+0

請加秀變量'輸出像「超時% %「;'對你的問題。同時從代碼中刪除'sleep(11)',但是您已經完成了這個操作,可能只是爲了演示您的問題;) – hakre

+0

已添加爲請求。 – scalopus

+0

您是否試圖通過[設置全局變量](http httpd.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_connect_timeout)來增加['connect_timeout'] ://dev.mysql.com/doc/refman/5.0/en/using-system-variables.html)? – hakre

回答

0

的詳細說明如果你真的解決不了這個數據庫方面,則有是解決方法。 可悲的是我不知道如何使用Propel2(我做了與Doctrine2類似的東西),但也許有人會建議它。

這個想法是創建Propel將使用的連接類,而不是默認的連接類。在這個類中,你必須確保每個查詢都保持連接,如果不是 - 創建新的連接(所有這些都應該靜靜地進行)。

這將是這個樣子:

class Connection 
{ 
    // ... 
    public function query($stmt) 
    { 
     $result = $this->pdo->query($stmt); 
     if (!$result) { 
      $this->reconnect(); 
      $result = $this->pdo->query($stmt); 
     } 
     return $result; 
    } 
    // ... 
} 

PS再次 - 你不應該這樣做,如果你能解決它在數據庫方面