Работа с памятью

Статус
В этой теме нельзя размещать новые ответы.

saen

Постоялец
Регистрация
6 Авг 2006
Сообщения
756
Реакции
129
saen
да уверен, сборщик не работает, как нужно смотрю, как встроенными функциями, так и отладчиком.
специально, переписывал тяжелые функции что бы без свойств (хранилища в объекте) работать.
структура
Код:
Engine (корень он же реестр, нет хранилища, только текущая конфигурация)
Engine->cache (воздействие с file, string, хранилище свое)
Engine->control (воздействие metadata)
Engine->curl
Engine->date (воздействие с string)
Engine->db 
Engine->debug
Engine->document (воздействие с string, metadata и внутренними классами, хранилище свое)
Engine->document->Title
Engine->document->key
Engine->document->desc
Engine->element
Engine->encryption
Engine->file
Engine->gzip
Engine->hall (воздействие с user, хранилище свое)
Engine->language (воздействие с file, хранилище свое)
Engine->metadata (воздействие с file, cache, хранилище свое)
Engine->module (воздействие с file, хранилище свое)
Engine->string
Engine->template (воздействие с file, string, cache, хранилище свое)
Engine->user
Engine->variable (воздействие с file, metadata)
центрального хранилища нет, у каждого класса оно свое.
у меня проблема в том что на малых объемах данных, невидно расхода оперативной памяти, те когда идет выборка 10-500 записей,
но при больше видно.
в некоторых классах есть углубления, до 3-4 уровня, но это специфические модули.
наглядный пример утечки
было
PHP:
function result($type=MYSQL_ASSOC) { 
    global $engine, $mem; 
    if ($this->cached && $this->load): 
       $rec = null; 
        @list(, $rec) = @each($this->cache); 
        return $rec; 
    else: 
      return mysqli_fetch_array($this->id, $type); 
    endif; 
  }
тут память постоянно росла
стало
PHP:
function result($type=MYSQL_ASSOC) { 
    global $engine, $mem; 
    if ($this->cached && $this->load): 
      return array_shift($this->cache); 
    else: 
      return mysqli_fetch_array($this->id, $type); 
    endif; 
  }
тут уменьшается, а подобные алгоритмы используются во многих CMS
Ты не пробовал после выборки делать mysqli_free_result или mysqli_stmt_free_result?
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
saen
конечно, тот пример приведен не для sql, а для того как работает кеширование. после запроса вызывается free()

PHP:
 /**
   * Enter description here...
   */
  function free() {
    global $engine;
    if ($this->cached && $this->load):
      $this->cache = null;
    else:
      while (mysqli_more_results($this->connected)):
        if (mysqli_next_result($this->connected)) :
          $this->id = mysqli_use_result($this->connected);
          @mysqli_free_result($this->id);
        endif;
      endwhile;
      $this->id = null;
    endif;
  }
 

saen

Постоялец
Регистрация
6 Авг 2006
Сообщения
756
Реакции
129
Для работы с большими объемами данных(внешними источниками данных) в MVC используются модели, а в объекте держать большие данные неправильно.
В твоем примере вообще не понятно что у тебя кэшируется и как, да и комментарии к коду хоть бы писал. Принудительное подавление сообщений об ошибках тебе зачем? Короче трудно работать с тобой, сам разбирайся дальше.
 

Miraage

Angular/Laravel
Регистрация
3 Июн 2008
Сообщения
231
Реакции
51
гхм.

__get() - обращение к несуществующему свойству
__set() - установление к несуществующего свойства
__call() - вызов несуществующего метода

а вот в какой галактике у вас __get() получает несуществующий метод - не знаю :)

по теме: ngnix / (eaccel/apc/memcache/.. ) установлены?
я писал личный кабинет для сервера WoW, так там побольше, чем 8к записей было, и все хорошо летало..

хостинг хороший?
 

saen

Постоялец
Регистрация
6 Авг 2006
Сообщения
756
Реакции
129
гхм.

__get() - обращение к несуществующему свойству
__set() - установление к несуществующего свойства
__call() - вызов несуществующего метода

а вот в какой галактике у вас __get() получает несуществующий метод - не знаю :)

по теме: ngnix / (eaccel/apc/memcache/.. ) установлены?
я писал личный кабинет для сервера WoW, так там побольше, чем 8к записей было, и все хорошо летало..

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

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
у меня все пракрасно работает и держит нагрузки я готовлюсь в расширению... а занчит наплыву, там уже и сервак придется покупать.

Miraage ты хоть осттановится можешь а не постить каждые 3 минуты новый пост. НАБОР постов как бы не в почете!
и по теме

__get() - срабатывает при обращении, чтении, вызове к несуществющему методу или свойству!
__set() - тоже самое только для записи, установки и тп
__call() - обработка вызова не существющего метода.

хостинг средне статистический, нагрузка на него более 500 уников в сутки, жалоб нет. все в шоколаде, когда тему открывал был на гране лимита. теперь запас еще 20% при том что тогда было около 100-130 уников.
но уже думаю о переезде на vds ) думаю fistvds или vds64
обновы выролси тк клиентов больше стали теперь не 2-3 мега а 10-15 мег., реклама начала работать.
оптимизация была незря. добился прироста до 40%

saen, я как бы все понимаю, просто интересуюсь, можно ли как то иначе сделать.
с памятью кое что нужно и можно делать а кое что не выйдет ввиду ограничений.
руби сидел, хорошо но) вернулся те мало кто его юзает)

8к записей за 1 раз обрабатывали?
у меня выборки по 600к каждые 15 секунда дальше то что? тут не тема мерится пиписьками.
офтоп.
я как бы знаю о нагрузка побольше на мне несколько баз объемом более 90гб + в день в базу прибывает от 4 до 6гб данных от трекеров. их обрабатываю переписываю за быдло кодерами sql процедуры. а то понапишут у меня были перлы где в запроса 2 каута считалось, потешно за этом запроса нагрузка на класетр выростала по экпоненте. переписал все устаканилось.
 

saen

Постоялец
Регистрация
6 Авг 2006
Сообщения
756
Реакции
129
__get() - срабатывает при обращении, чтении, вызове к несуществющему методу или свойству!
__set() - тоже самое только для записи, установки и тп
__call() - обработка вызова не существющего метода.
И тут ты не прав. Информация с официального источника:
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.
Да и вообще, даже само обращение к методу и свойству в PHP различается.
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
цели использования методов общирные от создания реестра, хранилища, либо слежением за обращениями и тп.
вот пример как у меня

PHP:
/**
 * 
 * @global*mixed*$engine
 * @name*$engine
 */
class Engine {

  var $version = 0.01;
  var $compatibility = '5.1.0';
  var $config = array();

  public function __construct() {
    $this->config['cache']['sql'] = true;
    $this->config['logging']['sql'] = true;
    $this->config['timer']['sql'] = false;
  }

  /**
   * Получение экземпляра объекта
   * @return Engine $name
   */
  private function __get($name) {
    $this->extend($name);
    return $this->$name;
  }

  /**
   * Загрузка экземпляра объекта
   * @return
   */
  private function extend($object=null) {
   require_once(CLASSES_DIR . $object . ".php") : null;
    if (require_once(CLASSES_DIR . $object . ".php"))
      null;
    switch ($object):
      case "bbcode": $this->bbcode = new BBCode();
        break;
      case "blowfish": $this->blowfish = new Blowfish();
        break;
      case "cache": $this->cache = new Cache();
        break;
      case "constant": $this->constant = new Constant();
        break;
      case "control": $this->control = new Control();
        break;
      case "curl": $this->curl = new cURL();
        break;
      case "date": $this->date = new DateStamp();
        break;
      case "db": $this->db = new DB();
        break;
      case "debug": $this->debug = new Debug();
        break;
      case "document": $this->document = new Document();
        break;
      case "element": $this->element = new Element();
        break;
      case "email": $this->email = new Email();
        break;
      case "encryption": $this->encryption = new Encryption();
        break;
      case "file": $this->file = new File();
        break;
      case "gzip": $this->gzip = new GZip();
        break;
      case "hall": $this->hall = new Hall();
        break;
      case "htc": $this->htc = new HTC();
        break;
      case "image": $this->image = new Image();
        break;
      case "language": $this->language = new Language();
        break;
      case "metadata": $this->metadata = new Metadata();
        break;
      case "module": $this->module = new Module();
        break;
      case "pathway": $this->pathway = new PathWay();
        break;
      case "rss": $this->rss = new RSS;
        break;
      case "seo": $this->seo = new SEO();
        break;
      case "sitemap": $this->sitemap = new SiteMap();
        break;
      case "string": $this->string = new String();
        break;
      case "template": $this->template = new Template();
        break;
      case "user": $this->user = new User();
        break;
      case "upload": $this->upload = new Upload();
        break;
      case "variable": $this->variable = new Variable();
        break;
      case "xml": $this->xml = new XML();
        break;
      case "zip": $this->zip = new ZIP();
        break;
      //EXT
      default:
        return null;
        break;
    endswitch;
    //endif;
    // */
  }
**
}

когда из вне идет обращение например к string
то выглядит это так
$engine->string->metod (propery)
и если этот объект, свойство не создано то я динамически добавляю его.
и потом отдаю. при повторном обращении к

$engine->string->metod2,3,4..10 __get вызван не будет.
это простейший пример динамической, однократной загрузки классов.

перевод
__set () запускается при записи данных в недоступные свойства.
__get () используется для чтения данных из недоступных свойствами.

Добавлено через 3 минуты
покажи пример обращения к свойству недоступному... и к объекту недомтупному...
 

saen

Постоялец
Регистрация
6 Авг 2006
Сообщения
756
Реакции
129
объект внутри объекта является его свойством, читай матчасть. Холиварить с тобой бесполезно, т.к. ты не знаешь даже основ ООП.
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
объект внутри объекта является его свойством, согласен да но

__call();. Этот метод вызывается в том случае (если он определен вами), когда вы пытаетесь обратиться к несуществующему в классе методу или свойству. По сути его можно использовать и для перегрузки функций.

__get(); __set(); могут использоваться для «отлова» всех попыток обращений к несуществующим методам или свойствам.

Вызовы методов могут быть перегружены с использованием методов __call, __get и __set. Эти методы будут срабатывать только в том случае, если объект или наследуемый объект не содержат метода, к которому осуществляется доступ.
добавлю от себя он даже может существовать но может быть закрыт, тк protect, private;

если я чего то не знаю буду рад узнать, а так слышать что ты ничего не понимаешь тем более голословно... покажи тогда что такое ООП
у меня как бы модель и не MVC у меня MVP... думаю это часть изменит тк как MVC кое что делается мне не нравится. я делаю иначе.

если есть что сказать, в плане моих незнаний пожалуйста, буду только рад. получить новые знания. а говорить что я чего не умею может каждый при том не сможет и объяснить чего я не умею, возможно я немного не так выражаю свои мысли. тк донести мысль до каждого процесс сложный.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху