Служба PHP и SQLite в памяти - PullRequest
0 голосов
/ 01 июня 2019

У меня есть одна страница, реагирующая на HTML-страницу. В одном разделе страницы есть поиск товара. Пользователь может ввести критерии поиска в форму и получить обратно результаты. Результаты разбиты на страницы.

<form id="filterform" name="filterform" method="post" action="./loaddata.php">
   ...
</form>

Форма отправляется Ajax, а результаты возвращаются в виде HTML-фрагмента, который динамически вставляется в DOM для обновления результатов.

Все работает нормально, но иногда результаты из файла loaddata.php очень медленные, обычно при первом вызове со страницы.

В loaddata.php я использую базу данных Sqlite3. Это только для чтения. Примерно так:

$filename = "../datafile.sqlite3";
$db = new SQLite3($filename);
$q = "SELECT distinct productId, title, price, name FROM datatable LIMIT 16";
$results = $db->query($q);
while ($row = $results->fetchArray()) {
    echo "<h1>Results</h1>";
}
$db->close();

Есть ли способ заставить loaddata.php загружаться и оставаться в памяти для ответа на отправку формы? Кажется, он будет перезагружать каждую отправку.

1 Ответ

0 голосов
/ 02 июня 2019

В зависимости от размера таблицы данных, которую вы можете сохранить в SESSION, используйте такие функции, как shmop_open / shmop_write / shmop_read или (еще лучше) используйте некоторые службы кэширования, такие как redis, но так или иначе данные будут храниться и обрабатыватьсякаждый раз, когда вы проходите мимо этого места.Я бы разбил страницу на части, создал бы один веб-сервис для работы с формой, а другой - для показа формы.

Самый простой (не обязательно самый безопасный или лучший способ сделать это) будет ... PS: IПредположим, что вы работаете с PDO, и (очевидно) приведенный ниже код является разработкой, на самом деле он не будет работать

if (isset($_SESSION['db_datatable'])) {
    foreach ($_SESSION['db_datatable'] AS $item) {
        echo "<h1>".$item['some_row']."</h1>";
    }
} else {
    $filename = "../datafile.sqlite3";
    $db = new SQLite3($filename);
    $q = "SELECT distinct productId, title, price, name FROM datatable LIMIT 16";
    $results = $db->query($q);
    while ($row = $results->fetchArray()) {
        $_SESSION['db_datatable'][] = $row;
        echo "<h1>Results</h1>";
    }
    $db->close();
}

Надеюсь, я вам чем-то помог.Ура! * * 1006

...