Mysqli Async — Как это работает?

Мое приложение представляет собой проигрыватель цифровых вывесок. Нам необходимо регулярно отправлять удаленные доказательства воспроизведения данных в облако. Данные доказательства воспроизведения кэшируются, чтобы помочь с прерываниями сети.

Игрок может легко создать 6000 записей POP за день. Когда сеть восстанавливается, это может привести к довольно серьезной задержке перехода от одной презентации к другой.

Я смотрел на использование асинхронного режима MySql, чтобы попытаться уменьшить эту задержку … Но я не думаю, что это делает то, что я думаю, что делает.

Я перебираю большой набор результатов, мне все еще придется ждать завершения цикла. Должен ли я объединить 6000 вкладок и отправить их все сразу? В какой момент мой AJAX возвращает результат, если я все еще жду асинхронного вызова базы данных? Разве это просто не работает таким образом? Google возвращает меньше страницы результатов, и Документы на самом деле не проливают свет.

$sql = "SELECT MAX(time) from `pop` where `displayId` = ".$_GET['id'];
$res = $local->query($sql);
$row = $res->fetch_row();
//$log->lwrite("Last Updated is ".$row[0]);

$sql = "SELECT * FROM `pop`
WHERE `displayId` = ".$_GET['id']
." AND `time` > '".$row[0]."' LIMIT 1000";
$local->query($sql, MYSQLI_ASYNC);
if ($res = $local->reap_async_query()) {
while ($row = $res->fetch_row()) {
$log->lwrite(print_r($row, 1));
$sql = "INSERT INTO `pop`
(`displayId`, `time`, `duration`, `presId`)
VALUES ('".$row[1]."', '".$row[2]."', '".$row[3]."', '".$row[4]."')";
$remote->query($sql, MYSQLI_ASYNC);
}
}

Я уже смирился с тем, что мне придется делать это по-другому. Теперь мне просто любопытно. 🙂

Я что-то здесь упускаю?

Спасибо за ваше время и помощь.

2

Решение

Вы говорите о сети между вашим php-сервером и СУБД? В этом случае вы действительно не поняли async mysqli.

Смысл использования асинхронных запросов заключается в применении DML без блокировки вашего кода PHP. Он НЕ предназначен для постановки команд в систему, которая может регулярно находиться в автономном режиме. Также вы не должны выставлять СУБД прямо в Интернете. Он предоставляет окно, в котором вы делаете другие вещи с вашим php-кодом (например, выполняете другие запросы или отправляете данные клиенту). Он не предназначен для выполнения операций с данными после завершения сценария.

Есть много способов решить проблему, большинство из которых включают запуск демонов на обоих концах соединения — это может быть основным ограничением для большинства людей. Вы не сказали, какой контроль вы имеете над системами на каждом конце. Компромиссным решением будет использование рабочих мест в спутниковых системах. Конечно, вы не должны пытаться реплицировать данные в обработчике для веб-запроса.

Вы пытаетесь реплицировать всю таблицу локально? Если так, то почему бы не использовать встроенную репликацию MySQL (по каналу VPN).

0

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

Других решений пока нет …

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