2011-06-10 116 views
1

我已經寫了基於這兩個博客文章並行任務Zend框架基於cron服務:MySQL連接關閉過程中並行的後臺任務

綜上所述, cron服務使用pcntl_fork()並行產生任務。

運行與服務的單個任務的工作沒有問題,但是當我添加第二個任務,我得到這個MySQL錯誤:

General error: 2006 MySQL server has gone away

我最好的猜測是,一個子線程之前,其他和結束MySQL連接隱式關閉。如果是這種情況,我如何確保連接保持打開狀態,直到父線程關閉?

+0

連接到數據庫後,您()。如果在fork之前進行連接,則該連接將由子進程共享,並且MySQL不會爲共享相同連接的多個進程進行設置。 – 2011-06-10 17:27:25

+0

分叉之前的引導過程連接到數據庫,必然如此。我一直在閱讀關於http://php.net/pcntl-fork的評論,我得出的結論是我必須刪除分叉。我希望有另一種方式。 – Sonny 2011-06-10 17:35:47

+1

你可以隨時讓孩子們開啓一個新的連接。只是不要重複使用父母建立的任何連接。 – 2011-06-10 17:58:00

回答

1

在閱讀pcntl_fork()SO question的評論後,確實是兒童共享父連接的問題。我加入這個代碼來創建分叉後,一個新的MySQL連接,它似乎已經解決了這一問題:叉

// give this thread its own db connection 
$settings = Zend_Registry::get('settings'); 
$db = Zend_Db::factory(
    $settings->db_adapter, 
    array(
     'host' => $settings->db_host, 
     'username' => $settings->db_user, 
     'password' => $settings->db_pass, 
     'dbname' => $settings->db_name, 
    ) 
); 
$db->setFetchMode(Zend_Db::FETCH_OBJ); 
Zend_Db_Table::setDefaultAdapter($db);