Управление памятью - это не то, о чем нужно думать большинству разработчиков PHP. Я столкнулся с проблемой, когда в моей командной строке script заканчивается память. Он выполняет множество итераций по большому массиву объектов, делая несколько запросов к базе данных на итерацию. Я уверен, что увеличение потолка памяти может быть краткосрочным решением, но я не думаю, что это подходящее долгосрочное решение. Что я должен делать, чтобы убедиться, что мой script не использует слишком много памяти и эффективно использует память?
Рекомендации по управлению памятью в PHP скрипт?
Ответ 1
Золотое правило
Первое, что нужно сделать, когда вы сталкиваетесь (или ожидаете столкнуться) с давлением памяти: не читает массивные объемы данных в памяти сразу, если вы собираетесь последовательно их обрабатывать.
Примеры:
- Не извлекайте большой массив результатов в память как массив; вместо этого выберете каждую строку по очереди и обработайте ее перед тем, как выбрать следующий
- Не читайте большие текстовые файлы в памяти (например,
file
); вместо этого читайте по одной строке за раз
Это не всегда самая удобная вещь в PHP (массивы не сокращают ее, и есть много кода, который работает только на массивах), но в последних версиях и особенно после введения generators проще, чем когда-либо, передавать ваши данные, а не разбивать их.
После этой практики религиозно "автоматически" позаботится о других вещах для вас:
- Больше нет необходимости очищать ресурсы с большим объемом памяти, закрывая их и теряя при этом все ссылки на них, потому что таких ресурсов не будет, начиная с
- Теперь вам больше не нужно удалять большие переменные после того, как вы с ними поработали, потому что таких переменных не будет.
Другие вещи, чтобы сделать
- Будьте осторожны при создании замыканий внутри петель; это должно быть легко сделать, поскольку создание таких внутренних петель - плохой запах кода. Вы всегда можете поднять закрытие вверх и дать ему больше параметров.
- Когда вы ожидаете массивного ввода, соответствующим образом создавайте свою программу и выбирайте алгоритмы. Например, вы можете объединять любое количество текстовых файлов любого размера, используя постоянный объем памяти.
Ответ 2
При вычислении большого массива объектов старайтесь не вычислять все сразу. Пройдите в шагах и обработайте элементы, когда вы ходите, затем освободите память и возьмите следующие элементы.
Это займет больше времени, но вы можете управлять объемом используемой памяти.
Ответ 3
Вы можете попробовать профилировать его, называя некоторые вызовы memory_get_usage()
, чтобы искать место, где он достигает максимума.
Конечно, зная, что действительно делает код, у вас будет больше информации, чтобы уменьшить использование памяти.