2010-05-30 7 views
16

나는 과거에 레일즈, 머블, 장고 및 asp.net mvc 어플리케이션을 사용 해왔다. 공통점 (질문과 관련이 있음)은 프레임 워크를 설정하는 코드를 가지고 있다는 것입니다. 이것은 대개 웹 서버가 재활용 될 때까지 유지되는 객체 및 상태를 만드는 것을 의미합니다 (예 : 라우팅 설정 또는 사용 가능한 컨트롤러 확인 등).PHP에서 요청 사이에 객체를 유지하는 방법

필자가 아는 한 PHP는 실행될 때마다 바이트 코드로 컴파일 된 CGI 스크립트와 유사합니다. 요청이 지나면 버려집니다. 물론 동일한 사용자의 요청간에 데이터를 유지하기 위해 세션을 가질 수 있으며 APC와 같은 확장이 있으므로 서버 수준의 요청간에 개체를 유지할 수 있습니다.

제 질문은 : 어떻게 레일과 같은 방식으로 작동하는 PHP 응용 프로그램을 만들 수 있습니까? 내 말은 첫 번째 요청에서 프레임 워크를 설정하고 두 번째 요청에서 나중에 설정된 개체를 사용하는 응용 프로그램을 의미합니다. mod_php에 캐싱 기능이 내장되어 있습니까? (예 : 실행 된 PHP 응용 프로그램의 컴파일 된 바이트 코드를 저장) 또는이 문제를 해결하는 유일한 방법은 APC 또는 몇 가지 유사한 확장명을 사용하고 있습니까? 어떻게 할 건데?

감사합니다.

EDIT : 대체 질문 : 설정 시간이 오래 걸리지 만 실행 시간이 짧은 대형 PHP 응용 프로그램을 만들면 (이미 설명한 프레임 워크에서와 같이) 이미 설정 한 항목을 어떻게 캐시해야합니까? 데이터베이스 연결을 제외하고는 많은 것들을 의미 할 수 있습니다. 왜냐하면 PHP에서 이미 영구 연결을 가지고 있기 때문입니다.

큰 설정 시간을 정당화하려면 : PHP 리플렉션을 사용하여 사용 가능한 개체를 확인하고 이에 따라 런타임을 설정하는 경우 어떻게해야합니까? 대다수의 리플렉션을하는 것은 대개 느리지 만 한 번만 수행해야합니다 (소스 코드가 수정 된 경우에만 다시 평가해야 함).

EDIT2 : 그러면 APC 인 것 같습니다. 바이트 코드를 자동으로 캐시한다는 사실은 알아두면 좋습니다.

답변

5

APC가 유일한 해결책인지는 모르지만 APC는 모든 문제를 처리합니다.

먼저 스크립트가 APC로 컴파일되고 바이트 코드가 메모리에 저장됩니다.

설정하는 데 시간이 오래 걸리는 경우 APC에서 사용자 데이터로 캐시 할 수도 있습니다. 예를 들어, 나는이 모든 시간을, APC와

  $table = @apc_fetch(TABLE_KEY); 

      if (!$table) { 
        $table = new Table(); // Take long time 
        apc_store(TABLE_KEY, $table); 
      } 

는 테이블을 만드는 작업은 서버 인스턴스 당 한 번만 수행됩니다.

+0

스크립트 사전 컴파일은 작업의 일부일뿐입니다. 하지만 내가 corectly PHP를 사용 하여이 부분을 할 필요가 있는지, 오른쪽? 예를 들어, mod_php는 나를 위해 이것을하지 않을 것입니다. – SztupY

+1

코드 캐싱은 투명합니다. APC를 설치하기 만하면 비활성화하지 않는 한 자동으로 바이트 코드가 캐시됩니다. 필자의 예제에서 $ table과 같은 앱 데이터는 자동으로 캐싱되지 않습니다. 너 혼자해야 해. –

+4

왜 'apc_fetch'를 억제하지 않습니까? **'afc_fetch'는 성공했을 때 저장된 변수 또는 변수 배열을 반환합니다; 실패시 FALSE **. –

0

나는 당신이 잘못된 일반화를하고 있다고 생각합니다. 이러한 모든 프레임 워크 (예 : Rails)는 다른 구성으로 실행할 수 있습니다. 어떤면에서는 모든 요청에 ​​대해 프로세스가 생성됩니다. 이것은 분명히 성능을 떨어 뜨리지 만,이 프레임 워크는 장기 실행 프로세스에 의존하지 않는다는 것을 보여줍니다. 필요한 경우 모든 요청을 설정 (설정 파일 재분석, 객체 생성 등) 할 수 있습니다.

물론 mod_php (PHP가 일반적으로 사용되는 방식)는 CGI와 달리 웹 서버 프로세스 내에서 실행됩니다. 그래서 저는 CakePHP (예를 들어)와 Rails 사이에 근본적으로 다른 것을 보지 못합니다.

아마도 나는 파이썬의 WSGI이나 루비의 Rack과 같은 것을 찾고 있다고 생각합니다. 응용 프로그램의 인터페이스 (언어 실행 방법에 관계없이)를 지정합니다. 새 요청의 경우 응용 프로그램 개체의 새 인스턴스가 만들어집니다. 지금까지 내가 아는 한, PHP에는 존재하지 않는다.

