繁体   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