PHP Codeigniter 3 MySQL服务器已断开连接。

5

我正在运行一个 Cron Job 来转换上传的视频,与 Codeigniter 中的 PHP 脚本相关。一切都执行得很顺利,但是一旦到了将数据插入到数据库中这一步,就会出现以下错误:

Error Number: 2006 MySQL server has gone away

该进程基本上会将视频进行转换,如果成功,则从视频创建缩略图和海报,然后将视频数据插入数据库中。我已经尝试在我的模型函数中添加$this->db->reconnect();。以下是该函数:

function add_video($data)
{
  //BECASUE THE CONVERSION TAKES SO LONG WE NEED TO RECONNECT TO THE DATABASE AFTER EACH EXEC
  $this->db->reconnect(); 

  $this->db->insert('video_uploads', $data);
}

这种方法无效,仍然会收到错误。如果在每个exec之后添加$this->db->reconnect();,我会收到以下错误:

消息:mysql_ping()需要参数1为资源类型,布尔值被给出

消息:mysql_real_escape_string()需要参数2为资源类型,布尔值被给出

只是作为一个提示,我正在使用FFMPEG转换我的视频。

如何在所有执行完成后保持连接并将数据插入数据库?

编辑:这是Codeigniter的$this->db->reconnect();函数的样子:

public function reconnect()
{
    if (mysql_ping($this->conn_id) === FALSE)
    {
        $this->conn_id = FALSE;
    }
}

1
请查看此链接:https://dev59.com/FHI-5IYBdhLWcg3wYnSQ - Saty
如果转换时间太长,那么您能否避免连接,直到视频转换完成后再执行插入操作?如果不行的话,也许您可以手动断开连接,转换视频,重新连接,然后执行插入操作。 - MonkeyZeus
1
谢谢@Saty,我在$this->db->reconnect();之前添加了$this->load->database();,这似乎有效。如果你想把它写成答案,我会接受它。 - iamthestreets
5个回答

2
为了避免这个错误,您可以在调用$this->db->reconnect();之前写入$this->load->database();

1
$this->load->database();请加载数据库。 - Shehzad Bilal
@Saty - 我们在哪里调用这个函数$this->db->database();在你调用$this->db->reconnect();之前,我在 model 或 control 中找不到它。 - Tariq Husain
@ShehzadBilal,你能看一下我的评论吗? - Tariq Husain
我已经修复了上面那一行。 - Ade

1
在某些情况下,$this->db->reconnect(); 会抛出错误。我不确定为什么会出现错误。当我知道原因时,我会更新答案。但是现在,为了解决这种问题,您可以执行以下操作:

替换:

$this->db->reconnect();

With:

$this->db->close();
$this->db->initialize();

1

对我来说,问题出在数据库文件的设置上。当我迁移服务器时,没有完全设置好mysql。我使用ssl连接到服务器。

一旦我注释掉了以下内容,所有问题都得到了解决。

$db['default']['options'] =  array(
    PDO::MYSQL_ATTR_SSL_KEY  => $_SERVER['DOCUMENT_ROOT'].'/application/third_party/client-key.p$
    PDO::MYSQL_ATTR_SSL_CERT => $_SERVER['DOCUMENT_ROOT'].'/application/third_party/client-cert.$
    PDO::MYSQL_ATTR_SSL_CA   => $_SERVER['DOCUMENT_ROOT'].'/application/third_party/ca-cert.pem'
  );

我开始禁用库和其他自动加载的文件,直到我推断出这不是模型或控制器引起的问题。一旦我禁用了数据库库,我就没有收到500服务器错误或mysql错误。检查连接设置后,我意识到是它导致了这个问题。

这对我来说也是个问题。 - sixty-nine

0

我曾经因为不同的原因遇到了类似的问题 - 我用超过12,000个select/updates操作大量地访问数据库。MySQL服务器最终崩溃并“度假”了。

无论如何,它只需要一点时间休息,在循环中我添加了:

if ($this->db->conn_id->ping() === FALSE)
{
    sleep(1);
    $this->db->reconnect();
}

1
这里的sleep是做什么用的?重新连接()本身并没有解决问题,直到添加了sleep。conn_id->ping()不在Codeigniter文档中。这是DB_driver的一部分吗? - imparante

0

如果需要的话,检查连接并重新建立它可能会更容易。

请参阅PHP:mysqli_ping获取相关信息。

有关参考资料,请查看。


我相信Codeigniter已经在做这件事了。我在底部编辑了我的帖子,说明了$this->db->reconnect();函数的作用。 - iamthestreets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接