2010-11-23 4 views
15

저는 웹 프로그래밍에 익숙하지 않습니다. 주로 자바를 사용하여 과거에 데스크톱 응용 프로그램을 만들었습니다.PHP에서 객체 지속성

나는 PHP로 영구 객체를 만드는 방법을 알아 내려고하고있다. 어쩌면 persistent가 올바른 단어가 아니기 때문에 세션 변수에서 일련 화하여 얻을 수있는 것처럼 개체가 각 클라이언트에 고유하지 않기를 바랍니다. 개체를 서버에 만들고 해당 개체에 항상 액세스 할 수있게하려고합니다. 개체는 데이터베이스를 쿼리하고 일부 데이터를 저장합니다. 이렇게하면 각 페이지가로드되고 PHP 코드는 매번 데이터베이스에 쿼리하지 않고 동일한 영구 객체에서 해당 데이터를 가져옵니다.

저는 처음에 객체 생성에 싱글 톤 패턴을 사용하고 있습니다. 왜냐하면 저의 처음 이해는 내가 원하는 것을 성취 할 수있게 해주기 위해서였습니다. 객체의 일부는 배열이며, 배열에 값을 추가하는 PHP 페이지를 실행하고 같은 페이지에서 해당 값에 액세스하면 해당 값이 적용됩니다. 그러나 배열에 값을 추가 한 다음 값에 액세스하는 다른 페이지를로드하면 배열이 다시 비어 있습니다.

이것이 가능합니까? 데이터베이스를 너무 많이 쿼리하는 것이 좋지 않다고 생각하면 과민 반응을합니까? 때로는 20 초에 한 번씩 데이터를 요청하는 사용자가 20 명이나됩니다. 매번 db를 쿼리하는 것은 어리석은 일입니다.

감사

+2

초당 사용자 요청이 많지 않습니다. – Ben

+0

페이지 당 20 개가 넘는 쿼리를 사용하는 사용자가 많지 않습니다. 여기 핵심 포인트가 아닙니다. 주요 문제는 데이터 구조가 변경 될 때 데이터베이스를 유지 관리하는 것입니다. – Tarion

답변

9

일반적으로 데이터베이스를 사용하여 지속성을 얻습니다. 이것이 병목 현상이라면 데이터 캐싱을 시작합니다 (예 : memcached). 또는 웹 서버에 serialized 어레이가있는 로컬 파일 일 수 있습니다.

+2

간단한 쿼리의 경우 동일한 데이터에 대해 데이터베이스에 반복적으로 쿼리하는 것이 더 빠릅니다. o 개체를 캐시합니까? 쿼리 자체에 0.1 초가 걸린다고 가정 해 보겠습니다. 일반적으로 더 빠른 파일 + 직렬화 된 객체 또는 데이터베이스 + 객체 채우기가 무엇입니까? –

+0

실제 문제가 발생할 때까지는 성능에 신경 쓰지 않아야합니다. – Tarion

+5

항상 성능에 신경 써야합니다. 바로 바로 올바른 학습을 할애 할 수 있습니다. 나는 PHP로 만들어졌고 성능 문제가있는 다른 사람이 만든 프로젝트를 조정해야했습니다. 해결하는데 오랜 시간이 걸렸습니다. 그는 당장 바로 그 일을했을 것입니다. –

13

자바처럼 PHP는 지속성의 개념이 없습니다 : Java 응용 프로그램은 HTTP 요청 사이의 메모리에 유지하기 위해 JVM이 있습니다; 웹 서버는 새로운 HTTP 요청이 제공 될 때마다 새로운 PHP 프로세스를 포크하므로 객체의 정적 변수는 요청간에 데이터를 유지하지 않습니다.

영구적 인 데이터를 저장하기 위해 데이터베이스를 사용하십시오. 웹 프로그래밍은 동시성에 중점을 둡니다. 따라서 데이터베이스 쿼리에 대해 걱정할 필요가 없습니다. 데이터베이스의 한계에 도달하면 캐싱 계층을 추가하거나 읽기 전용 슬레이브를 추가하여 하드웨어를 "확장"할 수 있습니다.

0

웹 프로그래밍의 데이터 지속성은 쿠키/세션을 사용하고 웹 페이지 호출에서 쿠키/세션 변수를 전달함으로써 수행됩니다. 이론적으로 모든 종류의 데이터가이 변수에 저장 될 수 있습니다. 그러나 대부분의 실제적인 목적을 위해 필요한 객체를 식별/재구성하는 데 필요한 더 중요한 데이터 (토큰과 유사하게 보입니다)는 데이터베이스로 또는 데이터베이스없이 전송됩니다. 및 서버 및 브라우저에서.

0

나는 memcached을 잘 보길 권합니다. 서버로드 및 성능 기능에 대해 이야기 할 때 유용한 측정 항목은 페이지/초입니다. 전용 서버가 있고 최적화되지 않았지만 매우 집중적 인 작업을 수행하는 경우 초당 5 페이지 만 제공 할 수 있습니다. 데이터 캐싱을 활용하면 3 배에서 10 배까지 향상시킬 수 있습니다. 그러나 데이터가 얼마나 오래 보관 될 수 있는지는 항상 상충됩니다. 페이지 당 다른 연결 (이미지, CSS 등), 파일 입출력, 기타 네트워크 활동 및 실제적인 것 등 다른 가능한 성능 제한 요소를 올바르게 이해 (계량화)하려면 사이트를 테스트해야합니다.

+0

p.s memcahced는 여러 서버를 지원하며 매우 잘 테스트되고 안정적인 확장입니다. apc는 한 서버에서 훌륭하고 사용자 정의 사용을 지원하지만 분산 응용 프로그램에 관해서는 memcached가 여전히 유리합니다. 그러나 다른 페이지가 그때까지 값을 수정할 수 있었기 때문에 increment를 "잠금"논리로 사용하여 흥미로운 작업을해야합니다. memcached에 따라 잘 작동하지만이 인터페이스를 코딩 할 때주의를 기울여서 변경되지 않았다고 가정하지 말고 새로운 데이터를 덮어 씁니다. http://www.php.net/manual/en/memcache.increment.php – zanlok

0

싱글 톤 사용을 중단하고 의존성 주입을 사용합니다.

가장 좋은 방법은 DataMapper (http://www.martinfowler.com/eaaCatalog/dataMapper.html)를 사용하여 동적 속성을 사용하여 개체에 연결하는 것입니다. 데이터 맵퍼가 지속성을 처리하게하십시오.

$CS = new CookieStorage(); 
$SS = new SessionStorage(); 
$FS = new FileStorage('config/object.db'); 

$DM = new ObjectDataMapper($FS); 

$O = new Object($DM); 

$Object->DynamicProperty = 1; 

지금 DynamicProperty 자동으로 유지됩니다 자동으로 파일 object.db에서로드됩니다. 클래스 정의 :

class Object 
{ 
    public function __construct(MapperInstance $Storage = NULL) 
    { 
     $this->setMapper($Storage?: new ObjectDataMapper(new FileStorage('config/object.db'))); 
    } 

    public function __get($name) 
    { 
     $this->_Mapper->getProperty($name); 
    } 

    public function __isset($name) 
    { 
     $this->_Mapper->isProperty($name); 
    } 

    public function __set($name, $value) 
    { 
     $this->Mapper->setProperty($name, $value); 
    } 
} 
0

현재 세션에 개체를 저장할 수 있습니다. 이제는 객체 자체를 저장하고 다시 만들 수있는 기본 클래스를 만듭니다. 그러면 파생 된 객체도 영구적으로 유지됩니다. 빠른 지속성을 달성하기 위해 디스크에 개체를 직렬화보다해야하므로 내가 세션이 RAM에 저장되어 알고 지금까지 persistent base class and example

과 :

여기에서 읽을 수 있습니다.

+0

이 페이지에 대한 링크를 사용할 수 없습니다. – Blip

+0

고맙습니다. 그냥 링크를 업데이트 :) – tswaehn

1

가장 좋은 해결책은 아니지만 SESSIONS을 사용할 수 있습니다. 당연히이 방법이 가장 쉬운 보이지만

$object = unserialize($_SESSION['object']); 

:

class SomeObject{ 

    public function __costructor{ 
     $_SESSION['object'] = serialize($this); 
    } 

} 

및 다른 페이지에

, 당신은 함께 단순히 객체를 호출 할 수 있습니다. 그것은 최대한주의와 함께해야합니다
  1. 세션은 많은 사용자가 동시에 각 세션 요청으로 크기가 너무 크지 않아야 서버의 트래픽에 따라 것을 알고있다. 자신의 재량에 따라 크기를 조정하십시오.

  2. 은 세션이 완료 될 때마다 항상 직렬화되고 비 직렬화되므로 은 오작동합니다.

귀하의 보트는 항해합니다. 당신의 마음에 드는 분석에 그렇게하십시오. goodluck