скрипту нехватает памяти

Статус
В этой теме нельзя размещать новые ответы.
парсинг в нескольких фукнциях и подфукциях,
думал что памяти внутри функции нехватает, но почему-то память не высвобождается когда функция выполняется, вроде глобальнах переменных нет... функция возвращает 0 или 1, и все, но...
будем искать глобальные переменные...
 
парсинг в нескольких фукнциях и подфукциях,
думал что памяти внутри функции нехватает, но почему-то память не высвобождается когда функция выполняется, вроде глобальнах переменных нет... функция возвращает 0 или 1, и все, но...
будем искать глобальные переменные...
Легче искать будет с каким-нить профилировщиком, например XDebug. Он показывает сколько памяти потребляет скрипт.
Ещё я советую отказаться от парсеров типа phpQuery и html_dom_parser, если конечно они используются. Память после них никак не освобождается.
Вообще нужно искать узкие места и пытаться их переписать.
 
Код:
function dummy ()
{
 global $s;
........
 $s = file_get_contents("file.txt");
........
}

Код:
function dummy ()
{
........
 return file_get_contents("file.txt");
}
$s = dummy();


Код:
function dummy(&$s)
{
............
 $s = file_get_contents("file.txt");
............
}

в приведенных выше примерах, после вызова функции память захламляется однозначно. Надо или высвобождать переменные после обработки, или снижать количество глобальных переменных участвующих в обработке внутри функции.
 
в приведенных выше примерах, после вызова функции память захламляется однозначно. Надо или высвобождать переменные после обработки, или снижать количество глобальных переменных участвующих в обработке внутри функции.
:D я могу привести ещё кучу примеров, когда память забивается. Оптимизирование памяти это не опт. скорости- тут нужно конкретно по примеру смотреть, т.к. нормальных приемов очитски памяти нет и чаще приходится менять логику самого скрипта.
 
пробуй руками к каждой переменной в конце ее использования делать сделующее
пример как можно сделать освобождение руками...
Код:
//есть функция
function myfunc() {
//в ней есть переменные
      $find=array();
      $replace=array();
      $result=null;
      $tpl=null;
// какие то операции
      foreach($this->data as $key_find=>$key_replace):
        $find[]=$key_find;
        $replace[]=$key_replace;
      endforeach;
      switch($config['mode']):
        case "block":
          $result=str_replace($find,$replace,$this->block);
          break;
        case "panel":
          $result=str_replace($find,$replace,$this->panel);
          break;
        case "module":
          $result=str_replace($find,$replace,$this->module);
          break;
        case "template":
        default:
          $result=str_replace($find,$replace,$this->template);
          break;
        endswitch;
// почистили руками за ней все удалив из нее
      $find=array();
      $replace=array();
// удалили ее
      unset($find);
      unset($replace);
    else:
      $result=$this->template;
    endif;
    $tpl=isset($config['name']) ? $config['name'] : "template";
    isset($this->result[$tpl]) ? $this->result[$tpl].=$result : $this->result[$tpl]=$result;
    $tpl=null;
    $result=null;
    unset($tpl);
    unset($result);
  }
по идее когда функция заверщает работу использованные переменные вней уничтожаются, но я не рас натыкался на переполение ) когда я делал городской портал на бесплатном городском хостинге там давалось 16 оперативы на приложение и приходилось извращатся сильно особенно переписывать форум...

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

то есть сначала занулить перменную, а потом unset?
 
Попробуй php файле прописать

ini_set('memory_limit', '16000M');

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

так что потом я просто делал ее обнуление путем присвоения null или array() в зависимости от типа. и потом делал unset, если перпеменная глобальная то ее нужно сначала с глобального массива убить а потом уже с локального.

ini_set('memory_limit', '16000M');
у хостера такая штука не пройдет )а денвер это тестовый полигон )
 
:D я могу привести ещё кучу примеров, когда память забивается. Оптимизирование памяти это не опт. скорости- тут нужно конкретно по примеру смотреть, т.к. нормальных приемов очитски памяти нет

лучший способ очистки памяти - это не захламлять ее, если что. и речь в топике не про скорость шла а именно про то как управлять памятью.

и чаще приходится менять логику самого скрипта

я вообще то про это и писал, к чему может привести неправильная логика при написании функций.
 
Возможно и не поможет, но давно был прицендент. В одном парсере, для обработки файла использовал require|include файла (в котором описывалась логика обработки) вместо вызова с помощью функции, так дома все было пучком, а на сервере сжиралась память очень быстро. Оказалось, что дома после завершения работы подключаемого файла память очищалась, а на сервера нет и при каждом новом вызове занимала новую область памяти.

Если есть такие моменты в коде, то проверьте значение занимаемой памяти
memory_get_usage() - сколько щаз съедено и memory_get_peak_usage() - какое было пиковое значение.

P.S. сразу уточню, что это был не require|include без _once.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху