2014-12-06 2 views
0

내 서비스를 만들 때마다 매번 객체가 생성되는 것처럼 보입니다.Symfony 2 dev 모드의 각 요청마다 컨테이너가 다시 빌드됩니까

서비스 :

services: 

    plbcache: 
    class: Robusta\PlbBundle\Cache\LruCache 
    arguments: [10, %timeout%, %enableCache%] 

클래스 : 내 캐시 개체마다 다시하면 내 개체가 캐시에있는 경우

class LruCache { 

    public function __construct($capacity=10, $timeout=-1, $enabled=true) { 
     echo "creating the cache"; // Appear at each request 
     $this->capacity = $capacity; 
     $this->timeout = $timeout; 
     $this->enabled = $enabled; 
    } 
} 

은 물론, 내가 테스트하는 지금 문제가 있습니다.

Symfony의 서비스 컨테이너는 싱글 톤이며 기본적으로 싱글 톤을 제공합니다. 프로토 타입이나 클라이언트 세션에 맞게 구성 할 수 있다고 생각했습니다. 따라서 각 요청 후에 동일한 서비스 객체를 제공해야합니다.

컨테이너가 dev 환경에서 다시 작성되었음을 문서에서 확인해야합니다. 내가 뭔가를 놓쳤습니까, 아니면 코드가 잘못 되었습니까? dev 캐시 모드에서 캐시 개체를 다시 작성하지 못하도록하려면 어떻게해야합니까?

+0

왜 세션을 사용 하시겠습니까? 모든 요청은 적어도 하나의 객체와 관련이 없으므로 때마다 객체를 다시 작성해야합니다. 비즈니스 논리가 다른 방식으로 작동하는 경우 직접 처리해야합니다. – DonCallisto

+0

Symfony의 서비스 컨테이너는 단일 개체입니다. 따라서 각 요청 후에 동일한 서비스를 제공합니다. –

답변

1

컨테이너는 요청간에 인스턴스를 공유하지 않습니다. 각 요청은 독립적이지만 세션을 통해 일부 데이터를 공유 할 수 있습니다 (예 :). BTW는 단일 요청 중에 작성된 모든 오브젝트가 완료되면 파기됩니다. 다음 모든 요청을 다시 생성해야합니다.

서비스가 기본적으로 (하지만 기본적으로 동작을 바꿀 수는 있지만) 싱글 톤과 같은 경우에는 "동일한 요청 내에서 싱글 톤"으로 간주해야합니다. 나는 이것이 symfony가 아닌 PHP의 행위임을 주목하고 싶습니다.

+0

좋아, 정적 개체는 요청 내부 정적입니다. 그래서 $ _SERVER 변수를 사용하는 것이 해결책 인 것 같습니다. –

+2

Nope. 앞서 말했듯이, 요청간에 생존을 원한다면 세션을 사용하십시오. 그럼에도 불구하고 실제 객체는 생존하지 않습니다. 각 요청에 대해 재 구축됩니다. Symfony 2 프레임 워크를 사용하고 있습니까? 그렇다면 이미 캐싱 기능이 있습니다. – Cerad

+0

Cerad 코멘트에 아무 것도 추가 할 수 없습니다. :) – DonCallisto

0

클래스를 인스턴스화 할 때마다 __construct()이 실행됩니다. 심포니 앱을 실행하고 'plbcache'클래스에 액세스 할 때마다 클래스의 인스턴스가 만들어져 __construct() 메서드가 실행됩니다. 객체는 PHP 응용 프로그램 실행 사이에 메모리에 유지되지 않습니다. 즉, 프로세스가 실행되고 매번 종료됩니다.

앱 실행 사이에 일부 데이터가 유지되도록하려면 디스크 나 데이터베이스 등에 저장할 수 있습니다. 어떤 시점에서 어떤 캐시 구축을해야 할 필요가 있다면 build()과 같은 메소드를 만들어서 필요할 때 다른 곳에서 코드를 실행시켜야합니다. 한 번만 만들어야하는 경우 생성자가 생성되었는지 확인하거나 생성하지 않은 경우 build()을 실행할 수 있습니다.

관련 문제