我有一些用户ID和日期的数据。
有时我需要循环并更新sql数据库但数据库超时的大数据。
有没有更好的方法我可以这样做,下面的示例代码。
foreach($time[$re->userid][$today] as $t){
if(($re->time >= $t->in_from) && ($re->time < $t->in_to)
&& md5($t->WorkDay."_in".$re->date) != $in){//in
$tble = tools::sd("{$t->WorkDay} in");
}
if(($re->time >= $t->out_from) && ($re->time < $t->out_to)
&& md5($t->WorkDay."_out".$re->date) != $out){//out
$tble = tools::sd("{$t->WorkDay} out");
if($tble =='nout'){
$re->date2 = tools::ndate($re->date . "- 1");
}
}
if(!empty($tble)){
$q = array(
"id" => $re->userid
, "dt" => $re->date2
, "{$tble}" => $re->time
);
dump($q); // insert into sql
}
}
转储功能:::
function dump($d ='')
{
if(!empty($d)){
end($d);
$tble = key($d);
$d['ld'] = "{$d['dt']} {$d[$tble]}";
$r = $GLOBALS['mssqldb']->get_results("
IF NOT EXISTS (select id,ld,dt,{$tble} from clockL
WHERE id = '{$d['id']}'
AND dt ='{$d['dt']}')
INSERT INTO clockL (id,ld,dt,{$tble})
VALUES ('{$d['id']}','{$d['ld']}','{$d['dt']}'
,'{$d[$tble]}')
ELSE IF EXISTS (select id,{$tble} from clockL
WHERE id = '{$d['id']}'
AND dt ='{$d['dt']}'
AND {$tble} = 'NOC'
)
update clockL SET {$tble} ='{$d[$tble]}', ld ='{$d['ld']}' WHERE id = '{$d['id']}'
AND dt ='{$d['dt']}' AND {$tble} ='NOC'
");
//print_r($GLOBALS['mssqldb']);
}
}
谢谢。
答案 0 :(得分:0)
您是否了解名为set_time_limit()
的PHP函数?您可以找到详细的文档here。
这可以操纵执行时间,默认为30秒。如果将其设置为0,例如set_time_limit(0),则不会有执行时间限制。
答案 1 :(得分:0)
在循环外部执行插入/更新。将其包含在事务中,以便在脚本过早死亡时不会出现不一致的数据库状态。使用一个大查询通常比制作大量小查询更快。您可能还会为时间和内存限制设置更高的值,但请注意其后果。
答案 2 :(得分:-1)
可能是循环是超时的原因。 因为当您在循环中执行插入/更新操作时,与数据库的连接将处于打开状态,直到循环终止,这可能导致超时问题。
尝试在循环外执行插入/更新操作。