簡體   English   中英

引導后訪問 Zend 應用程序引導 _init 函數

[英]Accessing the Zend Application Bootstrap _init Functions After Bootstrapping

我為並行任務編寫了一個基於 Zend Framework 的 cron 服務,但遇到了子線程與父線程共享資源的問題 我解決了數據庫連接問題,但我現在看到Zend_Db_Table_Abstract無法將表元數據保存到元數據緩存的周期性問題。

將元數據保存到 metadataCache 失敗

我在引導期間初始化元數據緩存。 與其從引導程序復制我的代碼並在分叉后執行,我認為使用$application->bootstrap('[...]')調用Bootstrap->_init[...]函數可能會更好。


更新

因為Zend_Controller_Front::getInstance()是 Singleton,所以使用它來獲取引導實例並以這種方式調用函數會使我回到我已經解決的共享資源的相同問題。

我想以某種方式保持這個 DRY,同時避免分叉后共享資源的問題。

Zend_Controller_Front Singleton 包含一個引導程序實例

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

Zend_Controller_Front 是 singleton,但它的構造函數是受保護的,所以你可以簡單地通過創建一個名為 App_Controller_Front 的 class 來擴展它

在那為getNewInstance()創建一個方法,它可以調用構造函數而不檢查是否存在。 這樣,您可以覆蓋 singleton 行為。

您不是使用 pcntl_fork 來“分叉”這些並行進程,而是通過您的 crobjob 多次運行它們,對嗎? 這意味着它們作為彼此獨立的進程運行,唯一的共享資源(以及后續沖突)是系統資源(尤其是文件)。

您看到的錯誤可能是由與正在寫入緩存的文件相關的任何事情引起的。 例如,如果元數據文件被您的另一個進程鎖定,您可能會看到該錯誤,直到您正在運行的並行進程數量非常高時才會出現該問題。

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

也許您可以詳細說明如何配置元數據緩存以及腳本並行化的工作方式。 另外,您運行的是哪個版本的 Zend Framework?

為什么每個子線程都讀取配置、緩存數據庫元數據等? 使用主/從層次結構。 共同理念:

$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); 
}

暫無
暫無

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

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