Превышение проблем с памятью на сервере, использующем PHP

Entonces encontré la solución para el comando no encontrado Cambié los permisos del directorio desde donde Shell busca el comando (/root/.local/bin )y todos los archivos que jhbuild quiere crear desde el comando (por ejemplo /jhbuild,/jhbuild/.cache ). Los creo manualmente y cambié sus permisos de manera similar.

0
09.02.2016, 19:10
1 ответ

Ваш интерпретатор PHP настроен на завершение любого сценария, которому требуется более 132 МБ памяти. Ваш сценарий пытается выделить более 161 МБ памяти. Проблема довольно проста, как и ее решения. Вы можете либо:

  1. Заставить ваш интерпретатор PHP выделять больше. Причина, по которой ваш хост не советует этого, заключается в том, что в противном случае он выделил бы вам более 8 ГБ памяти просто потому, что ваша база данных продолжает расти.
  2. Забудьте о PHP и устаревшем mysql _ * API и используйте то, что не обеспечивает таких ограничений памяти. Помните, что даже если интерпретатор вас больше не беспокоит, ОС, вероятно, в какой-то момент это сделает.
  3. Улучшите свой сценарий.

Использование mysql_unbuffered_query соответствует решению №3. Поскольку PHP больше не буферизует набор результатов MySQL, он не занимает столько памяти, и интерпретатор перестает жаловаться. Вы в основном переключаете с буферизованных запросов на небуферизованные (см. Примеры №2 и №3, и рассмотрите возможность перехода на PDO, это 2016 год ). Если вы хотите продолжать работать с PHP и считаете, что ваш дизайн правильный, это ваше решение.

Я не хочу менять код, так как хочу, чтобы сервер считывал результаты в ОЗУ везде, где это возможно.

Люди, которые работают над СУБД, обычно делают отличную работу. Их движки оптимизированы, и запрос не займет больше времени, чем нужно. Учитывая тот факт, что вы используете PHP и старый mysql _ * API, вы не заставите меня поверить, что скорость действительно так важна здесь ... Я предполагаю: вы можете позволить себе хранить данные в базе данных, а не в оперативной памяти. Используйте небуферизованные запросы, извлекайте / обрабатывайте свои строки по одной и немного больше полагайтесь на свою СУБД (кроме того, она, вероятно, сделает за вас некоторую буферизацию ...).

Если вы все еще не уверены, возможно, лучше переосмыслить сами запросы. Вы уверены, что получаете не больше данных, чем вам нужно? (Я имею в виду, вам действительно нужен этот SELECT * в начале вашего запроса?) Вы уверены, что MySQL не может позаботиться о некоторой обработке за вас? СУБД - довольно мощные инструменты, заставьте их работать и не все делают в вашем PHP-скрипте. Типичным примером может быть вычисление среднего значения: вместо выборки всех чисел в столбце и использования цикла суммирования напрямую запросите AVG (столбец) .

Без вашего скрипта мне было бы довольно сложно дать дальнейшие советы по этой части (и ребята из Stack Overflow, вероятно, справились бы лучше). Однако, если в этот момент вы думаете, что внесли достаточно изменений в свой сценарий ... как насчет того, чтобы отправить его на Code Review ? Если вы не видите способа улучшить его еще больше, скорее всего, люди там сделают это.

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

2
29.04.2021, 00:18

Теги

Похожие вопросы