我基于这两篇博客文章为并行任务编写了基于Zend Framework的cron服务:
总之,cron服务使用pcntl_fork()
并行生成任务。
使用该服务运行单个任务没有问题,但是当我添加第二个任务时,我得到了这个MySQL错误:
一般错误:2006 MySQL服务器已经消失
我最好的猜测是,子线程在另一个之前结束,并且MySQL连接被隐式关闭。如果是这种情况,如何在父线程关闭之前确保连接保持打开状态?
答案 0 :(得分:1)
在阅读pcntl_fork()
和SO question上的评论后,确实存在与孩子共享父联系的问题。我已经添加了这段代码来在分叉后创建一个新的MySQL连接,它似乎解决了这个问题:
// give this thread its own db connection
$settings = Zend_Registry::get('settings');
$db = Zend_Db::factory(
$settings->db_adapter,
array(
'host' => $settings->db_host,
'username' => $settings->db_user,
'password' => $settings->db_pass,
'dbname' => $settings->db_name,
)
);
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Db_Table::setDefaultAdapter($db);