PHP의 실행 효율성과 관련하여 인터넷에는 많은 특별 기사가 있으며 그 중 대부분은 PHP와 Java 진영 간의 논쟁입니다. 애플리케이션 측면과 실행 환경이 다르면 효율성의 차이가 더 커집니다. 여기서 언급된 "대형" 애플리케이션은 Google, eBay, Yahoo와 같은 대규모 웹사이트의 특정 구현을 의미하지 않습니다. 단지 귀하의 시스템이 더 빠르고 원활하게 실행되고 더 많은 사용자를 온라인으로 호스팅할 수 있기를 바랍니다. PHP 초보자에게 약간의 도움을 줄 수 있습니다.
여기에서 언급된 "대형" 애플리케이션은 Google, eBay, Yahoo와 같은 대형 웹사이트의 특정 구현을 의미하지 않습니다. 독자가 자신의 개념과 신념을 포기하도록 설득하려는 의도는 없습니다. 그리고 더 원활하게 온라인에서 더 많은 사용자를 호스팅할 수 있으며 PHP 초보자에게 도움이 되기를 바랍니다.
PHP의 실행 효율성에 관해 인터넷에 특집 기사가 많이 있는데, 대부분은 PHP와 Java 진영의 논쟁으로 시작하여 불확실한 기대로 끝나는 경우가 많습니다. 실제로 프로그램의 실행 효율성은 비교를 통해 도출하기 어렵습니다. 애플리케이션 측면과 실행 환경이 다르면 효율성에 더 큰 차이가 발생합니다. 그리고 효율성도 평가해야 합니다. 어셈블리 언어가 매우 낮은 수준이고 매우 효율적인 프로그램을 작성할 수 있다는 것은 누구나 알고 있습니다. 그러나 웹 개발을 위해 어셈블리를 사용하고 어셈블리에서 프로그램을 작성하는 능력을 가진 사람은 거의 본 적이 없습니다. 효율적인 프로그래머는 모두의 존경을 받을 만한 것 같아요, 하하~ 우리 PHP와 다른 사람의 PHP의 차이점을 아는 한 PHP와 어셈블리의 차이점을 논의할 필요는 없습니다.
우선, 이 글의 전제를 분명히 해보자: 가상 호스트 공간이 아닌, 스스로 제어할 수 있는 서버가 하나 이상 있어야 한다. 결국, 가상 호스트에서 실행될 수 있는 범용 시스템을 위한 고전적인 작업과 성숙한 프레임워크가 이미 많이 있으며, 효율성 마이닝은 이전 세대에 의해 매우 잘 수행되었습니다. 또한 많은 현재 PHP 사용자가 상속하고 개발했습니다. 점점 더 많은 소위 "프레임워크"가 하늘의 별과 같습니다. 더 이상 그것에 대해 쓰고 싶지 않습니다. 첫째, 내 수준이 그다지 좋지 않아서 아무것도 쓸 수 없기 때문입니다. 새롭고, 내가 써도 사람들을 웃게 만들 것이다. 둘째, 이에 대한 기사가 너무 많고, 의견도 너무 많다. 많은 열정적인 미래 천재 프로그래머들을 죽음에 이르게 하는 가장 큰 원인은 혼란이다.
전용 서버에서 실행되는 프로그램과 가상 호스트에서 실행 가능한 프로그램은 효율성 최적화에 큰 차이가 있습니다. 물론 수정 없이 하나 또는 여러 개의 독립 서버에 discuz 세트를 설치할 수 있지만 실제로 최대 성능 최적화를 얻을 수 있습니까?
독립 서버는 사용자가 소프트웨어 설치 및 삭제, 시스템 매개변수 구성, 소스 코드 수정까지 포함하여 시스템을 완벽하게 제어할 수 있음을 의미합니다. 이러한 개방형 하드웨어 플랫폼을 기반으로 성능은 속도뿐만 아니라 보안, 안정성 등도 반영됩니다. 가상 호스트와 달리 사용자는 웹 서버 매개 변수를 구성하고, PHP, 데이터베이스를 설치 및 구성하고, (제가 말하고 싶은 대로) 온갖 지저분한 것들을 설치해야 하며, 당연히 이에 대한 책임은 사용자에게 있습니다.
먼저 실행 시간, 템플릿, 데이터베이스 캡슐화, 캐시, 버퍼, 해시, 데몬 및 crontab과 같은 몇 가지 용어를 제시하겠습니다.
실행 시간은 프로그램이 처음부터 끝까지 실행되는 데 걸리는 시간이라는 것은 누구나 알고 있습니다. 웹은 일시적이고 상태가 없기 때문에 실행 시간은 웹 프로그램 실행 효율성을 나타내는 지표입니다. C/S 프로그램이나 백그라운드 데몬 프로그램 중 다수가 지속적으로 실행되기 때문에 측정에는 적합하지 않습니다. 페이지 실행 시간의 대표적인 예는 Discuz 포럼 페이지 하단에 표시되는 시간입니다. 일반적으로 Discuz는 사용되는 플랫폼, 데이터 양, 현재 시스템 압력에 따라 몇 밀리초에서 수십 밀리초까지 표시됩니다.
누구나 템플릿에 익숙합니다. 많은 사람들이 템플릿을 사용하지만 왜 사용하는지 모릅니다. 템플릿은 전통적으로 논리 계층을 나누는 방법으로 MVC 상위 구조에서는 프레젠테이션 계층을 하위 계층과 분리하여 실제 사용 시 프로그래머와 인터페이스 디자이너 간의 업무 분담을 용이하게 합니다. 그러나 지금은 템플릿의 부적절한 사용으로 인해 프로그래머와 인터페이스 디자이너 사이의 분업과 협력을 촉진하기는커녕 프로그래머와 아티스트 사이의 상호 증오의 주범이 되고 있는 경우가 많습니다. 이전 게시물) 많은 분들이 템플릿 정리에 많은 시간을 소비해야 한다고 불평하고 계십니다.
데이터베이스 캡슐화는 Java와 더 관련이 있는 것으로 보입니다. 이는 일반적으로 일부 캡슐화된 클래스와 같은 다양한 데이터베이스 시스템에 대한 통합 호출 인터페이스를 제공합니다. PHPLIB의 DB 패키징, PEAR DB, Adodb 등은 모두 유명해 많은 사람들이 사용하고 있습니다.
캐시(Cache)와 버퍼(Buffer)는 같은 것 같은데, 캐시(Cache)를 캐시(Cache), 버퍼(Buffer)를 버퍼링(Buffering)이라고 합니다. 하드웨어 개념에서 캐시의 목적은 레지스터와 메모리, CPU와 PCI-버스, IDE 버스와 하드 디스크 등 속도가 다른 두 장치를 연결하는 것입니다. 버퍼(Buffer)의 원래 의미는 스프링 같은 완충재로 충격의 충격을 줄이거나 흡수하는 데 사용됩니다. 버퍼(Buffer)란 데이터를 임시로 저장했다가 수신 속도와 다른 속도로 전송하기 위해 사용하는 데이터 선접근 방식이다. Buffer 업데이트 방식은 시간 간격에 따라 자동으로 Refresh가 가능한 반면, Cache는 '적중률'에 더욱 신경을 써서 현재 시간대에 자주 사용되는 소량의 데이터를 고속 장치에 넣어 읽기 쉽게 합니다. 그리고 글쓰기. 프로그램 개발에서는 고속 또는 저속 장치가 없더라도 데이터 소스의 읽기 및 쓰기 효율성이 다를 수 있습니다. 적은 양의 데이터의 경우 일반적으로 텍스트 파일 읽기 및 쓰기가 데이터베이스 액세스보다 효율적이며 tmpfs의 동일한 텍스트 파일 읽기 및 쓰기 효율성이 직접 디스크 IO 효율성보다 낫습니다. 버퍼는 프로세스 통신 및 대기열에 더 많이 반영됩니다. 이는 수신자가 더 빨리 읽을 수 없기 때문이 아니라 더 빨리 읽을 필요가 없기 때문입니다.
데몬 프로세스는 백그라운드에서 지속적으로 실행되는 프로그램으로, 일반적으로 프로세스를 모니터링하고 제어하며 외부 서비스를 제공하는 역할을 합니다. 예를 들어 Apache 자체는 데몬 프로세스로 이해될 수 있지만 실제로는 자주 업데이트되는 많은 프로세스로 구성됩니다(기본 프로세스는 고정되어 있음).
Crontab은 UNIX/Linux 예약 프로그램으로 Windows의 "예약 작업"과 약간 유사하며 특정 프로그램을 실행하기 위한 특정 시간 간격 또는 특정 시점을 설정합니다. 일반적으로 자동 업데이트를 완료하고, 임시 데이터를 지우고, 일정 기간에 한 번씩 자동으로 수행되는 기타 작업을 수행하는 데 사용됩니다.
또 다른 특별한 개념(특히 일반적인 시스템 개발에 익숙한 사람들을 위한)은 독립된 서버를 갖게 되면 자신도 모르게 시스템의 주인이 될 때 PHP가 제공할 수 있는 기능에만 국한될 필요가 없다는 것입니다. 이것을 깨닫기 위해 열심히 노력해야 합니다. 우리가 사용할 수 있는 것들이 많이 있습니다. PHP는 전능하지 않으며(확실히) 기능적 단점은 Perl로 완전히 보완될 수 있습니다. 일반 언어로서 Perl은 더 많은 기능적 옵션을 제공할 수 있으며 그 모듈은 투박하고 변태적인 언어로 끝이 없습니다. 에너지. PHP의 성능 결함은 C를 사용하여 보완할 수 있습니다. PHP의 기초는 C에서 상속되었습니다. PHP 자체도 C에서 개발되었습니다. C를 사용하여 PHP를 확장하는 것은 완전히 합리적입니다.
Linux 자체는 C와 Perl에 의해 지원됩니다(Perl의 상태를 과장하려는 것이 아닙니다. 표준 Linux에 얼마나 많은 Perl 스크립트가 있는지 볼 수 있고 Perl이 없으면 시스템이 장애인처럼 느껴지는지 확인할 수 있습니다). PHP는 대부분의 구문을 C에서 상속했으며 대부분의 웹 기능, 함수 및 Perl의 오픈 소스와 모순되는 "$" 기호를 배웠습니다(PHP는 초기에는 Perl 스크립트였습니다).
제가 사용하고 있는 코드 중 일부를 분석해 보겠습니다. (참고: Linux 독립형 서버에 적용됩니다. 오랫동안 Windows 및 가상 호스트에 대한 대규모 개발을 포기한 것 같습니다.) 익숙하거나, 익숙하지 않거나, 비정상적일 수 있는 몇 가지 방법을 사용합니다. 내 시스템은 RedHat AS3이며 특별한 것은 없습니다. PHP 버전은 4.4.0이고 MySQL은 4.1입니다. 나는 꼭 필요한 경우가 아니면 PHP5의 새로운 기능을 사용해야 하는 코드를 의도적으로 작성하지 않습니다.
내 웹 루트 디렉터리는 /www 아래에 있습니다. Apache와 PHP는 기본적으로 /usr/local/ 아래에 설치되며, MySQL은 다운로드되어 컴파일된 바이너리 버전이기도 합니다. 단지 테스트용이기 때문에 지저분해 보이지 않았으면 좋겠습니다. 특히, 서버가 여러 개인 경우에는 시스템을 잘 배포해야 합니다.
시스템의 구조를 보다 명확하게 하기 위해 사용하는데 필요한 모든 파일을 보조 디렉터리에 넣었습니다.
다음은 공통 헤더 파일 /includes/kernel/common.inc.php의 일부 조각입니다:
﹤?php
if (!definated('IN_BSG')) {
출구;
}
?﹥
위 코드는 합법적인 프로그램에서만 호출할 수 있고 다른 파일에는 포함되지 않도록 보장합니다. 실행 프로그램이 'IN_BSG' 상수를 정의하지 않은 경우에는 이 common.inc.php를 포함시킨 후 종료됩니다.
﹤?php
list($usec, $sec) = 폭발(" ", 마이크로타임());
$page_time_start = $usec + $sec;
?﹥
프로그램의 실행 시작 시간을 계산하는 데 사용되는 이 두 줄은 누구나 익숙할 것입니다. 프로그램이 종료되기 전에 이를 다시 계산하여 프로그램을 실행하는 데 걸린 시간을 알아냅니다. 이에 대해 신경 쓰지 않는다면 안전하게 주석을 달 수 있습니다.