2011-06-13 52 views
2

我已經編寫了一個基於Zend Framework的並行任務cron服務和ran into issues with the child threads sharing resources with the parent。我解決了database connection issue,但我現在看到定期問題Zend_Db_Table_Abstract未能將表元數據保存到元數據緩存。在引導之後訪問Zend應用程序引導_init函數

Failed saving metadata to metadataCache

我在引導期間初始化元數據緩存。我認爲使用$application->bootstrap('[...]')來調用Bootstrap->_init[...]函數可能會更好,而不是從引導中複製我的代碼並在分叉後執行。


UPDATE

因爲Zend_Controller_Front::getInstance()是一個Singleton,用它​​來獲得引導實例並調用的方式返回我同樣的問題與我已經解決了共享資源的功能。

我想以某種方式保持乾爽,同時避免分叉後共享資源的問題。

回答

1

前端控制器是單身,但其構造是受保護的,這樣可以延長,僅僅通過創建一個名爲類,App_Controller_Front

中創造了一種getNewInstance(),它可以調用沒有檢查存在的構造函數。這樣你可以覆蓋單身人士的行爲。

+0

這似乎是我可能必須去的方式。我會試試看。謝謝! – Sonny 2011-06-27 13:48:38

+0

我打算接受這個作爲現在的答案,但仍然需要測試它。 – Sonny 2011-06-28 12:57:37

3

Zend_Controller_Front辛格爾頓持有

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 
$bootstrap->bootstrap('db') 
+0

謝謝本傑明!我給了這個旋風,但發現使用'Zend_Controller_Front' Singleton繼續與父線程共享,並且我得到了「一般錯誤:2006 MySQL服務器已經消失」了。 – Sonny 2011-06-14 13:08:20

+0

請爲此打開另一個問題。現在的問題應該照原樣回答。在PHP手冊中的這個註釋可以幫助你解決你的問題:http://php.net/manual/en/function.pcntl-fork。php#70721 – 2011-06-16 17:09:51

+0

我鏈接的原始線程解決了這個問題。我目前的問題是關於代碼重用。 Zend_Controller_Front :: getInstance()的Singleton行爲阻止了它在分叉場景中的使用。我會澄清這個問題。 – Sonny 2011-06-16 19:54:42

0

你「分叉」這些並行進程都不會與pcntl_fork引導文件的實例,但只是通過你的crobjob多次運行它們,是否正確?這意味着它們作爲彼此獨立的進程運行,並且唯一的共享資源(和隨後的衝突)是資源(尤其是文件)的系統

您看到的錯誤可能會導致與正在寫入緩存的文件相關的任何數量的事情。例如,如果元數據文件被另一個進程鎖定,則可能會看到該錯誤,這個問題可能在您運行的並行進程數很高時才顯示出來。

當元數據緩存文件由於其他原因(例如它所在的分區磁盤空間不足或文件權限設置不正確)而無法寫入時,也會出現此錯誤。

也許你可以詳細說明如何配置元數據緩存以及腳本並行化如何工作。另外,你正在運行什麼版本的Zend Framework?

+0

我真的真正與pcntl_fork分道揚。。我鏈接到的關於解決我的數據庫連接問題的線程具有所有這些信息。儘管你可能對緩存寫入錯誤是正確的。我在一段時間內沒有看到這個錯誤。無論如何,我想保持我的應用程序乾爽。 – Sonny 2011-06-20 12:27:50

0

爲什麼每個子線程讀配置,緩存數據庫元數據等?使用主/工作層次結構。共同的想法:

$pid = pcntl_fork(); 

if ($pid == -1) {   
    // Fork failed    
    exit(1); 
} elseif ($pid) { 
    // We are the parent 
    // prepare common data, cache it, etc. 
} else { 
    // We are the child 
    // create new db connection, use cached data 
    // if there is no data in cache yet - sleep 
    exit(0); 
} 
+0

信貸到期信用:http://php.net/manual/en/function.pcntl-fork.php#70721 – 2011-06-21 06:39:07