sqlite долгий фоновый процесс

kapusta77
На сайте с 31.07.2014
Offline
61
319

Всем привет!

Как организовать работу с sqlite для долгого фонового процесса?

Есть php-скрип. Я открываю его в браузере и закрываю вкладку (процесс продолжает работу в фоновом режиме).


<?php
set_time_limit(0);
ignore_user_abort(true);

$db = new SQLite3('base.db');
$db->busyTimeout(5000);
$db->exec("PRAGMA journal_mode = WAL;");

$i = 0;
$db->exec('BEGIN IMMEDIATE;');
while (true) {

// здесь делаю записи в бд
// выхожу из цикла, когда закончатся входные данные



$i++;
if ($i == 10000) {
$i = 0;
$db->exec('COMMIT;');
$db->exec('BEGIN IMMEDIATE;');
}
}
?>

Есть второй скрипт, он только читает из бд.

Проблема в том, что изменения в бд не вносятся, пока не отработает первый скрипт.

Мне надо, чтобы превый скрипт работал в фоне, а во втором скрипте я сразу видел изменения.

IL
На сайте с 20.04.2007
Offline
435
#1
kapusta77:
Есть второй скрипт, он только читает из бд.
Проблема в том, что изменения в бд не вносятся, пока не отработает первый скрипт.

Второй скрипт открывается в том же браузере?

Попробуйте в режиме инкогнито к нему обратиться.. или в другом браузере.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
S
На сайте с 23.05.2004
Offline
315
#2
kapusta77:
Проблема в том, что изменения в бд не вносятся, пока не отработает первый скрипт.

Я не спец по sqlite, но там же транзакция открывается на 10.000 записей. Пока она не отработает, никаких изменений с таблицей быть не может.

p..s и где ее закрытие на последнем витке цикла ?

Это просто подпись.
kapusta77
На сайте с 31.07.2014
Offline
61
#3
ivan-lev:
Второй скрипт открывается в том же браузере?
Попробуйте в режиме инкогнито к нему обратиться.. или в другом браузере.

Нет, дело не в кеше браузера.

---------- Добавлено 04.08.2019 в 09:45 ----------

Stek:
Я не спец по sqlite, но там же транзакция открывается на 10.000 записей. Пока она не отработает, никаких изменений с таблицей быть не может.
p..s и где ее закрытие на последнем витке цикла ?

В конце бесконечного цикла есть закрытие транзакции. Пробовал разные условия $i для закрытия транзакции.


<?php
set_time_limit(0);
ignore_user_abort(true);

$db = new SQLite3('base.db');
$db->busyTimeout(5000);
$db->exec("PRAGMA journal_mode = WAL;");

$i = 0;
$db->exec('BEGIN IMMEDIATE;');
while (true) {

// здесь делаю записи в бд
// выхожу из цикла, когда закончатся входные данные



$i++;
if ($i == 10000) {
// пробовал разные условия (например $i == 100)
$i = 0;
$db->exec('COMMIT;');
$db->exec('BEGIN IMMEDIATE;');
}
}
$db->exec('COMMIT;');
?>

Фоновый процесс работает, журнал base.db-wal растет (уже 12 МБ), но транзакции не сбрасываются в бд. Только когда завершить процесс - тогда применятся измения в бд.

Как принудительно сбросить изменения в бд при PRAGMA journal_mode = WAL и при условии, что процесс еще не завершился?

Gerga
На сайте с 02.08.2015
Offline
94
#4
kapusta77:
Нет, дело не в кеше браузера.

ivan-lev имеет ввиду не кэш браузера. Под вас уже выделен процесс, который должен закончить свою работу.

kapusta77
На сайте с 31.07.2014
Offline
61
#5
Gerga:
ivan-lev имеет ввиду не кэш браузера. Под вас уже выделен процесс, который должен закончить свою работу.

Открыл второй скрипт (он только читает из бд) в другом браузере - нет изменений в бд.

IL
На сайте с 20.04.2007
Offline
435
#6
kapusta77:
Открыл второй скрипт (он только читает из бд) в другом браузере - нет изменений в бд.

1. Уменьшите счётчик для $i.. К примеру до 100.

2. Второй скрипт (читающий) в курсе про WAL?

kapusta77:
Нет, дело не в кеше браузера.

Речь о сессиях в PHP.

Gerga
На сайте с 02.08.2015
Offline
94
#7

kapusta77, как вы читаете базу данных? Скиньте код пожалуйста.

IL
На сайте с 20.04.2007
Offline
435
#8
kapusta77:
Только когда завершить процесс - тогда применятся измения в бд.

Как принудительно сбросить изменения в бд при PRAGMA journal_mode = WAL и при условии, что процесс еще не завершился?

PRAGMA schema.wal_checkpoint;
kapusta77
На сайте с 31.07.2014
Offline
61
#9

Нашел ошибку в коде: повторно использовал $i в другом месте, в итоге процесс не заходил в условие, где надо закрывать транзакцию.

Спасибо всем откликнувшимся!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий