2009-03-02 1 views
24

이 질문은 Rasmus Lerdorf's talk from Drupalcon을 보면서 발생합니다. 이 질문과 그의 이야기는 드루팔 (Drupal)과 특별히 관련이 없습니다. 제 질문은 PHP와 관련이 없습니다. 내가 궁금해하는 것은 일반적으로 하나의 진입 점이다.웹 사이트에 대한 단일 진입 점이 있습니다. 나쁜? 좋은? 불건전 메시지 신고?

요즘 대부분의 프레임 워크는 사용자가 만든 모든 항목에 대해 단일 진입 점을 제공하는 것으로 보입니다. 그의 대화에서 Rasmus는 그가 이것이 나쁘다고 생각한다고 언급합니다. 그는이 생각에서 그가 옳을 것이라고 생각합니다. 사이트를 방문하는 모든 사람들이 동일한 진입 점을 통해 들어오는 경우 트래픽이 일정한 지점에 도달 한 후 상황이 급락하지 않을까요? 요청이 동일한 지점을 거치지 않고 사람들이 사이트의 특정 지점에 직접 액세스하도록 허용하는 것이 더 효율적이지 않습니까? 그러나 실제 영향은 그리 나쁘지 않습니다. 어쩌면 현대 건축이 그것을 처리 할 수 ​​있을까요? 고려해 볼만한 가치가 있기 전에 규모면에서 진정으로 거대한 것이어야합니까? 이 사이트의 사람들이이 문제에 관해 어떻게 생각하는지 궁금합니다.

답변

29

는, 라스무스 또는 해석이 잘못된 말, 상황에 따라 진입 점을 제공하는 것을 좋아합니다.

이것은 컴퓨터 작동 방식에 대한 명확한 이해가 부족함을 보여줍니다. 더 많은 것을 사용하면할수록 CPU에 더 가깝기 때문에 이 더 빠릅니다.. 단일 입장 지점! = 단일 실패 지점. 하지만 그게 바로 그 요점에요. 사람들이 단일 진입 점을 말할 때, 우리는 앱에 대해 이야기하고 있습니다. 그것은 당신의 논리에 대한 진입 점 중 하나입니다.

구조적으로 뇌가 빠져서 중심점을 가지지 않거나 일반적으로 엔트리 포인트 수를 줄이지 않아도됩니다. 모든 진입 점에서 앱 전반에 걸쳐 한 가지 작업을 수행하려는 즉시 변경해야 할 장소가 몇 개인가요?각 페이지가 섰던 앱을 처리 한 결과, 앱을 변경해야했기 때문에 빨려 들었습니다.

+0

오른쪽에 형제. 웹 서버는 단일 진입 점이라고 주장 할 수 있습니다. Rasmus가 제안하는 것은 DRY가 아닙니다. 모든 스크립트가 개별적으로 동일한 리소스를로드해야하기 때문입니다. 전면 컨트롤러가이를 처리합니다. – rick

+0

이것이 바로 주요 웹 응용 프로그램을 여러 항목에서 단일 항목/FC로 변환하는 이유입니다. 더 나은 일관성,보다 쉬운 유지 보수, 중앙 집중식 캐싱, ... 정말로, 유일한 (그리고 사소한) 단점은 당신이 하나의 엔트리 포인트를 짖는다면 사이트가 다운되지만 그것이 테스트에 좋은 인센티브라는 것입니다. :-) –

4

로드 밸런싱 및 선언적 코드와 같은 방법을 통해 확장 성을 지원하는 웹 프레임 워크를 사용해야한다는 점이 중요합니다.

아니요, 단일 진입 점 자체가 병목 현상을 일으키지 않습니다. Google의 첫 페이지는 많은 조회수를 얻지 만 많은 수의 서버가 있습니다.

그래서 대답은 다음과 같습니다. 문제가되지 않습니다.

1

이것은 처음에 생각한 것입니다.하지만 영향을 미치지 않는 것 같습니다. 결국 엔트리 포인트는 부트 스트랩 로더를 포함하여 일부 환경 상수 설정, 옵션으로 던져진 예외 잡기 및 프론트 컨트롤러 디스패치와 같은 두 가지 작업 만 수행합니다. I 생각해 보면이 비효율적이지 않은 이유는이 파일이 컨트롤러, 동작 또는 사용자에 따라 변경되지 않기 때문입니다.

그러나 나는 이것이 이상하다고 생각합니다. 지금은 작은 MVC 프레임 워크를 직접 제작하고 있지만 사용했던 대부분의 프레임 워크와는 약간 반대입니다. 내가 액세스 한 파일에 컨트롤러 로직을 넣었다. 예를 들어, index.php는 IndexController와 그 동작을 포함합니다. 이 접근법은 적어도 나를 위해 잘 작동합니다.

2

나는 입장의 단일 지점을 갖는 것 이상의 가장 큰 장점 중 하나는 보안이라고 생각합니다. 입력이 모두 들어 오면 시스템이 단일 장소에서 검사되고 유효성이 확인되면 시스템이 손상 될 가능성이 적습니다.

1

대부분의 php mvc 프레임 워크는 URL 재 작성을 사용하거나 적어도 index.php 이후의 내용을 모두 구문 분석하므로 하나의 진입 점은 이 필요합니다.입니다. 게다가

, 내가 웹 (/ 비누)/콘솔/... 한마디로

