Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.11.2013, 18:33
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 1  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
По умолчанию Практика работы РНР-классов

Здравствуйте.
Интересует вот такая запись на РНР
PHP код:
$lib->find(array(),$filter)->skip($offset)->limit(12); 
равносильна ли данная запись этой?
PHP код:
$arr $lib->find(array(),$filter);
$skip $arr->skip($offset);
$limit $skip->limit(12); 
или всё же первая цепочка обрабатывается справа на лево? (т.е. учитываются все параметры)
В данном случае это доступ к базе данных (MongoDB) или всё же без разницы как записывать и обработка идёт по цепочке слева направо как в первом так и во втором варианте?
__________________
return this...

Старый 11.11.2013, 20:54
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Это method chaining. find возвращает this, у которого дёргается skip, у которого дёргается limit. Так что да, с точки зрения языка – равносильна.
Ещё вполне вероятно, что запрос будет выполнен при первым обращениям к данным, что в принципе убирает разницу "что первое".

Старый 11.11.2013, 23:19
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 3  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Это method chaining. find возвращает this, у которого дёргается skip, у которого дёргается limit. Так что да, с точки зрения языка – равносильна.
Ещё вполне вероятно, что запрос будет выполнен при первым обращениям к данным, что в принципе убирает разницу "что первое".
Очень жаль, ведь зачем получать все данные, потом делать смещение и лимитировать.
__________________
return this...

Старый 12.11.2013, 09:17
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 4  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
а какая это библиотека? может быть после этой строчки есть что-то типа $lib->execute()? т.е. первая формирует запрос, а вторая выполняет.

или может вы после $filter ошибочно (скорее всего) поставили скобку и выражение выглядит так:
PHP код:
$lib->find(array(), $filter->skip($offset)->limit(12)); 

Старый 12.11.2013, 17:47
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 5  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от bifidokk Посмотреть сообщение
а какая это библиотека? может быть после этой строчки есть что-то типа $lib->execute()?
Это php-mongo-driver

Цитата:
Сообщение от bifidokk Посмотреть сообщение
т.е. первая формирует запрос, а вторая выполняет.
или может вы после $filter ошибочно (скорее всего) поставили скобку и выражение выглядит так:
PHP код:
$lib->find(array(), $filter->skip($offset)->limit(12)); 
Нет, я всё верно написал. Полный код
PHP код:
private function getmongo($db='inpictures_dev') {
        
    
$m = new mongo();
    return 
$m->$db;
            

PHP код:
// получаем ссылку на базу 
$m $this->getmongo('pictures');

// определяем чанк                 
$chank 'cover_'.$data['id'];
        
$lib $m->$chank;

// список получаемых данных для выборки ( по типу SELECT `prop1`,`prop2` в SQL )
$filter = array
(    
'key' => true,
    
'title' => true,
    
'desc' => true,
    
'cid' => true,
    
'uid' => true
);

// смещение        
$skip = (isSet($data['skip'])) ? (int)$data['skip'] : 0;
            
if (!
$skip) {
    
$pics $lib->find(array(),$filter);
    
$count $pics->count();
    
$buffer $pics->skip($skip)->limit(12);
} else {
    
$buffer $lib->find(array(),$filter)->skip($skip)->limit(12);

суть во всём этом, при первом запросе получать количество записей в базе для пагинатора, потому я и хочу узнать принцип работы данного метода, стоит ли хранить количество элементов в кэше да бы постоянно не получать их каждый запрос или же это не имеет смысла так как данные выбираются все и всегда.
__________________
return this...

Старый 12.11.2013, 13:25
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
AlexCooper, я же написал
Цитата:
Ещё вполне вероятно, что запрос будет выполнен при первым обращениям к данным, что в принципе убирает разницу "что первое".
Другими словами,
Код:
$lib->find(array(),$filter)->skip($offset)->limit(12);
здесь запрос ещё не выполнен. Но он выполнится при обращении к данным или, как подметил bifidokk, при вызове execute или похожего метода.

Старый 12.11.2013, 19:22
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Затея кэшировать кол-во элементов изначально плоха.

Старый 13.11.2013, 09:11
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 8  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Если данные меняются раз в 5 минут, почему бы их не кешировать на эти 5 минут. Причем я бы тогда кешировал не только кол-во страниц, но и всю выборку.

Старый 13.11.2013, 12:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Именно. Если выборка статична - то кэш всего. Но кэшировать только кол-во страниц мне уверенности не вселяет.

Старый 13.11.2013, 15:00
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 10  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Именно. Если выборка статична - то кэш всего. Но кэшировать только кол-во страниц мне уверенности не вселяет.
Я не правильно высловилься. Скорей всего просто добавить счётчик. По типу как у меня счётчики для генерации уникальных ID для загружаемых изображений.
Название: icr.JPG
Просмотров: 205

Размер: 21.5 Кб
PHP код:
private function getPicCounter($type) {
        
    
$now $this->getmongo('pictures')->
            
abc->findAndModify
            
(    array('status' => true),     
                array(
'$inc' => array( $type => )) 
            );
        
    return 
$now[$type];
     

+
PHP код:
public function picturesBuilder($data) {
        
    
$data $this->extra($data);
        
    
$m $this->getmongo('pictures');
        
    
$pic = array
    (    
'uid' => (int)$data['uid'],
        
'cid' => (int)$data['cid'],
        
'qid' => $data['qid'],          
        
'key' => ($this->getPicCounter('pics')+1000000000),
        
'question' => $data['question'],
        
'title' => $data['title'],
        
'desc' => $data['desc'],
        
'counters' => array
        (    
'like'=>0,
            
'comment'=>0
        
),
        
'like' => array(),
        
'comment' => array(),
        
'status' => 0,
        
'premission' => 0
    
);
        
    
$chank 'category_'.$pic['cid'];
        
    
$m->$chank->insert($pic);
                
    unset(
$pic['_id']);
        
    
$this->getmongo()->users->update
     
(    array('_uid' => (int)$data['uid']),
         array(
'$set' => array( 'mindmap.'.$pic['cid'].'.cast.'.$pic['qid'] => $pic) ) ,
         array(
'upsert' => true )
     );
         
     
$counter $this->photoChecker($data['uid'],$pic['cid']);
         
     
$counter $counter['mindmap'][$pic['cid']]['counters'];
         
     
$pic['ccounter'] = $counter;
        
    return 
$pic;

в итоге у меня есть отдельная база Pictures, где фотографии каждой из категорий хранятся в отдельной коллекции, так как поиск по сути в 95% случаях происходит только по одной категории и для более быстрого доступа я делю их именно по этому полю. Сама категория состоит из вопросов, т.е. загружаемое изображение - это вариант ответа на один из вопросов в данной категории.

Название: icr2.JPG
Просмотров: 193

Размер: 24.8 Кб

И таких вопросов неопределённое количество. На своем ресурсе я предоставляю возможность как загрузить так и выбрать из уже загруженных изображений в данный вопрос. Т.е. вести глобальную систему учёта фотографий мне кажется, как уже сказали, очень и очень накладно, если учесть что могут применяться еще и дополнительные фильтры к выборке ответов на вопрос (например мои ответы, моих друзей, моего города, моего города только от девушек и т.д.) + фотографии проходят пост-модерацию ( блокировка по жалобам), т.е. естественно если фотография была заблокирована, нужно декрементировать соответствующий счётчик что в итоге создаст только проблем, и в определённый момент обращения (чтение/запись) к данной записи будет почти стримовое безостановочным и один из счётчиков не сработает.

Сейчас да я выбираю просто
PHP код:
if (!$skip) {
    
$pics $lib->find(array(),$filter);
    
$count $pics->count();
    
$buffer $pics->skip($skip)->limit(12);
} else {
    
$buffer $lib->find(array(),$filter)->skip($skip)->limit(12);

если смещения нет или равно 0, получаю дополнительно общее количество элементов, чтобы во флеше отдать данные пагинатору. Можно конечно и без пагинатора, просто кнопка перелистывания назад-вперёд, но всё же когда явно видишь количество ответов удовлетворяющих твоему запросу, это больше мотивирует поискать еще что-то, нежели непонятное количество страниц.

А то что такая конструкция
PHP код:
$buffer $lib->find(array(),$filter)->skip($skip)->limit(12); 
обрабатывается слева на право, очень прискорбно. Ведь получается что мы всегда получаем всю коллекцию, соответственно и skip, это всего лишь аналог перебора циклом значений пропустив $skip итераций, вместо того чтобы реально запрос в базу данных был уже с тем что нужно пропустить определённое количество записей или получить столько то записей.

Поповоду execute(), я так понимаю, его в основном пишут для того что бы выполнить сложные запросы с учётом всех параметров?
__________________
return this...

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:23.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.