Php 并行Cron任务期间MySQL连接关闭

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连接隐式关闭。如果是这种情况,我如何确保连接保持打开状态,直到父线程关闭?在阅读了上的注释后,这确实是子线程共享父连接的问题。我添加了这段代码

基于以下两篇博客文章,我为并行任务编写了一个基于Zend Framework的cron服务:

总之,cron服务使用
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-谢谢!你写评论时,我正是在输入这个解决方案。