+1

예, 일반적으로 각 요청 후에 폐기 및 재생성되지 않습니다. 물론 레일을 그렇게 만들 수는 있지만 각 요청에 3-4 초의 셋업 시간이 필요합니다. 그리고 새로운 프로세스가 생성 되더라도 설정 프레임 워크에서 무엇인가를 공유합니다. – SztupY

+0

설치 시간이 3 ~ 4 초라는 것은 과장된 말입니다. 표준 레일 요청은 내 개발 컴퓨터에서 100 밀리 초 미만입니다 (즉, RoR이 개발 중에 실행 중이므로 매번 파일을 파싱한다는 의미입니다). 편집 : 당신은 아마도 표준 프레임 워크가 가지고있는 것보다 훨씬 복잡한 설정을 가지고 있으므로이 설명은 존재하지 않습니다. –

+0

레일은 일반적으로 웹 서버가 다른 프로세스를 제공해야 할 때 연결하는 별도의 프로세스로 실행됩니다. Passenger/mod_rails는 이러한 프로세스를 처리하는 데 사용됩니다. AFAIK mod_php는 별도의 서버 응용 프로그램 프로세스를 만들지 않으며 연결도하지 않습니다. PHP 파일을 해석 할 뿐이며 필요한 작업을 수행하기 위해이 PHP 파일을 사용합니다. CakePHP 소스 코드를 보면 약간의 캐싱 지원이있는 것 같지만 실제로 캐싱하는 것이 무엇인지 알지 못합니다. – SztupY

3

PHP (및 루비)는 해석 언어입니다. 그것은 그들이 요청할 때마다 파일을 구문 분석하고 의사 바이트 코드로 변환된다고 말할 수 있다고 가정합니다. PHP가 RoR을 말하는 것보다 더 비슷하다고 말할 수있는 것은 '명백한'것이지만 둘 다 같은 방식으로 행동합니다.

요청 간의 지속적인 데이터 기능은 언어 자체가 아닌 서버의 기능입니다. 예를 들어, 사용자가 말하는 RoR 라우팅은 실제로 캐시되지만 서버의 로컬 메모리에 캐시됩니다. 더 빠른 readins를 위해 컴파일되고 저장되지 않습니다.서버 (및 서버에 의해 나는 & 웹 서비스 인스턴스를 의미 함)이 정보가 다시 시작됩니다. 당신이 말하는 '프레임 워크 설정'은 프레임 워크에 포함 된 각 파일을 구문 분석하는 것과 관련이 있습니다. Rails는 요청하는 동안 각 파일을 반복해서 파싱합니다. 실제 수준의 기능은 실제로이 데이터를 메모리에 캐시 할 수 있지만 확실히 개발하지는 못합니다. 제가 언급 한 유일한 이유는 그것이 언어가 아닌 서버의 기능이라고 설명하기 때문입니다.

PHP에서 똑같은 것을 달성하려면 Zend Server를 사용할 수 있습니다. 지금까지 내가 아는 한 이것은 '컴파일하고'바이트 코드를 사용할 유일한 PHP 인터프리터이다. 그렇지 않으면 요청에 대해 유지하려는 데이터를 저장하는 방법을 찾아야합니다. 앞에서 언급 한 APC는 매우 강력한 기능으로,보다 분산 된 것이 Memcached이고 디스크에는 & SQL과 같은 영구 양식이 더 많이 있습니다.

나는이 특정 기능을 왜 사용하는지 알고 싶어합니다. 이렇게하면 성능 문제가 '해결'될 것입니다.

+0

편집에서 제안한대로 리플렉션을 사용하여 많은 것들을 빌드하고 (주로 DRY가 더 많음) 상당히 느립니다 (적어도 전반적인 실행 시간은 95 %가 설정 시간 임).하지만 한 번만해야합니다. PHP 커뮤니티가 어떻게 이런 "문제"(또는 실제로이 "문제"를 해결할 수 있는지 여부)를 해결하는 방법에 대해 궁금합니다. – SztupY

+0

특정 상황에 대해 토론하고 궁극적으로 '대안 솔루션'에 관해 논의 할 수 있습니까? "당신이 잘못하고있다"는 의미로 사용하지 마십시오. 저는 좀 더 많은 정보를 얻고 싶습니다. 그래서 당신을 올바른 장소로 안내 할 수 있습니다.APC/Memcached와 같은 메모리 캐싱 서버를 사용하는 경우가 거의 없습니다 (이전에는 단일 서버 만 설치하고, 다중 서버 & 더 많은 제어를 위해서는 설치). –

+0

나는 단지 호기심이 많다. 지난 4 년 동안 저는 PHP를 사용하지 않았으며 다른 프레임 워크의 작동 방식에 익숙했습니다. 필자는 설정 단계에서 많은 리플렉션 (주로 ASP.NET MVC)을 사용하여 DRY를 더 많이하는 것을 좋아하며 PHP에서도 동일하게 수행하려고했습니다. 분명히 PHP는 빠른 리플렉션 사용을 위해 설계되지 않았지만 모든 요청이 아닌 몇 번만 수행해야하는 경우가 아니면 신경 쓰지 않습니다. – SztupY

관련 문제