Лучшие практики для управления памятью в сценарии PHP? - PullRequest
20 голосов
/ 22 сентября 2011

Управление памятью - это не то, о чем нужно думать большинству разработчиков PHP.Я столкнулся с проблемой, когда мой сценарий командной строки не хватает памяти.Он выполняет несколько итераций для большого массива объектов, делая несколько запросов к базе данных за одну итерацию.Я уверен, что увеличение потолка памяти может быть краткосрочным решением, но я не думаю, что это подходящее долгосрочное решение.Что я должен сделать, чтобы убедиться, что мой сценарий не использует слишком много памяти и эффективно использует память?

Ответы [ 3 ]

37 голосов
/ 22 сентября 2011

Золотое правило

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

Примеры:

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

Это не всегда самая удобная вещь в PHP (массивы не обрезают ее, и есть много кода, который толькоработает с массивами), но в последних версиях, особенно после введения генераторов 1019 *, потоковые данные легче, чем когда-либо, вместо того, чтобы разбивать их на части.

Следуя этой практике, религиозно "автоматически"Забота о других вещах для вас также:

  • Больше нет необходимости очищать ресурсы с большим объемом памяти, закрывая их и целенаправленно теряя все ссылки на них, потому что не будеттакие ресурсы для начала
  • Больше нет необходимости сбрасывать большие переменные после того, как вы поработаете с ними, потому что таких переменных также не будет

Другие действия

  • Будьте осторожны, создавая замыкания внутри циклов;это должно быть легко сделать, так как создание таких внутренних циклов является неприятным запахом кода.Вы всегда можете поднять замыкание вверх и задать ему больше параметров.
  • Ожидая значительного ввода, разработайте свою программу и выберите алгоритмы соответствующим образом.Например, вы можете объединить любое количество текстовых файлов любого размера, используя постоянный объем памяти.
2 голосов
/ 22 сентября 2011

Вы можете попробовать профилировать его, поместив несколько вызовов на memory_get_usage(), чтобы найти место, где оно достигает пика.

Конечно, зная, что на самом деле делает код, у вас будет больше информации, чтобы уменьшить использование памяти.

1 голос
/ 22 сентября 2011

Когда вы вычисляете свой большой массив объектов, старайтесь не вычислять все сразу.Пройдитесь по шагам и обработайте элементы, а затем освободите память и возьмите следующие элементы.

Это займет больше времени, но вы можете управлять объемом используемой памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...