Codeigniter Cron作业比插入到数据库花费更多时间

mctunoxg  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(103)

我有一个cron job,它调用下面的codeigniter controller
但这太浪费时间了
其中计算和操作操作较多(平均需要5分钟)
然后在数据库中插入值

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Mycron extends CI_Controller {

    public function cron_function()
    {
        // simulate time cost operations
        sleep(300); // 5 mint = 5 *60 = 300 sec

        $this->load->database();    // line1
        $this->db->reconnect();     // line2

        $this           -> db -> set    ( 'source_id',  '11');
        $this           -> db -> set    ( 'title',  'TTL');
        $query = $this  -> db -> insert ( 'my_table' );

        echo 'END ...'; 
    }
}

我的问题
没有两条线路1/2
当数据库在操作所用时间之后尝试连接时,结果将为

SQL Error: 2006: MySQL server has gone away

然后,当尝试使用2行将修复RE_CONNECT应用于数据库时
我们面对

A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information - headers already sent by 
(output started at .../system/database/drivers/mysqli/mysqli_driver.php:392)
Filename: core/Common.php
Line Number: 568
Backtrace:

A PHP Error was encountered
Severity: Error
Message: Call to a member function real_escape_string() on boolean
Filename: mysqli/mysqli_driver.php
Line Number: 392
Backtrace:
mwyxok5s

mwyxok5s1#

我建议在cron控制器中创建第二个方法,只负责将数据插入数据库。
然后,在完成耗时的操作之后,您可以将生成的数据(例如curl)发布到第二个方法,从而绕过MySQL超时限制。

q9rjltbz

q9rjltbz2#

我禁用了database库的自动加载
旧代码

$autoload['libraries'] = array('database');

$autoload['libraries'] = array();

并在调用DB语句之前手动加载

$this->load->database();

因此,数据库连接将在耗时的操作完成后打开
则此时间(高成本操作)将不被视为数据库 * 同步操作时间 *
database库的自动加载相反,它在页面加载时启动计时器

wljmcqd8

wljmcqd83#

您必须使用insert_batch(),这比insert()快得多。
有关https://www.codeigniter.com/userguide3/database/query_builder.html?highlight=update_batch#inserting-data详细信息,请访问www.example.com。

相关问题