Управление памятью PHP

У меня есть несколько трудоемких и (потенциально) интенсивно использующих память функций в моем веб-приложении ЛАМПЫ. Большинство этих функций будет выполняться каждую минуту через крон (в некоторых случаях, задание крона выполнит несколько экземпляров этих функций).

Так как память конечна, я не хочу сталкиваться с проблемами, где я пытаюсь выполнить функцию, среда больше не может обрабатывать. Что такое хороший подход при контакте с потенциальными проблемами памяти?

Я предполагаю, что должен определить, сколько памяти доступно мне, какого количества памяти каждая функция требует прежде, чем выполнить ее, определите то, что другие функции выполняются кроном И их использованием памяти и т.д.

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

7
задан StackOverflowNewbie 26 July 2010 в 13:33
поделиться

5 ответов

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

я мог бы придумать пример кеширования: вы могли бы кэшировать электронные письма, а не получать их снова и снова с почтового сервера. базовое кэширование оперативной памяти - очень полезный метод, если в вашем скрипте есть вещи, которые вы хотите сохранить для следующего выполнения скрипта, но если ваш скрипт делает уникальные вещи каждый раз, когда он выполняется, это было бы бесполезно. также, что касается contoll, вы можете вызывать memory_get_usage () при каждом выполнении скрипта и записывать это значение в кеш apc, чтобы каждый cron мог получить это значение и посмотреть, достаточно ли памяти для его завершения.

Что касается среднего использования, вы можете написать массив с последним, скажем, 100 выполнений функции, и когда вы снова вызовете эту функцию, он может apc_fetch, который из плунжера, и вычислить среднее использование памяти для этой функции, а затем сравнить его с количеством плунжера используется прямо сейчас, а затем решите, где начать.кроме того, он может записать эту оценку в текущую переменную использования памяти, чтобы предотвратить запуск других сценариев. в конце этой функции вы снова вычитаете эту сумму из переменной. tl; dr: изучите функции apc_fetch, apc_store и memory_get_usage

1
ответ дан 7 December 2019 в 20:32
поделиться

Частично ваша проблема может заключаться в том, что вы выполняете cron каждую минуту? Почему бы не установить несколько флагов, чтобы запускался только один экземпляр этого cron, прежде чем другой выполнит полную логику? т.е. создать плоский файл, который удаляется в конце cron, чтобы действовать как «блокировка». Это гарантирует, что один процесс cron будет полностью завершен, прежде чем другие продолжат работу. Однако я настоятельно прошу вас сослаться на мой комментарий к вашему сообщению, чтобы я и другие могли дать вам более веский совет.

0
ответ дан 7 December 2019 в 20:32
поделиться

Попробуйте оптимизировать свои алгоритмы. Например ...

  • Как только вы закончите работу с переменной, вы должны уничтожить ее, если она вам больше не нужна.
  • Закройте соединения MySQL после того, как закончите с ними.
  • Используйте рекурсию.

Также, как сказал Яузика, измените лимит памяти в php.ini, но не делайте его слишком большим. Если вам нужно более 256 МБ ОЗУ, я бы предложил перейти на другой язык вместо PHP.

0
ответ дан 7 December 2019 в 20:32
поделиться

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

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

0
ответ дан 7 December 2019 в 20:32
поделиться

На вашем месте я бы подумал о написании демона вместо того, чтобы полагаться на cron. Демон может следить за очередью и знать о количестве дочерних процессов, запущенных в нем. Управление несколькими процессами определенно не самая сильная сторона php, но вы можете это сделать. Pear даже включает пакет System_Daemon.

Ваш демон может использовать memory_get_usage и вызывать free, uptime, и друзей, чтобы дросселировать количество рабочих в соответствии с условиями системы.

У меня нет прямого опыта в этом, и я не слишком удивлюсь, если демон, написанный на PHP, будет постепенно терять память. Но если он работает приемлемо медленно, cron может циклически запускать демона время от времени...

0
ответ дан 7 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

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