4

소프트웨어 개발과 마찬가지로, 의존적입니다. 프론트 컨트롤러 스타일 프레임 워크에 대한 Rasmus의 반대는 각 요청에 대해 많은 코드를 미리로드해야하기 때문에 발생하는 성능 저하입니다. 이것은 100 % 사실입니다. 어떤 종류의 스마트 리소스 로딩 모듈/객체/etc를 사용하더라도, 프레임 워크를 사용하는 것은 성능상의 균형입니다. 당신은 성능 타격을하지만, 대가로 당신은 다시

  1. (즉 무엇이든) "비즈니스 로직"및 템플릿/레이아웃 논리의 고무적이었던 seperation에

  2. 즉시 그리고 (더 중요한) 통합를 얻을 수 호출 된 서비스, 데이터 모델 등에 사용할 객체에 대한 액세스

Rasmus와 같은 사람에게는 성능이 떨어지는 가치가 없습니다. 그는 C/C++ 프로그래머입니다. C/C++ Extension을 PHP에 작성하면 매우 효율적으로 비즈니스 로직을 분리 할 수 ​​있습니다.

PHP에 C/C++ 확장을 쉽게 작성할 수있는 환경과 팀이 있으며 시장 출시 시간 대비 성능 비율이 합리적이라면 예, 프론트 컨트롤러 프레임 워크를 폐기하십시오.

환경이 그렇지 않은 경우 프런트 컨트롤러 프레임 워크가 생산성 향상을 고려하여 (likely) simple CRUD Application으로 가져올 수 있습니다.

1

사람들이 일반적으로 생각하는 것은 하나의 PHP 페이지가 있기 때문에 모든 요청을 처리하는 단일 페이지입니다. 정렬과 같은 대기열.

중요한 점은 각 요청은 스크립트의 인스턴스를 생성하므로로드가 서로 다른 두 페이지가 동시에 액세스되는 것과 같습니다. 그럼, 여전히 같은 부하. 사실상.

그러나 일부 프레임 워크는 입력 스크립트에서 필요하지 않은 많은 요소를 가지고 있습니다. 가능한 모든 시나리오를 충족시키는 catchall과 비슷하며 이로 인해로드가 발생할 수 있습니다.

개인적으로 나는 여러 페이지를 선호합니다. 동일한 방법으로 oop와 procedural을 혼합합니다. 나는 오래된 학교 방식으로 PHP를 좋아한다.

0

프런트 컨트롤러 파일 아키텍처를 사용할 때 확실히 단점이 있습니다. Saem이 설명했듯이 동일한 파일에 액세스하는 것이 일반적으로 성능 향상에 도움이되지만 Alan Storm과 Rasmus Lerdorf가 설명한 것처럼 여러 상황을 처리하도록 코드를 만들려고합니다 (예 : 프론트 컨트롤러가 사이트의 모든 "페이지"에 대한 요청을 처리하려고합니다) 코드의 비 대한 복잡한 컬렉션으로 이어집니다. 모든 페이지로드에 대해 비대하고 복잡한 코드 모음을 사용하면 좋지 않은 행동으로 간주 될 수 있습니다.

Saem은 프론트 컨트롤러가 여러 위치에서 코드를 편집하지 않아도된다는 것을 주장하지만, 일부 경우에는 중복을 분리하여 더 잘 해결할 수 있다고 생각합니다.

실제로 웹 서버에서 사용하는 디렉토리 구조를 사용하면 웹 서버가 더 간단 해지고 개발자는 더 명확 해집니다. 웹 서버가 기존 URL을 새 URL로 다시 작성하는 것보다 전통적으로 나타내는 것처럼 URL로 변환하여 파일을 제공하는 것이 더 간단합니다.모든 것을 처리하기 위해 부풀어 오른 컨트롤러로 시작하는 대신 개발해야하는 것에보다 특정한 파일/컨트롤러로 시작하기 때문에 프론트 컨트롤러가 아닌 파일 아키텍처가 개발자에게 더욱 분명해질 수 있습니다.

2

"하나의 파일"대 "여러 파일"의 관점에서이 점을 논의하는 것이 큰 오해라고 생각합니다.

진입 점이 하나의 파일에 있기 때문에 우리가 집중해야하는 것은 그 하나의 파일에있는 코드입니다. 이는 잘못된 것입니다.

모든 인기있는 프레임 워크에는 요청 처리 코드, 해석 코드 및 유효성 검사 코드가 포함 된 수많은 파일이 있습니다. 코드는 한 곳에서 찾을 수 없으며 요구되는 내용과 방법에 따라 다른 클래스를 호출하는 require/include 문의 정글에 퍼져 있습니다.

두 경우 모두 요청은 실제로 다른 파일에서 처리됩니다.

왜 strpos(), substr(), strncmp()와 같은 몇 가지 다른 함수를 호출해야하는 일종의 _detect_uri() 함수가있는 단일 진입 점이 있어야합니다. 해당 문자열을 모두 제거하면 여러 항목을 사용할 수 있습니까?

URI.php의 CodeIgniters _detect_uri() 함수를 살펴보십시오. CodeIgniter를 선택하지 않아도됩니다. 다른 프레임 워크도 마찬가지입니다.

단일 진입 점과 여러 진입 점을 사용하여 MVC 패턴의 목표를 달성 할 수 있습니다.

관련 문제