2

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

将元数据保存到 metadataCache 失败

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


更新

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

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

4

4 回答 4

3

Zend_Controller_FrontSingleton 包含您的引导程序的一个实例

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$bootstrap->bootstrap('db')
于 2011-06-14T07:45:11.957 回答
1

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

在那为getNewInstance()创建一个方法,它可以调用构造函数而不检查是否存在。这样您就可以覆盖单例行为。

于 2011-06-22T06:22:23.227 回答
0

您不是使用 pcntl_fork 来“分叉”这些并行进程,而是通过您的 crobjob 多次运行它们,对吗?这意味着它们作为彼此独立的进程运行,唯一的共享资源(以及后续冲突)是系统资源(尤其是文件)。

您看到的错误可能是由与正在写入缓存的文件相关的任何事情引起的。例如,如果元数据文件被您的另一个进程锁定,您可能会看到该错误,直到您正在运行的并行进程数量非常高时才会出现该问题。

当元数据缓存文件由于其他原因而无法写入时,也会出现该错误,例如它所在的分区磁盘空间不足或文件权限设置不正确。

也许您可以详细说明如何配置元数据缓存以及脚本并行化的工作方式。另外,您运行的是哪个版本的 Zend Framework?

于 2011-06-19T23:35:03.547 回答
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); 
}
于 2011-06-20T20:37:41.137 回答