【问题标题】:Codeigniter instance losing connection to database inside of threaded closureCodeigniter 实例在线程闭包内失去与数据库的连接
【发布时间】:2015-02-10 23:29:32
【问题描述】:

以下代码在使用php index.php [controllername] [methodname] 从php-cli 调用的控制器中调用。

这段代码也嵌套在foreach 循环中。该代码最终调用了一个模型,该模型使用内置的 mysql 驱动程序查询数据库。这里的问题是第一次迭代,Codeigniter 能够从模型调用成功连接到数据库。不过……

在第二次迭代中,模型被加载,并且当驱动程序从数据库查询返回空结果时调用该方法。 $ci_instance 变量是控制器上下文中 $this 的副本。

在 Codeigniter PHP 单元测试中尝试模拟模型时,我也遇到了类似的问题。

  $thread = ThreadManager::async(function () use (
        $ci_instance,
        $model,
        $function_name,
        $vars,
        $log_id,
        $cron
    ) {

        $exception = NULL;

        try
        {
            $ci_instance->load->model($model);

            $success = $ci_instance->$model->$function_name($vars);
        }
        catch(Exception $e)
        {
            $exception = $e->getMessage();
        }

        if($success)
        {
            $ci_instance->cron_queue_model->close_crontab($cron['id']);

            $ci_instance->cron_log_model->update_note($log_id, 'info', 'Completed #'. $cron['id']. '-'. $model.'/'.$function_name . ' ' . $success);
        }
        else
        {
            $ci_instance->cron_log_model->insert_error($cron['id'], 'error', 'Failed -'. $model.'/'.$function_name . ' ' . $exception);

            log_message('error', 'The model:' . $model . ' function:' . $function_name . ' with vars:' . $vars . ' did not run as expected ' . $exception);
        }
    });

【问题讨论】:

  • 你好约瑟夫。您的最后一次编辑似乎正确缩进了代码,这是我不明白的目的 - 但这删除了我所做的一些可读性编辑(我已经恢复了我的编辑)。在编辑之前刷新浏览器有助于避免这种情况,如果您在编辑过程中看到警告,通常最好取消、刷新并重试,以免覆盖最新版本。
  • 抱歉@helfer 我不会写很多问题,所以还是习惯了它的工作原理

标签: php codeigniter


【解决方案1】:

我似乎已经在一定程度上解决了这个问题。当我这样做时,我得到了以下响应:

mysql_stat($ci_instance->db->conn_id);

“MySQL 服务器已消失”

所以我在 try catch 块中添加了以下行并且它起作用了:

try
{
    if(mysql_stat($ci_instance->db->conn_id) === "MySQL server has gone away")
    {
        $ci_instance->db->reconnect();
    }

    $ci_instance->load->model($model);

    $success = $ci_instance->$model->$function_name($vars);
}

但是,如果不等待来自进程控制分支的结果,我仍然无法让它在自己的进程中工作。

【讨论】:

  • 我们可以在哪里添加这个查询?
【解决方案2】:

我根本不知道 codeignigter API,但我在自己的工作中遇到了类似的问题。我的具体问题是在我的班级的 __destruct 方法中关闭了数据库连接。我怀疑正在发生的是当您的闭包返回时(我认为这意味着线程死亡) PHP 正在调用您的数据库实例上的析构函数并可能关闭连接。由于数据库连接是共享的,因此会关闭该类所有实例的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多