引导后访问Zend应用程序引导init函数


Accessing the Zend Application Bootstrap _init Functions After Bootstrapping

我为并行任务编写了一个基于Zend Framework的cron服务,但遇到了子线程与父线程共享资源的问题。我解决了数据库连接问题,但现在我看到Zend_Db_Table_Abstract无法将表元数据保存到元数据缓存的周期性问题。

将元数据保存到元数据缓存失败

我在引导过程中初始化元数据缓存。与其从引导程序中复制代码并在分叉后执行,我认为使用$application->bootstrap('[...]')调用Bootstrap->_init[...]函数可能更好。


更新

因为Zend_Controller_Front::getInstance()是一个Singleton,所以使用它来获取引导实例并以这种方式调用函数会使我返回到与已经解决的共享资源相同的问题。

我想以某种方式保持这种干燥,同时避免分叉后共享资源的问题。

Zend_Controller_Front Singleton保存引导的一个实例

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

Zend_Controller_Front是单例的,但它的构造函数是受保护的,所以您可以通过创建一个名为App_Controller_Front 的类来扩展它

中为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); 
}