Использует ли использование статических методов и свойств в PHP меньше памяти?

Я работаю над веб-приложением, которое видит десятки одновременных пользователей в секунду. У меня есть класс, который будет создан много раз в одной и той же загрузке страницы. В этом классе у меня есть некоторые свойства, которые всегда будут одинаковыми для каждого объекта, поэтому я думаю объявить эти свойства как static в попытке уменьшить память, которая будет использоваться, когда несколько экземпляров этого класса создаются во время одного запроса страницы.

будет делать это использовать меньше памяти для этого приложения, потому что PHP может хранить значение статических свойств только один раз? Будет ли это экономить память между параллельными пользователями или только в каждом процессе PHP?

Как это работает для методов? Если это означает, что объекты могут повторно использовать одни и те же методы, то почему бы не объявить все методы класса статическими, если вы пытаетесь сохранить в памяти?

Я не чувствую себя полностью комфортно с того, почему и когда можно было бы объявить свойство или метод статические, но я понимаю, что объявление их статическими позволяет получить к ним доступ без создания экземпляра объекта класса ( это похоже на взлом ... эти методы и свойства должны быть где-то еще ... нет? ). Меня особенно интересует способ a static объявление влияет на использование памяти в попытке сохранить использование памяти как можно ниже на моем веб-сервере ... и вообще, так что я лучше понимаю, что происходит.

7 ответов


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

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


посмотрите статические тесты vs singleton: http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/

примечание: по некоторым причинам stackoverflow не показывал multilne тему, поэтому я добавляю изображение.

Number of runs  Singleton call time (s)     Static call time (s)
100             0.004005                    0.001511
1,000           0.018872                    0.014552
10,000          0.174744                    0.141820
100,000         1.643465                    1.431564
200,000         3.277334                    2.812432
300,000         5.079388                    4.419048
500,000         8.086555                    6.841494
1,000,000       16.189018                   13.696728

оформить заказ подробнее здесь:https://stackoverflow.com/a/3419411/260080


использует ли использование статических методов и свойств в PHP меньше памяти?

наверное. Но зачем вам возиться со своей архитектурой ООП?

имеет ли это значение?

наверное, нет. Что занимает память, так это сам PHP. Я твердо думаю, что удаление нескольких байтов, потому что вы используете статические методы, не будет иметь значения. Вместо этого не загружайте бесполезные модули. Ex если вы не используете GD, не загружайте его. Активировать кэширование, чтобы уменьшить количество раз PHP называется.


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

Если класс, который вы объявляете, не имеет свойств, которые должны быть уникальными для каждого экземпляра объекта, вы можете объявить каждый метод и свойство как статические. Однако, если у вас есть свойства, которые должны быть привязаны к каждому объекту, то статические методы не помогают. Причина в том, что внутри статических методов нет ссылки на $this Так нельзя свойства объекта ссылки из статических методов.

читать на Ключевое Слово Static для лучшего понимания этого.


В общем, да. Статические методы и свойства используют меньше памяти. Однако разница очень мала.

чем интереснее, тем разница в производительности между статическими и нестатическими методами.


Я не эксперт в управлении памятью PHP, но я бы сказал, что вы не экономите много. Если и сколько вы сэкономите, зависит от некоторых аспектов:

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

особенно важно количество объектов. Если у вас есть только один экземпляр, вы экономите 50%. В этом случае:

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

Case B-Instances: дополнительно к случаю A у вас также есть экземпляр этого объекта для каждого запроса, таким образом, удвоить использование памяти для этой части программного обеспечения.

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


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