Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118

Кеширование результатов sql запроса в файл

28.10.2016, 05:51. Показов 2245. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Имеется интернет магазин. На каждой страничке его выскакивает баннер с десятью разными товарами (взятых из БД). То есть листая страницы, каждый пользователь делает запрос в БД. Если пользователей сотни-нагрузка на сервер возрастает с 6% до 50%. Хостинг виртуальный. Хостер матерится уже.

Решил закэшировать результаты запроса в файл.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 function read($filename) {
    if (file_exists($filename)) {
        $handle = fopen($filename, 'rb');
        $variable = fread($handle, filesize($filename));
        fclose($handle);
        return unserialize($variable);
    } else {
        return null;
    }
}
    function write($filename,$variable) {
        $handle = fopen($filename, 'a');
        fwrite($handle, serialize($variable));
        fclose($handle);
    }
....
....
....
      $data = read($filename); 
    if (empty($data)) {
               echo "данные кеша пусты";
               sql="Select......" 
               $res = $db->sql_query(sql); // результатом запроса будет несколько сотен тысяч строк 
               write($filename, $res);   // начиная отсюда вообще не понятно как делать
      } else {
               echo "данные кеша НЕ пусты";
              // как вывести результат ?
              }
Подскажите как правильно сохранить в файл результаты запроса, чтобы имм можно было пользоваться? И как пользоваться с помощью sql_fetchrow?
Может есть какое другое решение? Голову ломаю вторую неделю

ps такое решение взято отсюда:
Кликните здесь для просмотра всего текста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2016, 05:51
Ответы с готовыми решениями:

Кеширование запроса как сделать?
Всем привет! Помогите пожалуйста. Как сделать, чтобы данный скрипт запрашивал данные только 1 раз в 5 минут. Нужно его как бы закешировать,...

Сортировка результатов запроса
Здравствуйте, имеется таблица для обменивания сообщениями. Структура: id | to | from | date | attached | status | message. Чтобы получить...

Склейка результатов запроса
Пишу скрипт, который выводит информацию из бд. в бд две таблицы 1) Категории в них где id - номер категории name - называние ...

30
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
29.10.2016, 11:25
Студворк — интернет-сервис помощи студентам
kupidon, выводите не случайные, а продвигаемые(заранее подготовленные)
кто знает что они случайные?
подготовили несколько наборов готовых и выводим из них
1
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 13:04  [ТС]
можно ли как-то сгруппировать по 100 штук id и вывести по одной из каждой группы? результат запроса уже в сто раз меньше получится
как составить такой запрос?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
29.10.2016, 13:23
Да просто получите количество записей, затем на PHP генерируйте число от 1 до N. После чего составляйте запрос и выбирайте записи. Правда при таком подходе куча UNION получится. Зато быстро, по сравнению ORDER BY RAND().
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 13:38  [ТС]
я сейчас так почти делаю.
1. выбираю запросом все требуемые записи (вот тут уже долго)
2. Формирую массив из всех получившихся ид
3. делаю новый массив из десяти рандомных записей предыдущего массива
4. потом уже беру из базы требуемые конкретные 10 id , c помощью IN()
но на пункте 1 уже долгий запрос

а просто сделать 10раз рандом выбор от 1 до Numrows не могу, так как есть пропуски в id в результате

или я не так Вас понял?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
29.10.2016, 13:44
Не поняли. Не надо получать все записи, надо получить лишь их количество:
SQL
1
SELECT COUNT(*) FROM таблица
Допустим, что получили 70.
Теперь делаем:
PHP
1
2
3
4
5
6
7
8
9
10
# Это возвратил первый запрос
$count = 70;
 
for ($i = 0; $i < 10; $i++) {
    # Получаем случайное смещение
    $offset = mt_rand(1, $count);
 
    # Дописываем запрос
    $query .= "... LIMIT {$offset}, 1";
}
1
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 21:34  [ТС]
интересно. спасибо за идею. попробую чуть позже, отпишусь

Добавлено через 7 часов 39 минут
Сделал так:
Вкратце:
создал доп таблицу в бд сделал доп столбец с автоинкремент. Скопировал туда результаты моего запроса (примерно 190000 строк) . Теперь у меня появился столбец с цифрами от 1 до N без пробелов. Выбираю на пхп рандомные 10 чисел и потом уже из них формирую баннер.
Один раз в сутки удаляю таблицу и копирую туда новые данные.
В итоге сам скрипт работает меньше 0.5 секунды (вместе с отображением баннера), а ночное обновление вспомогательной таблицы занимает примерно 15-17 секунд. Но это того стоит.

Большое спасибо за помощь, взял ваши примеры для другого скрипта.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
30.10.2016, 22:11
SQL
1
2
3
4
5
6
НЕПРАВИЛЬНО: SELECT * FROM `table` ORDER BY rand() LIMIT 10;
ТОЖЕ НЕПРАВИЛЬНО: SELECT COUNT(*) FROM `table`; + SELECT * FROM `table` LIMIT рандомное_число_из_пред.селекта,1;
 
ПРАВИЛЬНО: SELECT `id` FROM `table` WHERE `id` IN (10000,60000,110000,160000,210000,260000,310000,360000,410000,460000);
 
ещё можно: SELECT * WHERE `id` BETWEEN 5 AND 15 (т.е. просто подряд)
я подозреваю, что там индексы отсутствуют, или не все, или не так, или не там
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
31.10.2016, 07:58
Цитата Сообщение от полудух Посмотреть сообщение
ПРАВИЛЬНО: SELECT `id` FROM `table` WHERE `id` IN (10000,60000,110000,160000,210000,260000 ,310000,360000,410000,460000);
ещё можно: SELECT * WHERE `id` BETWEEN 5 AND 15 (т.е. просто подряд)
Объясните мне толковито -- а откуда ID брать собираетесь для перечисления?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
31.10.2016, 07:59
mt_rand()
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
31.10.2016, 08:39
А если не будет записей с такими ID?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
31.10.2016, 08:40
сделайте запрос на 30, оставьте 10
2 запроса на крайняк, если 1й не добрал
это всё-равно будет в разы быстрее, чем RAND()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2016, 08:40
Помогаю со студенческими работами здесь

Передача результатов запроса из бд в POST
Доброго времени суток! не могу справиться с такой задачей: вывожу на печать строки из бд и помещаю их в таблицу: ...

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

Вывод результатов поискового запроса
Здравствуйте. Прошу помочь. Привожу часть кода проверки и вывода результатов поискового запроса. Всё бы хорошо, но если не ввести ничего...

Вывод результатов запроса в таблицу, в шаблон
Здравствуйте, имеется некая выборка, пусть $zapros=oci_parse($con, 'select * from dual'); oci_execute($zapros); Необходимо...

Получить ассоциативный массив из результатов запроса к БД MSSQL
Доброго всем дня! Возникла проблема с созданием ассоциативного массива, данные для которого берутся из результатов SQL-запроса к БД...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru