Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118

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

28.10.2016, 05:51. Показов 2269. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru