кэширование данных

хм, неплохая идея насчет многоуровнего кеширования.
да насчет стандартных функций не спорю, сталкивался на практике с подобным.

все ниче, но вот эти супер тяжелые массивы и объекты все портят(
 
моя тема где я почти, сам с собой общался
Для просмотра ссылки Войди или Зарегистрируйся
про какие супер массивы идет речь?
пример в студию
 
Ну в общем-то да.

посмотрел ваш топик, довольно интересные сравнения =)

углубляться не буду, но к примеру возьму всем известный WordPress
объекты и массив локализации
это так для показа, пример)
PHP:
Object
(
    [_nplurals] => 3
    [entries] => Array
        (
            [% Comments »] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => % Comments »
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => Комментарии (%) »
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [% Responses] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => % Responses
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => Комментарии (%)
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [%1$s - Comments on %2$s] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => %1$s - Comments on %2$s
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => %1$s — Комментарии на %2$s
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [%1$s and %2$s.] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => %1$s and %2$s.
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => %1$s и %2$s.
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [%1$s is proudly powered by %2$s] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => %1$s is proudly powered by %2$s
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => %1$s работает на %2$s
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [%d queries. %s seconds.] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => %d queries. %s seconds.
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => %1$d запросов. %2$s секунд.
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [« Older Entries] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => « Older Entries
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => « Раньше
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [(required)] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => (required)
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => (обязательно)
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [1 Comment »] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => 1 Comment »
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => 1 комментарий »
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
            [<abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.] => Translation_Entry Object
                (
                    [is_plural] => 
                    [context] => 
                    [singular] => <abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.
                    [plural] => 
                    [translations] => Array
                        (
                            [0] => <abbr title="Really Simple Syndication">RSS</abbr> лента комментариев этой записи.
                        )
                    [translator_comments] => 
                    [extracted_comments] => 
                    [references] => Array
                        (
                        )
                    [flags] => Array
                        (
                        )
                )
 
если это не могает
оптимизация, профилирование проекта, оптимизация запросов, php кода
я вот знаю что половина строковых оперций лучше переписать на свой лад тк в пыхе оно криво реализовано те очень долго выполняется. например substr на 6к итерацих очен долгий размер слова у него 9 сиволов выполние 600мс 0,6сек - долго...
дефолтные функции написаны на Си, переписать их на чем ты имеешь ввиду?
 
нет, сами стандартные ф-ции не затрагиваются, пиишутся аналоги на php
к примеру, что быстрее выполнится?
PHP:
//Способ №1. 
$array[] = $i;
//Способ №2
array_push($array, $i);

конечно первый вариант)
 
дефолтные функции написаны на Си, переписать их на чем ты имеешь ввиду?
нет зачем, можно оптимизировать, я вот делаю ревизию кода не просто так, отладчиков нахожу затык, и переписываю его так что бы он работал быстрее.
пример у меня тут Для просмотра ссылки Войди или Зарегистрируйся

в функции даты используется substr
при 1100 итерациях он выполнялся 600мс - долго...
у меня конечно не выводится 1100 новостей, но все же...

PHP:
  function split($str) {
    return preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
  }

function dateformat($date=NOW, $format=DATEFORMAT, $offset=OFFSET) {
    global $engine;
    //return $date;
    $this->parsedate($date, $offset);
    $result = null;
    $match = null;
    $format = $engine->string->split($format);
    foreach ($format as $value):
      $match = null;
      switch ($value):
        case "d": // d День месяца, 2 цифры с ведущими нулями от 01 до 31
          $match = str_pad($date["D"], 2, "0", STR_PAD_LEFT);
          break;
        case "j": // j День месяца без ведущих нулей От 1 до 31
          $match = intval($date["D"]);
          break;
        case "m": // m Порядковый номер месяца с ведущими нулями От 01 до 12
          $match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
          break;
        case "n": // n Порядковый номер месяца без ведущих нулей От 1 до 12
          $match = intval($date["M"]);
          break;
        case "F": // F Полное наименование месяца, например January или March от January до December
          $match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
          if (intval($date["M"]) > 0):
            isset($this->language['fullmonths']) ? null : $this->language['fullmonths'] = array_values($engine->language->get('DATE', 'MONTH', 'FULL'));
            $match = $this->language['fullmonths'][intval($date["M"]) - 1];
          endif;
          break;
        case "M": // M Сокращенное наименование месяца, 3 символа От Jan до Dec
          $match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
          if (intval($date["M"]) > 0):
            isset($this->language['shortmonths']) ? null : $this->language['shortmonths'] = array_values($engine->language->get('DATE', 'MONTH', 'SHORT'));
            $match = $this->language['shortmonths'][intval($date["M"]) - 1];
          endif;
          break;
        case "Y": // Y Порядковый номер года, 4 цифры Примеры: 1999, 2003
          $match = str_pad($date["Y"], 4, "0", STR_PAD_LEFT);
          break;
        case "y": // y Номер года, 2 цифры Примеры: 99, 03
          $match = $engine->string->substring($date["Y"], 2);
          break;
        case "H": // H Часы в 24-часовом формате с ведущими нулями От 00 до 23
          $match = str_pad($date["H"], 2, "0", STR_PAD_LEFT);
          break;
        case "h": // h Часы в 12-часовом формате с ведущими нулями От 01 до 12
          $match = str_pad($date["H"], 2, "0", STR_PAD_LEFT);
          if ($match > 12)
            $match = $match - 12;
          break;
        case "G": // G Часы в 24-часовом формате без ведущих нулей От 0 до 23
          $match = intval($date["H"]);
          break;
        case "g": // g Часы в 12-часовом формате без ведущих нулей От 1 до 12
          $match = intval($date["H"]);
          if ($match > 12):
            $match = $match - 12;
          endif;
          break;
        case "i": // i Минуты с ведущими нулями 00 to 59
          $match = str_pad($date["I"], 2, "0", STR_PAD_LEFT);
          break;
        case "s": // s Секунды с ведущими нулями От 00 до 59
          $match = str_pad($date["S"], 2, "0", STR_PAD_LEFT);
          break;
        case "w": // w Порядковый номер дня недели От 0 (Sunday) до 6 (Saturday)
          $match = date("w", $this->timestamp($date));
          break;
        case "l": // l (строчная 'L') Полное наименование дня недели От Sunday до Saturday
          $match = date("w", $this->timestamp($date));
          if (intval($match) >= 0):
            isset($this->language['fullweekdays']) ? null : $this->language['fullweekdays'] = array_values($engine->language->get('DATE', 'DAY', 'FULL'));
            $match = $this->language['fullweekdays'][intval($match)];
          endif;
          break;
        case "D": // D Сокращенное наименование дня недели, 3 символа от Mon до Sun
          $match = date("w", $this->timestamp($date));
          if (intval($match) >= 0):
            isset($this->language['shortweekdays']) ? null : $this->language['fullweekdays'] = array_values($engine->language->get('DATE', 'DAY', 'SHORT'));
            $match = $this->language['shortweekdays'][intval($match)];
          endif;
          break;
        case "a": // a Ante meridiem или Post meridiem в нижнем регистре am или pm
        case "A": // A Ante meridiem или Post meridiem в верхнем регистре AM или PM
          $match = intval($date["H"]);
          if ($match > 12):
            $match = ($match - 12) . " PM";
          else: $match .= " AM";
            if ($value === "a"):
              $match = $engine->string->lower($match);
            endif;
          endif;
          break;
        case "U": // U Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT)
          $match = $this->timestamp($date);
          break;
        default: $match = $value;
          break;
      endswitch;
      $result .= $match;
    endforeach;
    unset($match);
    $date = $result;
    unset($result);
    return $date;
  }
длина строки 9 символов
метод spit+foreach быстрее чем for+substr
быстрее почти в 2,5 раза.

далее загрузка шаблонов у меня была сложная, теперь @file_get_contents($path)) а ранее было сложнее и через буффер)

у меня массивы не меньше этого
так же я использую аналогичный паттерн типа реестра


если супер массивы такие то это мелочи, у меня они крупнее в разы 1 из низ состоит из 6к записей... это полный кеш таблицы тестировал что быстрее запрос в базу или из кеша... конечно кэш быстрее, тк нет лишних телодвижений, но есть проблемы вида

у меня есть поля я их убрал от пользователей, но там считаются показы клики, скачивания и тп)
тк если их выводить било сводный кеш делать либо обновлять кеш чаше... что не хорошо)
 
ну я щас у себя смотрю иногда есть хорошие пики, фаил кеша весит 970кб
распаковывается в 4 мега, неясно...
так же случайно в классе кеширования хранил данные, те загружал фаил и распаковывал и не удалял это лишний 1м-рамы
мм а может кто знает как выполнить функцию в классе после выполнения result
мне нужно запустить очистку... тк пхпе не умеет работать с памятью, то приходится за него это делать.
UPD
нашел утечки, точнее где хранились дубликаты...
пример
у меня есть вот такая функция
PHP:
 /**
   * Возвращение результата в виде массива
   * @param  MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
   * @return  mixed результат
   */
  function result($type=MYSQL_ASSOC) {
    global $engine, $mem;
    if ($this->cached && $this->load):
      /*
        $rec = null;
        @list(, $rec) = @each($this->cache);
        return $rec;
        // */
      return array_shift($this->cache);
    else:
      return mysqli_fetch_array($this->id, $type);
    endif;
  }

при использовании кода ниже, идет перерасход на размер вынимаемых данных+размещение их в памяти, и каждый раз это новая область, это плохо очень плохо...

у меня в итоге данные распаковались чуть ли не в 2 раза больше чем надо.
PHP:
       $rec = null;
        @list(, $rec) = @each($this->cache);
        return $rec;
по идее $rec должно было авто очищаться но этого не происходит

вывод переписал механизм теперь так
PHP:
return array_shift($this->cache);
смысл этого кода в чем, он вынимает первый элемент массива и при этом удаляет его из массива, тем самым освобождает память,
на первый раз он расходует еще порцию для размещение данных, на 2,3 и тп уменьшается...

в окончанию память освобождается полностью, за исключением структуры, которую нельзя выгрузить
 
Назад
Сверху