Использование ini set() для изменения lmit памяти для отдельных PHP-скриптов


В прошлом у меня были проблемы с памятью, вызванные отдельными сценариями на веб-сайте, использующими больше памяти, чем следует. Я решил эту проблему, снизив лимит памяти PHP с 512 МБ (требование одного скрипта на сайте) до 64 МБ и используя ini_set ("memory_limit", "512M") для отдельного скрипта, который в этом нуждался.

Вопрос в том, является ли это хорошим методом или существуют более эффективные способы решения этой проблемы. Другой метод, который у меня есть замечено добавление второго файла php.ini в каталог скрипта, но это не сработает, потому что почти все скрипты для веб-сайта находятся в одной папке.

Пожалуйста, обратите внимание, я знаю, что даже ограничение на 64 МБ памяти велико для большинства сайтов, но это требуется платформой, которую я использую.

 1
php
Author: Steve Glick, 2014-07-23

2 answers

Да, лучше иметь более низкий лимит памяти и повышать его для одного сценария, чем иметь более высокий лимит в целом. Единственным лучшим способом решения этой проблемы было бы уменьшить требования к памяти для сценария объемом 512 МБ, если это возможно.

 1
Author: Tim Fountain, 2014-07-23 23:45:48

На самом деле имеет смысл увеличить лимит непосредственно в php.ini, поскольку процессы, которые не потребляют выделенные вам в настоящее время 64 МБ, в любом случае не превысят этот лимит.

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

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

  • используйте методы отложенной загрузки (загружайте данные из кэша или базы данных только в тот момент, когда вам это нужно и получите только нужные вам данные) и оптимизируйте запросы к базе данных (не делайте SELECT * FROM table, если вам нужны только поля id и name)
  • используйте курсоры базы данных для итерации по вашему набору результатов (это особенно важно, если у вас действительно огромные объемы данных, которые никогда не поместятся в выделенную память)
  • используйте только то, что вам нужно, и не загрязняйте память избыточной или ненужной информацией
  • освободите память, используемую любыми большими массивами или объектами, которые вы используете только временно внутри различных методов и структур циклов, вызывая unset($variable);, а затем заставляете сборщик мусора запускаться сразу после вызова gc_collect_cycles();
 1
Author: Thyamarkos, 2014-07-24 01:27:15