Если я создаю экземпляр класса и задаю переменную экземпляра в модуле Ruby, используемом контроллером или моделью Rails, как долго сохраняется эта переменная экземпляра? Должна ли переменная быть явно сохранена в сеансе для сохранения между запросами?
Как Rails сравнивает в этом отношении с Java или PHP?
В Ruby on Rails это всегда зависит от области действия и где она определена.
Например, переменные объектов / экземпляров, определенные в вашей среде и файлах конфигурации, будут сохраняться всегда. Простым примером этого являются шлюзы оплаты ActiveMerchant, которые определены в файле environment.rb и присутствуют для каждого запроса.
В случае контроллеров он присутствует только для этого HTTP-запроса – объекта и переменных экземпляра.
В PHP это зависит от какой версии. Учитывая, что PHP4 был давно, я буду говорить только о 5.2 и 5.3: И да, переменные должны храниться в сеансе или каком-либо другом постоянном механизме (memcached, database, file и т. Д.) Для повторения запросов. И самой длинной собственной переменной PHP может служить длина текущего запроса (и конец которого все очищается).
В обеих версиях PHP :
Переменные экземпляра сохраняются до тех пор, пока существуют переменные, ссылающиеся на них. PHP внутренне хранит счетчик ссылок на каждый объект. Когда переменная выходит за пределы области действия, PHP уменьшает значение refcount и проверяет значение 0. Если оно равно 0, оно очищает экземпляр и уничтожает объект.
В PHP 5.0, 5.1 и 5.2:
Очистка переменных является наивной. Это означает, что если у вас есть круговая ссылка (класс A содержит экземпляр класса B и наоборот), объект никогда не будет очищен, если только одна из этих ссылок не будет выпущена.
В PHP 5.3:
PHP представил довольно интеллектуальный сборщик мусора для точной причины круговых ссылок. Его можно отключить или активировать вручную. Он запускается всякий раз, когда количество его корней заполнено или количество отказов уменьшается до ненулевого числа.
Он существует только в пределах его возможностей. Если он глобальный, он будет существовать до тех пор, пока сеанс будет выполняться. Но если он не является глобальным, он не будет существовать после того, как вы оставите область, в которой она существует.