【问题标题】:MySQL Connection Closing During Parallel Cron TasksMySQL 连接在并行 Cron 任务期间关闭
【发布时间】:2011-09-12 16:24:54
【问题描述】:

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

总之,cron 服务使用pcntl_fork() 来并行生成任务。

使用该服务运行单个任务没有问题,但是当我添加第二个任务时,我收到此 MySQL 错误:

一般错误:2006 MySQL 服务器已消失

我最好的猜测是一个子线程在另一个之前结束并且 MySQL 连接被隐式关闭。如果是这种情况,如何确保连接保持打开状态,直到父线程关闭?

【问题讨论】:

  • 在你 fork() 之后连接到数据库。如果您在 fork 之前连接,则该连接由子级共享,并且 MySQL 不会为共享同一连接的多个进程设置。
  • 分叉前的引导过程连接到数据库,而且必然如此。我一直在阅读php.net/pcntl-fork 上的 cmets,我得出的结论是我必须移除分叉。我希望有另一种方式。
  • 你总是可以让孩子们启动一个新的连接。只是不要重复使用父级建立的任何连接。
  • @Marc B - 谢谢!当你写你的评论时,我正在输入那个解决方案。

标签: php mysql zend-framework cron pdo


【解决方案1】:

在阅读了pcntl_fork() 和这个SO question 上的cmets 之后,确实是孩子共享父连接的问题。我已经添加了这段代码来创建一个新的 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多