Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Подробнее здесь: fooobar.com/questions/289341/...

Ответ 3

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

Возможно. Но почему бы вам возиться с вашей архитектурой ООП?

Это имеет значение?

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

Ответ 4

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

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

Прочитайте Статическое ключевое слово, чтобы лучше понять это.

Ответ 6

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

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

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

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

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

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

Ответ 7

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