| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Наивен ли я , что смогу снизить нагрузку сессиями? |
| Автор: Muerto 21.2.2010, 03:37 |
| Здравствуйте друзья, у меня есть сайт http://promote-it.ru Так вот, такие типы сайта, оч грузят базу, ибо показывают очень много вещей в реальном времени... поэтому я подумал, а почему бы собственно не грузить данные только один раз, а патом при переходе выводить данные из сессии? Все бы было хорошо НО, браузер виснет и сайт не грузится после перехода через пару страниц! Все же стоит использовать текстовый документ для снижения нагрузки на сервер/базу ? |
| Автор: MaXL 21.2.2010, 07:53 |
| Чото не увидел я на сайте что-либо "тяжёлого". Да и странно, что браузер виснуть начинает. Если с коннектом всё норм, то возможно бага в реализации. Выгружать данные в сэссии это конечно жесть. Хотя сэссии это теже самые файлы, только со "встроенным" интерфейс работы с ними. Вот только одно, если посещаемость большая, то держать огромные массивы данных в сэссиях не приемлемо. Ведь при обращении браузера к сайту, в память будут грузиться все сохранённые в сэссиях переменные, а значит при большом кол-во обращений к серверу, память будет перегружена. И может не хватить memory_limit. Так что здесь выход один -- кэшировать полностью страницы(или какие-то их части, меню например) и затем читать и отдавать пользователю. |
| Автор: MoLeX 21.2.2010, 08:46 | ||
сайт нечего не подгружает, и вообще статичный. Но оптимизации требует, хотя бы вот эти моменты:
N-ое количество повторений одного и того же, вынеси во ф-цию |
| Автор: smartov 21.2.2010, 10:18 |
| Сайт напоминает анекдот "Мадам, оставьте сессии масло - смените машину" |
| Автор: Muerto 21.2.2010, 10:36 |
| MoLeX, Не забывайте что вы видите только результат, гоно на самом деле в цикле с базы берет! MaXL, Да надо бы мне научится наконец то с кешем работать... отдельные места не знал что кешировать можно... а что за memory_limit ? Мне как бы нужна такая схема работы If Session !=1 значит мол обращаемся к базе else (если уже посещал страницу и где то данные сохраняются) то грузим с места сохранения НО если посмотреть сейчас на BIG Бонус, где я даю пользователям собирать бонусы и сайты там по циклу идут, то я там использую массив! причем как для капчи. которая очень приколньая однако.... и для ссылок рекламных Вот что я так сказать изабрел... http://fastpic.ru/view/2/2010/0221/03eb49d39376d3f8d83742ef5f32043d.jpg.html |
| Автор: Muerto 21.2.2010, 10:48 |
| smartov, Ну представте что у меня в базе 22 записи, где вычисляется если заказали мини баннер или нет.. Я бы был рад каким то другим оброзом их читать... Но не забываем что это не 5 запросов и не 20, а всего один SELECT * FROM а затем уже идет просот while(fetch... Возможно я мог бы немного оптимизировать, если бы не заказанные просто не были в базе, а то у меня просто 22 записи с конечной датой, затем там по нулям все в конце заказа |
| Автор: awers 21.2.2010, 10:57 | ||||
| Пол секунды генерация такой страницы - жесть. Браузер от сессий не виснит кстати. Хочу немного повредничать
Поддержу ка я smartov'a |
| Автор: Muerto 21.2.2010, 11:02 |
| awers, А сейчас сессий нету... я их снес... Меня кстати безопасность моей капчи немного волнует... И кстати пол секунды это много? Я пока не оптимизировал запросы могло быть и все 20=-) Дело в том что там рандомация идет... например для "текстовый баннер" |
| Автор: awers 21.2.2010, 11:48 | ||
это как 50 лет
Это дело можно и бд решить .. select * from banners where active = 1 and .... order by rand(); Такие проекты надо отстреливать а не отлаживать :( |
| Автор: IgorIV 21.2.2010, 12:12 |
| Muerto, вопрос не правилен. Для начала надо собрать статистику. Вот страница сгенерированна за 0.5 секунд. Узнай куда ушло это время. |
| Автор: smartov 21.2.2010, 13:06 | ||
Muerto,
уважаемый. Вы свои мысли с трудом формулируете на форуме. Может рановато программировать? В любом случае очевидно, что если тут всего 22 записи то тормоза не в месте чтения записей из базы. И кеш тут делать не надо. |
| Автор: Muerto 21.2.2010, 22:46 |
| awers, в данном случае не согласен, order by rand() при tысачи записей делать пытались smartov, я в россии уже лет 16 не живу а мне всего 21, не красиво судит мои интелект по граматике |
| Автор: awers 22.2.2010, 00:57 |
| Muerto, да, только что потестил на 60к записей - действительно не айс. Но опять же, это 60к а не 22 |
| Автор: maximus666 22.2.2010, 07:42 |
| В качестве кеша могу посоветовать Memcached, гораздо быстрее чем на файлах. |
| Автор: IgorIV 22.2.2010, 10:11 |
| maximus666, Ага, на шаред-хостинге. |
| Автор: smartov 22.2.2010, 15:03 | ||||
Указывайте страну проживания для избежания подобных непониманий. Я думаю вам мало понравится если вам начнут объяснять научный доклад на ломанной языке той страны, где вы живете.
Вам подсказать как оптимизировать запрос на псевдо-рандомизацию? |
| Автор: IZ@TOP 24.2.2010, 10:12 |
| smartov, мне подскажи, пожалуйста. Что-то вроде: имеем 1кк записей, надо выбрать разных 10 типов с наименьшим значением одного из полей и случайным образом отсортировать эти записи. На лету. |
| Автор: sTa1kEr 24.2.2010, 11:04 |
| http://jan.kneschke.de/projects/mysql/order-by-rand/ |
| Автор: smartov 24.2.2010, 17:05 |
| IZ@TOP, дополнительным псевдо-рандомным полем которое обновляется раз в сутки, например. Вот тут описывается один из вариантов http://habrahabr.ru/blogs/mysql/55864/ Случай, когда нужно получить слишком много записей по условию, и ВСЕ ИХ после выборки расставлять их в рандомном порядке не рассматривается в виду либо явного просчета проектирования. |
| Автор: IZ@TOP 25.2.2010, 01:32 | ||
Этот вариант не интересен в виду своей банальности. Обыкновенная денормализация данных (если хотите - псевдорандомное значение в отдельном поле) используется по умолчанию. Просто подумалось, что можете еще способ подсказать. О просчетах проектирования готов послушать. 1. Имеем связанные данные, которые получаем из нескольких источников. 2. Данные в нормализованном виде сохраняем в базу. 3. Предположим, что выходит две сущности (таблицы), связанных одна ко многим. Т.е. запись в первой таблице связана с неопределенным количеством записей в другой. Задача. Выбрать данные по следующему условию: 1. Записи из таблицы "одна ко многим" должны соответствовать условию поле1=значение. 2. Записи из таблицы "многие к одному" должны соответствовать нескольким условиям, вроде поле1-2=значение1-2, должны быть отсортированы по поле3, связаны с таблицей "одна ко многим" по полю поле4. 3. Данные должны быть сгруппированы по поле4 и случайным образом выбраны 20 записей из полученного результата. Требования: оригинальные данные сохранить в нормализованном виде, при денормализации и синхронизации, денормализованные данные не должны расходиться с оригинальной версией. Мне тут видится один самый простой вариант реализации. Но, если есть идеи - готов выслушать. |
| Автор: Fortop 25.2.2010, 08:58 | ||
Любопытно, и в итоге этих манипуляций получается 1кк записей? Что за данные там лежат, если не секрет? |
| Автор: smartov 25.2.2010, 11:07 |
| IZ@TOP, Насколько я вижу твою задачу этот банальный вариант с денормализацией вполне тебя устраивает. "Случайные" 20 записаей вполне могут быть получены этим методом. Поправь меня если я что-то не так понял |
| Автор: IZ@TOP 25.2.2010, 12:40 |
| smartov, все верно. Меня все устраивает, тем более, что это было временной необходимостью вызванной восполненным сознанием руководства Fortop, база данных вроде market.yandex.ru. |
| Автор: smartov 25.2.2010, 13:20 | ||
Нет, сорри, тайным знанием не владею Да и вообще просветить я рвался автора топика, который явно не знает о вещах, которые тебе кажутся банальными |
| Автор: IZ@TOP 25.2.2010, 13:27 |
| smartov, надеюсь мы его совместными усилиями хоть немного просветили |
| Автор: Muerto 25.2.2010, 18:46 |
| awers, а в 22 нет никакой рандомации ,рандомация идет в объявлениях и ротаторах=-) Добавлено @ 18:49 IgorIV, У меня VDS причем не хилый, а не шард хост... А насчет рандомации, Order by rand самый поршивый метод, после него есть функция которая по поиску допустим можете найти, как мол получить random value, но она опять же вас разочарует если у вас таблица по ID не по порядку, как у меня например... Я вот пользуюсь функцие которая как бы берет все записи, присваиваем им ID и затем уже рандомирует, решая при этом проблему пропуска А скорость очень высокая |
| Автор: IgorIV 25.2.2010, 21:27 |
Linux? |
| Автор: Muerto 26.2.2010, 02:32 |
| IgorIV, Да CentOS стоит |
| Автор: IgorIV 26.2.2010, 21:01 |
| CentOS в глаза не видел. Я думаю, что тебе надо определить медленные места в скрипте. А потом уже выяснять как их убыстрить. |