이 기사에서는 PHP 단일 입력 애플리케이션을 더 자세히 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 내용은 다음과 같습니다.
단수신청이란?
Single Entry 애플리케이션이 무엇인지 설명하기 전에 기존 웹 애플리케이션을 살펴보겠습니다.
news.php는 뉴스 목록을 표시합니다
news_edit.php는 뉴스 편집 페이지를 표시합니다
이 두 페이지는 각각 두 가지 기능을 구현할 뿐만 아니라 애플리케이션에 대한 두 가지 입구가 됩니다.
그럼 입구는 뭔데요?
예를 들어 모두가 화장실에 가면 남자는 한 문으로 들어가고 여자는 다른 문으로 들어갑니다. 이 두 문은 화장실로 들어가는 두 개의 문입니다.
하하, 위의 예는 이해하기 쉬울 것 같아요. 그렇다면 조금만 바꿔보면 단일출입구의 개념은 이해하기 쉽습니다.
이제 우리는 공용 화장실에 들어가고 있습니다. 남자와 여자 모두 바깥쪽 입구에서 돈을 지불한 후 각각 두 개의 문으로 들어갑니다. 가장 바깥쪽 입구는 이 화장실의 단일 입구입니다.
따라서 단일 진입점 애플리케이션은 실제로 하나의 파일을 사용하여 모든 HTTP 요청을 처리하는 것을 의미합니다. 예를 들어 뉴스 목록 기능이든 뉴스 편집 기능이든 브라우저에서 index.php 파일에 액세스합니다. index.php 파일은 애플리케이션에 대한 단일 진입점입니다.
index.php 사용자가 어떤 기능을 사용하고 싶어하는지 어떻게 알 수 있나요?
매우 간단합니다. index.php에 액세스할 때 특정 매개변수를 따르기만 하면 됩니다. 예를 들어 index.php?action=news는 뉴스 목록을 표시하고 index.php?action=news_edit는 뉴스 편집기를 나타냅니다.
index.php에서는 단 두 줄의 코드만으로 이 효과를 얻을 수 있습니다.
<?php $action = $_GET['action'] == '' ? 'index' : $_GET['action']; include('files/' . $action . '.php'); ?>
위 코드에서 첫 번째 줄은 URL에서 작업 매개변수를 가져오는 것입니다. 작업 매개변수가 제공되지 않으면 기본 '인덱스'가 매개변수로 설정됩니다.
두 번째 코드 줄은 $action 매개변수를 기반으로 다양한 코드 파일을 호출하여 다양한 기능에 해당하는 단일 항목의 효과를 얻는 것입니다.
단일 응모 지원서의 응모 파일이 복잡하다구요?
단일 입력 프로그램의 index.php가 국수만큼 복잡할 것이라고 생각하는 친구들도 있지만 이는 사실 오해입니다.
예를 들어 현재 애플리케이션 항목 파일에는 다음 줄만 있습니다.
<?php define('APP', realpath('../libs/website')); define('LANG', 'gb2312'); define('DEBUG', 1); require('../libs/flea1/basic.php'); run(); ?>
간단하죠?
물론, index.php에 긴 스위치 케이스 목록을 작성하는 것은 확실히 잘못된 구현입니다. 하지만 이는 순전히 개발자 자신의 디자인과 구현의 문제이지, 싱글 엔트리 애플리케이션의 디자인 아이디어의 문제는 아닙니다.
추가 설명: 여기서 스위치 케이스를 언급한다고 해서 스위치를 사용하는 것이 "뒤로", "유행" 등을 의미한다는 의미는 아닙니다. 단지 엔트리 프로그램인 index.php에 스위치 케이스를 잔뜩 쓰는 것은 프로그램 수정이나 유지 관리에 도움이 되지 않으므로 나쁜 사용법이라는 뜻일 뿐입니다.
단일 출입 신청을 위한 디자인 아이디어
웹 서버(apache 또는 iis)가 http 요청을 받으면 요청을 구문 분석하고 액세스할 파일을 결정합니다. 예를 들어, http://www.xxx.com/news.php의 구문 분석 결과는 웹 서버가 news.php 파일을 구문 분석하고 그 결과를 브라우저에 반환하도록 요구합니다. 이제 단일 항목 애플리케이션의 index.php 파일을 보면 index.php가 실제로 url 매개변수를 기반으로 두 번째로 구문 분석되는 것을 볼 수 있습니다.
이 구문 분석을 완료하는 프로그램은 일반적으로 Dispatcher(정확한 중국어 번역은 모르겠습니다)라고 하는데, 이는 대략 처리를 위해 다양한 요청을 다양한 핸들러에 전달하는 것을 의미합니다.
단일 항목 애플리케이션에서 index.php와 웹 서버는 함께 http 요청 및 url 매개변수를 기반으로 요청 핸들러를 결정하는 Dispatcher를 형성합니다.
Dispatcher의 개념을 이해한 후에는 위에서 언급한 두 줄의 코드가 실제로 가장 간단한 Dispatcher 구현임을 알 수 있습니다.
<?php $action = $_GET['action'] == '' ? 'index' : $_GET['action']; include('files/' . $action . '.php'); ?>
물론 안전하고 강력한 애플리케이션을 위해 Dispatcher는 위와 같이 간단하지 않습니다. 실제 코드를 호출하기 전 다양한 판단, 보안 점검 등이 추가됩니다. 예를 들어, URL로 지정된 함수에 액세스할 수 있는지, URL에 잘못된 매개변수가 포함되어 있는지 확인하세요.
이것을 보면 친구들은 분명히 다음과 같이 말할 것입니다. 이런 디스패처만 있으면 news.php, news_edit.php 등 개별 파일을 직접 만드는 것과 비교하면 어떤 이점이 있나요?
단수지원의 장점
단일 항목 애플리케이션에 대한 모든 http 요청은 index.php를 통해 수신되어 함수 코드로 전달되므로 index.php에서 많은 실제 작업을 완료할 수 있습니다.
여기서는 자세한 설명을 위해 보안 검색을 예로 들어보겠습니다.
모든 http 요청은 index.php로 수신되기 때문에 중앙 집중식 보안 점검이 가능합니다. 단일 항목이 아닌 경우 개발자는 각 파일의 시작 부분에 보안 검사 코드를 추가하는 것을 기억해야 합니다(물론 보안 검사 코드는 다른 파일에 작성할 수 있으며 포함하기만 하면 됩니다).
하지만 다들 게으르고 기억력도 좋지 않아서 가끔 잊어버리는 건 어쩔 수 없는 일인 것 같아요. 따라서 각 파일 앞에 필요한 포함을 추가하는 것을 기억하는 것은 쉽지 않습니다.
보안검색과 유사합니다. 포털에서는 URL 매개변수 및 게시물에 대해 필요한 검사를 수행하고, 특수 문자 필터링, 로그 기록, 액세스 통계 및 중앙에서 처리할 수 있는 기타 작업을 수행할 수도 있습니다.
“야, 기능이 너무 많으면 index.php가 너무 복잡해지지 않을까?”
"아니요. 다양한 기능을 별도의 파일에 작성한 다음 index.php에 포함시키면 됩니다!"
단일 입국 지원의 단점
모든 것에는 양면이 있으며, 단수 신청도 예외는 아닙니다. 모든 http 요청은 index.php에 대한 것이기 때문에 애플리케이션의 URL은 그다지 예쁘지 않습니다. 특히 검색 엔진에 우호적이지 않습니다.이 문제를 해결하려면 URL 재작성, PATHINFO 등을 사용할 수 있습니다. 하지만 저는 개인적으로 첫 페이지에 단일 입력 방법을 사용하지 않고 여러 파일 항목을 유지하는 것이 좋습니다. 아니면 둘을 혼합한 것입니다. 예를 들어 뉴스 목록은 별도의 news.php를 사용하여 표시되지만 사용자 등록, 정보 게시 등은 단일 입구를 사용합니다. 웹사이트 소유자에게 뉴스 목록과 뉴스 표시 페이지는 검색 엔진의 주의가 필요한 높은 가치의 대상인 반면, 사용자 등록 페이지와 같은 대화형 기능은 전혀 가치가 없기 때문입니다.
한 친구가 단일 항목 애플리케이션에는 긴 매개변수 목록이 있을 것이라고 언급했습니다. 따라서 다음 URL을 분석해 보겠습니다.
index.php?url=news&news_id=123&page=2&sort=제목
대신 news.php에 직접 액세스하는 경우 url=news 매개변수를 생략하면 됩니다.
단일 입력 애플리케이션의 기능 코드를 어떻게 구성하나요?
단일 입력 애플리케이션의 가장 큰 과제는 각 기능의 처리 코드를 어떻게 합리적으로 구성할 것인가에 있습니다. 하지만 특정 단계를 따르면 이 문제를 쉽게 해결할 수 있습니다.우선, 애플리케이션의 기능을 합리적으로 분해합니다. 예를 들어, 백그라운드의 뉴스 열에는 "뉴스 추가", "뉴스 편집", "뉴스 삭제" 등과 같은 여러 기능이 포함될 수 있습니다. 이때 논리적으로 관련된 기능 세트를 "뉴스 관리" 모듈이라고 하는 기능 모듈로 결합할 수 있습니다.
위의 방법에 따라 애플리케이션의 기능을 분류한 후 여러 기능 모듈을 얻게 되며 각 모듈은 여러 기능으로 구성됩니다. (사실 단수신청이 아니더라도 기능 정리는 꼭 필요한 단계입니다.)
1. 각 기능 모듈에는 하위 디렉터리가 있으며, 디렉터리의 각 파일은 함수의 구현 코드입니다.
이 방법의 장점은 각 기능의 코드가 서로 분리되어 있어 여러 사람이 협업할 때 매우 편리하다는 것입니다. 단점은 각 기능간 코드와 데이터 공유가 그리 편리하지 않다는 점이다. 예를 들어, 뉴스 관리 모듈의 모든 기능에는 "뉴스 칼럼 기록 검색" 기능이 필요합니다. 이러한 여러 독립 파일 구성 방법을 사용하면 "뉴스 칼럼 기록 검색"은 다른 파일에만 기록될 수 있으며, 그런 다음 해당 파일을 포함할 수 있습니다. 이 기능이 필요합니다.
말할 필요도 없이 코드와 데이터를 공유할 때 이점이 매우 편리합니다. 단점은 여러 사람이 동시에 변경을 하면 충돌이 일어나기 쉽다는 점이다. 그러나 버전 제어 소프트웨어와 차이점 비교 및 병합 도구를 사용하면 충돌을 쉽게 해결할 수 있습니다.
index.php에서 함수 코드를 어떻게 호출하나요?
먼저 호출해야 할 것은 규칙을 설계한 다음 index.php가 이 규칙에 따라 함수 코드를 검색하고 호출하도록 하는 것입니다. 나 자신의 경우 항상 $_GET['url']을 사용하여 호출할 함수 모듈을 지정하고 $_GET['action']을 사용하여 모듈의 특정 기능을 지정합니다. 따라서 내 애플리케이션은 다음 URL 주소를 사용합니다.
index.php?url=news&action=edit
두 개의 매개변수가 너무 많다고 생각하시나요? 그런 다음 index.php?func=news.edit와 같은 URL을 사용할 수 있습니다. news.edit를 뉴스로 분할하고 편집하세요.
"그렇다면 귀하의 애플리케이션이 계속 실행되는지 확인하기 위해 의도적으로 index.php?url=news&action=xxx를 생성했나요?"
분명히 그러한 URL은 index.php가 필요한 함수 코드를 찾을 수 없게 만들고 결국 오류를 보고하게 됩니다. 그러나 브라우저에서 존재하지 않는 파일인 newsxxx.php에 액세스할 때와 이것 사이의 근본적인 차이점은 무엇입니까?
반대로, 필요한 함수 코드를 찾을 수 없는 경우 index.php에서 멋진 오류 페이지를 표시하고 웹사이트 홈페이지로 돌아가는 링크를 제공하도록 할 수도 있습니다.
실제 개발에서는 애플리케이션에서 일부 기본 서비스를 추출하여 애플리케이션 프레임워크를 구성하는 경향이 있습니다. 이 프레임워크에는 일반적으로 Dispatcher, 기본 데이터베이스 액세스 서비스, 템플릿 엔진, 공통 보조 기능 등이 포함됩니다. 프레임워크가 있으므로 Dispatcher를 더 유연하게 만들 수 있습니다. 예를 들어 권한 확인은 일부 기능 모듈에만 적용되고 다른 기능 모듈에는 적용되지 않을 수 있습니다.
단일 입국 신청에 대해 자세히 알아보기
무언가를 깊이 이해하려면 직접 시도해 보는 것이 가장 좋습니다.
Dispatcher 및 해당 규칙을 직접 구현하거나 기존 애플리케이션 프레임워크를 선택할 수 있습니다. 하지만 더 좋은 방법은 기존 프레임워크를 먼저 사용해 본 다음 유사한 프레임워크를 직접 구현해 보는 것입니다. 이렇게 하면 가장 짧은 시간에 비용 대비 최대의 효과를 얻을 수 있습니다.
현재 대부분의 PHP 애플리케이션 프레임워크는 단일 항목이며 MVC 패턴을 채택합니다(불행히도 MVC는 너무 복잡하고 단일 항목 애플리케이션과 필요한 연결이 없기 때문에 자세히 설명하지 않겠습니다. 관심 있는 친구는 Google에서 관련 정보).
저는 개인적으로 다음 프레임워크를 추천합니다.
FleaPHP
http://www.fleaphp.org/
글쎄, 나는 광고 중이야. 왜냐하면 내가 이 틀을 만들었기 때문이다. 그러나 나는 이 프레임워크가 (가장 쉬운 것은 아니지만) 사용하기 매우 쉬운 프레임워크가 될 것이라고 믿습니다.
전체 중국어 코드 주석, 간단한 구조, 간소화된 코드는 FleaPHP 프레임워크의 장점입니다.
케이크PHP
http://www.cakephp.org/
Ruby on Rails용 PHP 복제품입니다. 뛰어난 기능을 갖고 있지만 확실히 너무 복잡하고, 중국어 정보가 부족한 것이 큰 문제입니다.
심포니
http://www.symfony-project.com/
n개의 사물을 통합하는 매우 복잡한 프레임워크입니다. 프로젝트 웹사이트에서 제공되는 비디오 데모는 훌륭해 보입니다.
기타
Mojavi 및 Phing과 같은 많은 PHP 프레임워크도 있습니다.
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.