gpt4 book ai didi

php - 具有数千个插入的 Codeigniter 的 insert_batch() 缺少记录

转载 作者:可可西里 更新时间:2023-11-01 06:37:52 27 4
gpt4 key购买 nike

我正在使用 insert_batch() 将 10000 多行批量插入到数据库的表中。我正在做一些测试,我注意到有时所有 10.000 多行都被正确插入,但在某些情况下,我在表的总计数中遗漏了 100 多行。

我所拥有的记录中的现场数据没有问题,因为我对我的每个测试都使用相同的数据,而且大多数时候我都没有问题。例如,我尝试了 20 次将相同的数据插入到我的数据库中,并且在 19 次时所有行都将被正确插入,但在这一次我将错过 100 或更多行。

insert_batch() 的函数如下:

protected function save_sms_to_database() {
//insert_Batch
$datestring = "%Y-%m-%d %h:%m:%s";
$time = time();
$datetime = mdate($datestring, $time);

$this->date_sent = $datetime;

foreach ($this->destinations as $k => $v) {
$sms_data[$k] = array(
'campaign_id' => $this->campaign_id,
'sender_id' => $this->from,
'destination' => $v,
'token' => md5(time() . 'smstoken' . rand(1, 99999999999)),
'message' => $this->body,
'unicode' => $this->unicode,
'long' => $this->longsms,
'credit_cost' => $this->eachMsgCreditCost,
'date_sent' => $this->date_sent,
'deleted' => 0,
'status' => 1,
'scheduled' => $this->scheduled,
);
}

$this->ci->db->insert_batch('outgoingSMS', $sms_data);
if ($this->ci->db->affected_rows() > 0) {
// outgoingSMS data were successfully inserted
return TRUE;
} else {
log_message('error', $this->campaign_id.' :: Could not insert sms into database');
log_message('error', $this->ci->db->_error_message());
return FALSE; // sms was not inserted correctly
}
}

在这种情况下,我该如何调试 insert_batch()

我对 DB_active_rec.php 进行了一些更改,以便在 insert_batch 期间进行一些日志记录,但到目前为止我无法成功重现问题以查看问题所在。但就问题一开始出现 2-3 次并且我没有对我的逻辑进行重大更改来修复它而言,我不能就这样离开,因为我不信任 codeigniter 的 insert_batch() 用于生产的函数。

我还添加了 codeigniter 的 insert_batch() 函数:

    public function insert_batch($table = '', $set = NULL)
{
$countz = 0;
if ( ! is_null($set))
{
$this->set_insert_batch($set);
}

if (count($this->ar_set) == 0)
{
if ($this->db_debug)
{
//No valid data array. Folds in cases where keys and values did not match up
return $this->display_error('db_must_use_set');
}
return FALSE;
}

if ($table == '')
{
if ( ! isset($this->ar_from[0]))
{
if ($this->db_debug)
{
return $this->display_error('db_must_set_table');
}
return FALSE;
}

$table = $this->ar_from[0];
}

// Batch this baby
for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100)
{

$sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100));

//echo $sql;

$this->query($sql);
$countz = $countz + $this->affected_rows();
}

$this->_reset_write();
log_message('info', "Total inserts from batch:".$countz);

return TRUE;
}

最后一个 log_message() 以及来自批处理的总插入量也显示了问题,因为当我的插入量少于预期时,我也得到了非预期的插入量。

我必须考虑其他方法才能将数千行插入到我的数据库中 w/或 w/o codeigniter。

有人知道这类问题吗?可能是硬盘或者系统内存在性能不足的时候有什么关系?这是一台带有 1gb 内存的旧 PC。

编辑:根据要求,我在这里放了一个示例 INSERT 语句,其中包含 9 行,由 codeigniter 的 insert_batch() 函数生成

INSERT INTO `outgoingSMS` (`campaign_id`, `credit_cost`, `date_sent`, `deleted`, `destination`, `long`, `message`, `scheduled`, `sender_id`, `status`, `token`, `unicode`) VALUES ('279',1,'2013-08-02 02:08:34',0,'14141415151515',0,'fd',0,'sotos',1,'4d270f6cc2fb32fb47f81e8e15412a36',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000140',0,'fd',0,'sotos',1,'9d5a0572f5bb2807e33571c3cbf8bd09',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000142',0,'fd',0,'sotos',1,'ab99174d88f7d19850fde010a1518854',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000147',0,'fd',0,'sotos',1,'95c48b96397b21ddbe17ad8ed026221e',0), ('279',1,'2013-08-02 02:08:34',0,'306972233469',0,'fd',0,'sotos',1,'6c55bc3181be50d8a99f0ddba1e783bf',0), ('279',1,'2013-08-02 02:08:34',0,'306972233470',0,'fd',0,'sotos',1,'d9cae1cbe7eaecb9c0726dce5f872e1c',0), ('279',1,'2013-08-02 02:08:34',0,'306972233474',0,'fd',0,'sotos',1,'579c34fa7778ac2e329afe894339a43d',0), ('279',1,'2013-08-02 02:08:34',0,'306972233475',0,'fd',0,'sotos',1,'77d68c23422bb11558cf6fa9718b73d2',0), ('279',1,'2013-08-02 02:08:34',0,'30697444333',0,'fd',0,'sotos',1,'a7fd63b8b053b04bc9f83dcd4cf1df55',0)

那是一个完整的插入。

最佳答案

insert_batch() 试图完全避免您的问题 - 尝试插入大于 MySQL 配置为一次处理的数据。我不确定 MySQL 的选项是 max_allowed_pa​​cket 还是其他,但它的问题是它设置了字节限制而不是行数限制。

如果您要编辑 DB_active_rec.php、mysql_driver.php 或任何合适的内容...请尝试更改 for() 循环中的 100 计数。 50 应该是一个更安全的选择。

除此之外,仅供引用 - 如果您通过 insert_batch() 插入超过 100 行,affected_rows() 将不会返回正确的值,因此它不是可靠地使用它作为成功/错误检查。这是因为 insert_batch() 一次插入 100 条记录,而 affected_rows() 只会返回最后一次查询的数据。

关于php - 具有数千个插入的 Codeigniter 的 insert_batch() 缺少记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18015852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com