Codeigniter实例在线程闭包内失去与数据库的连接

时间:2015-02-10 23:29:33

标签: php codeigniter

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

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

在第二次迭代中,加载模型,并在驱动程序从数据库查询返回null结果时调用该方法。 $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);
        }
    });

2 个答案:

答案 0 :(得分:1)

我似乎在某种程度上解决了这个问题。当我这样做时,我收到了以下回复:

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

" MySQL服务器已经消失了#34;

所以我在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);
}

但是我仍然无法在不等待进程控制分支的结果的情况下在自己的进程中工作。

答案 1 :(得分:1)

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