Какую технику кэширования использовать в моей ситуации? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть вопрос, касающийся лучшей техники автономного кэширования, которую можно использовать для простого прогрессивного веб-приложения, которое я сейчас создаю.

Короче говоря, я создаю приложение для объяснения лекарств, в котором пользовательнеобходимо ввести штрих-код, нажать «получить лекарство», после чего пользователь будет перенаправлен в файл result.php, содержащий основную информацию о лекарстве, которое я запросил из базы данных MySQL (штрих-код является ключом в этой простой базе данных).

Теперь я хочу внедрить автономное кэширование.Поэтому, когда пользователь впервые вводит этот штрих-код и попадает на страницу результатов, я хочу, чтобы эти данные, связанные с этим штрих-кодом, были сохранены в кеше.В следующий раз, когда человек не в сети и набирает тот же штрих-код в файле index.html и нажимает кнопку «Отправить», он должен снова отправить его на эту страницу результатов и отобразить данные кэша, которые были сохранены ранее.

Проблема сейчас в том, что я не знаю, какова лучшая техника кэширования.Я нашел сайт, который объясняет каждую из техник с примером того, как ее реализовать, но на самом деле я не знаю, что выбрать: https://jakearchibald.com/2014/offline-cookbook

Любой, кто может дать мне несколько советов для моей ситуации?

Это html и php файл, который у меня есть (пока все работает):

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Progressive Web Application - MAM11</title>
    <link rel="stylesheet" href="styles/main.css">
    <script src="scripts/app.js" async></script>
</head>
<body>

    <h1>Pill-Explainer</h1>

    <p>Please enter the European Article Number (EAN) of your medication below. <br>
        You can find the EAN at the outside of your medication box often starting with the number 8 and containing 13 digits in total. </p>

    <img src="images/barcode.jpg"> <br>

 <form action="http://192.168.0.104/MedicationProject/result.php" method="post">

     <input type="number" placeholder="Enter barcode" name="barcode" id="barcode"> <br>
     <input type="submit" value="Get medication" id="submit">
 </form>

</body>

<?php 
// 1. database credentials
$host = "sql7.freemysqlhosting.net";
$db_name = "sql7264357";
$username = "sql7264357";
$password = "*********";

// 2. connect to database
$con = new PDO("mysql:host={$host};dbname={$db_name}", $username, $password);

// 3. get barcode value from inputfield in previous document
$search=$_POST['barcode']; 

// 4. prepare select query
$query = 'SELECT ProductName, ActiveIngredient, Description, Leaflet 
FROM Medications WHERE Barcode = "'.$search.'"';
$stmt = $con->prepare( $query );

// 5. execute our query
$stmt->execute();

// 6. store retrieved row to the 'row' variable
$row = $stmt->fetch(PDO::FETCH_ASSOC);
?> 

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Progressive Web Application - MAM11</title>
    <link rel="stylesheet" href="styles/result.css">
</head>
<body>

    <h1>Pill-Explainer</h1>     


 <form action="/action_page.php">

     <label>Productname:</label> 
     <textarea type="text" id="productname"><?php echo $row['ProductName']?></textarea>                

     <label>Active ingredient:</label>
     <textarea type="text" id="ingredient"><?php echo $row['ActiveIngredient']?></textarea>

     <label>Description:</label>
     <textarea type="text" id="description"><?php echo $row['Description']?></textarea>

 </form>

<div id="buttons">
    <a href="index.html">
        <img src="images/back-button.jpg">
    </a>

    <a href="<?php echo $row['Leaflet']?>">
        <button type="button">Download leaflet <br> (Internet only)</button>
    </a>
</div>

</body>

Я также начал делать сервис-работника, чтобы хотя бы кэшировать оболочку приложения (которая работает до сих пор).Поэтому мне удалось кэшировать все мои файлы, мне нужна только помощь в части кэширования данных.

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Звучит как интересный проект.

Есть несколько способов, которыми вы могли бы подойти к этому, но я думаю, что нижеприведенное будет самым простым.Вы нашли отличный ресурс в https://jakearchibald.com,, он один из лидеров мышления в первую очередь в оффлайне и PWA, и он, безусловно, хорош для подражания.

В вашем случае, похоже, вам следуетиспользовать IndexedDB, встроенную базу данных в современных браузерах, которая позволяет хранить значительные объемы структурированных данных в кэше браузера, включая JSON.(https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) Затем вы можете расширить свой сервисный работник, чтобы перехватить запрос и сначала проверить IndexedDB на наличие данных, прежде чем делать вызов бэкенду. Я пришел из NodeJS, так что в мире PHP это может немного отличаться, но япредставьте, что приведенные ниже основные шаги должны быть одинаковыми:

  1. При первом вызове были получены данные о таблетке X
  2. Данные, представленные на странице, данные также кэшируются в IndexedDB как JSON
  3. Пользователь снова ищет таблетку X
  4. Запись работника службы перехватит вызов и сначала проверит, существует ли допустимая IndexedDB для этого поиска, т. Е. Таблетка X. Если есть, то следует использовать данные из кэша, если нет, то вызов службы должен быть разрешен для завершения.

Я понимаю, что это очень упрощенный ответ, но я полагаю, что это будет ваш основной путь для достижения этой цели.

0 голосов
/ 12 ноября 2018

Я бы сказал: используйте indexDB, потому что это поможет вам запрашивать и извлекать конкретный результат с точки зрения производительности и разработки.

ваши данные mysql будут передаваться с сервера в браузер в форме JSON (если нет, то сделайте это, потому что я не вижу причин не использовать его), так что вы можете напрямую сохранить в indexDB.

Вторая вещь indexDB в базе данных NoSql, поэтому данные Mysql (SQL) легко хранить в любой базе данных NoSql, поскольку они уже структурированы, а базы данных NoSql являются динамическими.

localStorage будет проблемой, если предположить, что использует большое количество штрих-кодов, вы будете хранить в локальном хранилище, так что размер локального хранилища будет расти, теперь для запроса вы должны проходить по каждой записи, пока не получитезапросить штрих-код, но в indexDB вы можете использовать индексацию.

Cookies для трекера, аналитических данных и т. Д.

, так что, наконец, перейдите с indexDB.

если у вас есть запрос, не стесняйтесь оставлять заметку

0 голосов
/ 12 ноября 2018

Как насчет хранения данных в localStorage?

Вы берете barcode в качестве ключа и помещаете туда данные stringifed.

...