Рекомендации по управлению памятью в PHP скрипт?

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

Ответы

Ответ 1

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

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

Примеры:

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

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

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

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

Другие вещи, чтобы сделать

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

Ответ 2

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

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

Ответ 3

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

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