Php 并行Cron任务期间MySQL连接关闭
基于以下两篇博客文章,我为并行任务编写了一个基于Zend Framework的cron服务:Php 并行Cron任务期间MySQL连接关闭,php,mysql,zend-framework,cron,pdo,Php,Mysql,Zend Framework,Cron,Pdo,基于以下两篇博客文章,我为并行任务编写了一个基于Zend Framework的cron服务: 总之,cron服务使用pcntl_fork()并行生成任务 使用该服务运行单个任务不会出现问题,但当我添加第二个任务时,我会遇到以下MySQL错误: 一般错误:2006年MySQL服务器已经消失 我最好的猜测是,一个子线程在另一个子线程之前结束,MySQL连接隐式关闭。如果是这种情况,我如何确保连接保持打开状态,直到父线程关闭?在阅读了上的注释后,这确实是子线程共享父连接的问题。我添加了这段代码
pcntl_fork()
并行生成任务
使用该服务运行单个任务不会出现问题,但当我添加第二个任务时,我会遇到以下MySQL错误:
一般错误:2006年MySQL服务器已经消失
我最好的猜测是,一个子线程在另一个子线程之前结束,MySQL连接隐式关闭。如果是这种情况,我如何确保连接保持打开状态,直到父线程关闭?在阅读了上的注释后,这确实是子线程共享父连接的问题。我添加了这段代码以在分叉后创建一个新的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);
在阅读了关于和的评论之后,这确实是孩子们分享父母关系的问题。我添加了这段代码以在分叉后创建一个新的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);
在fork()之后连接到数据库。如果在分叉之前进行连接,则该连接由子进程共享,并且MySQL不会为共享同一连接的多个进程设置。分叉之前的引导进程连接到数据库,这是必然的。我已经阅读了关于的评论,我得出的结论是我必须移除分叉。我希望有另一种方法。你可以让孩子们建立新的联系。只是不要重复使用家长建立的任何连接。@Marc B-谢谢!当你写评论时,我正是在输入这个解决方案。在fork()之后连接到数据库。如果在分叉之前进行连接,则该连接由子进程共享,并且MySQL不会为共享同一连接的多个进程设置。分叉之前的引导进程连接到数据库,这是必然的。我已经阅读了关于的评论,我得出的结论是我必须移除分叉。我希望有另一种方法。你可以让孩子们建立新的联系。只是不要重复使用家长建立的任何连接。@Marc B-谢谢!你写评论时,我正是在输入这个解决方案。