SQL вставка или обновление тайм-аут, если большая дата в цикле

У меня есть некоторые данные с идентификатором пользователя и датой.

Иногда есть большие данные, которые мне нужно перебрать и обновить базу данных 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']);
}
}

Благодарю вас.

-1

Решение

Сделайте вставку / обновление вне цикла. Включите его в транзакцию, чтобы не получить несогласованное состояние базы данных, если сценарий преждевременно умирает. Использование одного большого запроса обычно быстрее, чем много маленьких запросов. Вы также можете установить более высокие значения для времени и памяти, но помните о последствиях.

0

Другие решения

Знаете ли вы о PHP-функции под названием set_time_limit()? Вы можете найти подробную документацию Вот.

Это может манипулировать временем выполнения, которое по умолчанию составляет 30 секунд. Если вы установите его на 0, например, set_time_limit (0), ограничения по времени выполнения не будет.

0

Может быть зацикливание является причиной истечения времени ожидания.
Потому что, когда вы выполняете операции вставки / обновления в стороне цикла, соединение с базой данных будет в открытом состоянии, пока цикл не будет прерван, что может вызвать проблему тайм-аута.

Попробуйте выполнить операцию вставки / обновления вне цикла.

-1
По вопросам рекламы [email protected]