PHP 프로그램의 가속화. Apache 속도를 높이는 방법: 정적 파일 제공 및 PHP 실행? FastCGI가 PHP 속도를 높이지 못하는 이유




모든 인터넷 리소스의 성공을 위한 주요 기준 중 하나는 작동 속도이며, 매년 사용자는 이 기준에 대한 요구가 점점 더 많아지고 있습니다. PHP 스크립트의 작동을 최적화하는 것은 시스템 속도를 보장하는 방법 중 하나입니다.

이 기사에서는 스크립트 최적화에 대한 팁과 사실 모음을 대중에게 소개하고 싶습니다. 이 컬렉션은 편집하는 데 꽤 오랜 시간이 걸렸으며 여러 소스와 개인적인 실험을 기반으로 합니다.

엄격한 규칙이 아닌 팁과 사실을 모아둔 이유는 무엇입니까? 내가 본 것처럼 "절대적으로 올바른 최적화"는 없기 때문입니다. 많은 기술과 규칙은 서로 모순되며 이를 모두 따르는 것은 불가능합니다. 안전과 편의성을 손상시키지 않으면서 사용할 수 있는 일련의 방법을 선택해야 합니다. 나는 추천하는 입장을 취했으므로 귀하가 따를 수도 있고 따르지 않을 수도 있는 조언과 사실이 있습니다.

혼란을 피하기 위해 모든 팁과 사실을 세 그룹으로 나누었습니다.

  • 애플리케이션 로직 및 구성 수준의 최적화
  • 코드 최적화
  • 쓸모없는 최적화

그룹은 조건부로 지정되며 일부 항목은 한 번에 여러 그룹에 귀속될 수 있습니다. 숫자는 평균 서버(LAMP)에 대한 것입니다. 이 기사에서는 다양한 타사 기술 및 프레임워크의 효율성과 관련된 문제를 다루지 않습니다. 이는 별도의 토론 주제이기 때문입니다.

애플리케이션 로직 및 구성 수준의 최적화

이 최적화 그룹과 관련된 많은 팁과 사실은 매우 중요하며 매우 큰 시간 이득을 제공합니다.

  • 코드 병목 현상을 식별하기 위해 서버(xdebug) 및 클라이언트(firebug)에서 코드를 지속적으로 프로파일링합니다.
    서버 자체에서 모든 서버 오류를 감지할 수는 없으므로 서버와 클라이언트 부분을 모두 프로파일링해야 한다는 점에 유의해야 합니다.
  • 프로그램에서 사용되는 사용자 기능의 수는 어떤 방식으로도 속도에 영향을 미치지 않습니다.
    이를 통해 프로그램은 수많은 사용자 정의 기능을 사용할 수 있습니다.
  • 맞춤형 기능을 적극적으로 활용하세요
    내부 함수 작업이 지역 변수를 통해서만 수행된다는 사실로 인해 긍정적인 효과가 달성됩니다. 이로 인한 효과는 사용자 정의 함수 호출 비용보다 큽니다.
  • PHP 확장의 형태로 타사 프로그래밍 언어로 "매우 무거운" 기능을 구현하는 것이 좋습니다.
    이를 위해서는 타사 언어에 대한 프로그래밍 기술이 필요하며 이로 인해 개발 시간이 크게 늘어나지만 동시에 PHP 기능을 넘어서는 기술을 사용할 수 있습니다.
  • 정적 HTML 파일 처리가 해석된 PHP 파일보다 빠릅니다.
    클라이언트에서의 시간 차이는 약 1초일 수 있으므로 정적 페이지와 PHP 도구로 생성된 페이지를 명확하게 구분하는 것이 합리적입니다.
  • 처리된(연결된) 파일의 크기는 속도에 영향을 미칩니다
    2KB마다 처리하는 데 약 0.001초가 소요됩니다. 이러한 사실로 인해 우리는 스크립트 코드를 프로덕션 서버로 전송할 때 스크립트 코드를 최소화해야 합니다.
  • require_once 또는 include_once를 항상 사용하지 마십시오.
    이 기능은 파일을 다시 읽을 수 있을 때 사용해야 하며, 그 외의 경우에는 require 및 include 를 사용하는 것이 좋습니다.
  • 알고리즘을 분기할 때 처리할 수 없는 구성이 있고 그 용량이 약 4KB 이상인 경우에는 include를 사용하여 포함하는 것이 더 최적입니다.
  • 클라이언트에서 전송된 데이터를 확인하는 것이 좋습니다.
    이는 클라이언트 측에서 데이터를 확인할 때 잘못된 데이터를 요청하는 횟수가 급격히 줄어들었기 때문이다. 클라이언트 측 데이터 검증 시스템은 주로 JS 및 엄격한 양식 요소(선택)를 사용하여 구축됩니다.
  • 클라이언트의 데이터 배열을 위한 대규모 DOM 구조를 구축하는 것이 좋습니다.
    이는 표시된 많은 양의 데이터로 작업할 때 매우 효과적인 최적화 방법입니다. 그 본질은 다음과 같이 요약됩니다. 데이터 배열이 서버에서 준비되어 클라이언트로 전송되고 DOM 구조의 구성이 JS 기능에 제공됩니다. 결과적으로 로드는 서버에서 클라이언트로 부분적으로 재분배됩니다.
  • AJAX 기술을 기반으로 구축된 시스템은 이 기술을 사용하지 않는 시스템보다 훨씬 빠릅니다.
    이는 출력 볼륨의 감소와 클라이언트의 로드 재분배로 인해 발생합니다. 실제로 AJAX를 사용하는 시스템의 속도는 2~3배 더 빠릅니다. 논평: AJAX는 버퍼 작업과 같은 다른 최적화 방법의 사용에 대해 여러 가지 제한 사항을 만듭니다.
  • 게시물 요청을 받으면 항상 무언가를 반환하세요. 어쩌면 공백도 반환하세요.
    그렇지 않으면 클라이언트에 몇 킬로바이트에 달하는 오류 페이지가 전송됩니다. 이 오류는 AJAX 기술을 사용하는 시스템에서 매우 일반적입니다.
  • 파일에서 데이터를 검색하는 것이 데이터베이스에서 검색하는 것보다 빠릅니다.
    이는 주로 데이터베이스 연결 비용 때문입니다. 놀랍게도 엄청난 비율의 프로그래머가 파일을 사용하는 것이 더 빠르고 편리하더라도 모든 데이터를 데이터베이스에 광적으로 저장합니다. 논평:검색되지 않는 파일에 데이터를 저장할 수 있습니다. 그렇지 않으면 데이터베이스를 사용해야 합니다.
  • 필요한 경우가 아니면 데이터베이스에 연결하지 마십시오.
    내가 모르는 이유 때문에 많은 프로그래머는 설정을 읽는 단계에서 데이터베이스에 연결하지만 나중에 데이터베이스에 쿼리를 수행하지 않을 수도 있습니다. 이는 평균 0.002초의 비용이 드는 나쁜 습관이다.
  • 동시에 활성 클라이언트 수가 적은 경우 데이터베이스에 대한 영구 연결을 사용합니다.
    시간적 이점은 데이터베이스 연결 비용이 부족하기 때문입니다. 시간차는 약 0.002초이다. 논평:사용자 수가 많은 경우 영구 연결을 사용하지 않는 것이 좋습니다. 영구 연결을 사용하는 경우 연결을 종료하는 메커니즘이 있어야 합니다.
  • 복잡한 데이터베이스 쿼리를 사용하는 것이 여러 개의 간단한 쿼리를 사용하는 것보다 빠릅니다.
    시간 차이는 여러 요소(데이터 볼륨, 데이터베이스 설정 등)에 따라 달라지며 1000분의 1초, 때로는 100분의 1초 단위로 측정됩니다.
  • DBMS 측에서 계산을 사용하는 것이 데이터베이스에 저장된 데이터에 대해 PHP 측에서 계산하는 것보다 빠릅니다.
    이는 PHP 측의 계산에는 데이터베이스에 대한 두 가지 쿼리(데이터 수신 및 변경)가 필요하기 때문입니다. 시간 차이는 여러 요소(데이터 볼륨, 데이터베이스 설정 등)에 따라 달라지며 1000분의 1초와 100분의 1초 단위로 측정됩니다.
  • 데이터베이스의 샘플 데이터가 거의 변경되지 않고 많은 사용자가 이 데이터에 액세스하는 경우 샘플 데이터를 파일에 저장하는 것이 좋습니다.
    예를 들어 다음과 같은 간단한 접근 방식을 사용할 수 있습니다. 데이터베이스에서 샘플 데이터를 가져와 직렬화된 배열로 파일에 저장하면 모든 사용자가 파일의 데이터를 사용합니다. 실제로 이 최적화 방법은 스크립트 실행 속도를 여러 배로 향상시킬 수 있습니다. 논평:이 방법을 사용할 때는 파일에 저장된 데이터를 생성하고 변경하는 도구를 작성해야 합니다.
  • memcached를 사용하면 거의 변경되지 않는 캐시 데이터
    시간 이득은 상당히 클 수 있습니다. 논평:캐싱은 정적 데이터에 효과적이며 동적 데이터의 경우 효과가 줄어들고 부정적일 수 있습니다.
  • 객체 없이(OOP 없이) 작업하는 것이 객체를 사용하여 작업하는 것보다 약 3배 빠릅니다.
    메모리도 더 많이 소모됩니다. 안타깝게도 PHP 인터프리터는 일반 함수만큼 빠르게 OOP를 사용할 수 없습니다.
  • 배열 차원이 클수록 작동 속도가 느려집니다.
    중첩된 구조를 처리하기 때문에 시간 낭비가 발생합니다.

코드 최적화

이러한 팁과 사실은 이전 그룹에 비해 속도가 미미하게 증가하지만 이러한 기술을 종합하면 시간을 상당히 늘릴 수 있습니다.

  • echo와 print는 printf보다 훨씬 빠릅니다.
    시간차는 수천분의 1초에 달할 수 있습니다. 이는 printf가 형식화된 데이터를 출력하는 데 사용되고 인터프리터가 전체 라인에서 그러한 데이터를 확인하기 때문입니다. printf는 서식이 필요한 데이터를 출력하는 데에만 사용됩니다.
  • echo $var."text"는 echo "$var text"보다 빠릅니다.
    이는 두 번째 경우의 PHP 엔진이 문자열 내부에서 변수를 찾아야 하기 때문입니다. 많은 양의 데이터와 이전 버전의 PHP의 경우 시간 차이가 눈에 띕니다.
  • 변수가 없는 문자열의 경우 echo "a"가 echo "a"보다 빠릅니다.
    이는 두 번째 경우 PHP 엔진이 변수를 찾으려고 하기 때문입니다. 대용량 데이터의 경우 시간 차이가 상당히 눈에 띕니다.
  • echo "a","b" 는 echo "a"."b" 보다 빠릅니다.
    쉼표로 구분된 데이터를 출력하는 것이 마침표로 구분하는 것보다 빠릅니다. 이는 두 번째 경우 문자열 연결이 발생하기 때문입니다. 대용량 데이터의 경우 시간 차이가 상당히 눈에 띕니다. 메모:이는 여러 줄을 인수로 사용할 수 있는 echo 함수에서만 작동합니다.
  • $return="a"; $return.="b"; 에코 $return; echo "a"보다 빠릅니다. 에코 "b";
    그 이유는 데이터를 출력하려면 몇 가지 추가 작업이 필요하기 때문입니다. 대용량 데이터의 경우 시간 차이가 상당히 눈에 띕니다.
  • ob_start(); 에코 "a"; 에코 "b"; ob_end_flush(); $return="a"보다 빠릅니다. $return.="b"; 에코 $return;
    변수에 접근하지 않고 모든 작업이 이루어지기 때문이다. 대용량 데이터의 경우 시간 차이가 상당히 눈에 띕니다. 논평:이 기술은 AJAX로 작업하는 경우에는 효과적이지 않습니다. 이 경우 데이터를 단일 문자열로 반환하는 것이 바람직하기 때문입니다.
  • "전문 삽입"을 사용하거나?> a b
    정적 데이터(외부 코드)는 PHP 출력보다 빠르게 처리됩니다. 이 기술을 전문적인 삽입이라고 합니다. 대용량 데이터의 경우 시간 차이가 상당히 눈에 띕니다.
  • readfile은 file_get_contents보다 빠르고, file_get_contents는 require보다 빠르며, 단일 파일에서 정적 콘텐츠를 출력하기 위한 require는 include보다 빠릅니다.
    빈 파일을 읽는 데 걸리는 시간은 readfile의 경우 0.001부터 include의 경우 0.002까지 다양합니다.
  • 해석된 파일의 경우 require가 include보다 빠릅니다.
    논평:알고리즘을 분기할 때 해석된 파일을 사용하지 않는 것이 가능한 경우에는 include 를 사용해야 합니다. require에는 항상 파일이 포함됩니다.
  • if (...) (...) else if (...) ()가 스위치보다 빠릅니다.
    시간은 지점 수에 따라 다릅니다.
  • if (...) (...) else if (...) ()는 if (...) (...)보다 빠릅니다. 만약에 (...) ();
    시간은 지점 수와 조건에 따라 다릅니다. 가능한 경우 else를 사용해야 합니다. 이는 가장 빠른 "조건부" 구성이기 때문입니다.
  • if (...) (...) else if (...) () 구문의 가장 일반적인 조건은 분기 시작 부분에 배치되어야 합니다.
    통역사는 조건이 충족될 때까지 구성을 위에서 아래로 검색합니다. 통역사가 조건이 충족되었다고 판단하면 나머지 구성을 살펴보지 않습니다.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    이는 두 번째 경우에는 반복할 때마다 sizeOf 작업이 실행되기 때문입니다. 실행 시간 차이는 배열 요소 수에 따라 다릅니다.
  • x = sizeOf($array); for($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    시간 차이는 상당하며 어레이가 증가함에 따라 증가합니다.
  • preg_replace는 ereg_replace보다 빠르고 str_replace는 preg_replace보다 빠르지만 strtr은 str_replace보다 빠릅니다.
    시간차는 데이터의 양에 따라 다르며 수천분의 1초에 이를 수도 있습니다.
  • 문자열 함수는 정규 표현식보다 빠릅니다.
    이 규칙은 이전 규칙의 결과입니다.
  • 메모리를 확보하는 데 더 이상 필요하지 않은 배열 변수를 제거합니다.
  • 오류 억제 사용을 피하세요 @
    오류 억제는 여러 가지 매우 느린 작업을 생성하며 재시도 비율이 매우 높을 수 있으므로 속도 손실이 상당할 수 있습니다.
  • if (isset($str(5))) (...) 는 if (strlen($str)>4)(...) 보다 빠릅니다.
    이는 문자열을 조작하기 위해 strlen 함수 대신 표준 isset 테스트 작업이 사용되기 때문입니다.
  • 0.5는 1/2보다 빠릅니다.
    그 이유는 두 번째 경우에는 나누기 연산이 수행되기 때문입니다.
  • 함수에서 변수 값을 반환할 때 return은 전역보다 빠릅니다.
    이는 두 번째 경우 전역 변수가 생성되기 때문입니다.
  • $row["id"]는 $row보다 빠릅니다.
    첫 번째 옵션은 7배 빠릅니다.
  • $_SERVER['REQUEST_TIME']은 스크립트 실행 시기를 결정하는 데 time()보다 빠릅니다.
  • if ($var===null) (...) 은 if (is_null($var)) (...) 보다 빠릅니다.
    그 이유는 첫 번째 경우에는 기능을 사용하지 않기 때문입니다.
  • ++i는 i++보다 빠릅니다. --i는 i보다 빠릅니다.--
    이는 PHP 코어의 기능으로 인해 발생합니다. 시간 차이는 0.000001 미만이지만 이러한 절차를 수천 번 반복하면 이 최적화를 자세히 살펴보세요.
  • 초기화된 변수의 증가분 i=0; ++나는; 초기화되지 않은 ++i보다 빠릅니다.
    시간차는 약 0.000001초 정도인데, 반복 가능성이 있기 때문에 이 사실을 기억해야 합니다.
  • 폐기된 변수를 사용하는 것이 새 변수를 선언하는 것보다 빠릅니다.
    아니면 다르게 표현하겠습니다. 불필요한 변수를 만들지 마십시오.
  • 지역 변수를 사용한 작업은 전역 변수를 사용한 작업보다 약 2배 빠릅니다.
    시간 차이는 0.000001초 미만이지만 반복률이 높기 때문에 로컬 변수를 사용하여 작업하는 것이 좋습니다.
  • 변수에 직접 액세스하는 것이 이 변수가 여러 번 정의된 함수를 호출하는 것보다 빠릅니다.
    함수를 호출하는 데는 변수를 호출하는 것보다 약 3배의 시간이 걸립니다.

쓸모없는 최적화

실제로 많은 최적화 방법은 스크립트 실행 속도에 큰 영향을 미치지 않습니다(시간 이득은 0.000001초 미만). 그럼에도 불구하고 이러한 최적화는 종종 논란의 대상이 됩니다. 앞으로 코드를 작성할 때 특별히 주의를 기울이지 않도록 이러한 "쓸모 없는" 사실을 제시했습니다.

  • echo는 print보다 빠릅니다.
  • include("절대 경로")는 include("상대 경로")보다 빠릅니다.
  • sizeOf가 count보다 빠릅니다.
  • foreach ($arr as $key => $value) (...)는 재설정($arr)보다 빠릅니다. while (list($key, $value) = Each ($arr)) (...) 연관 배열의 경우
  • 주석 처리되지 않은 코드는 파일을 읽는 데 추가 시간이 걸리기 때문에 주석 처리된 코드보다 빠릅니다.
    최적화를 위해 주석의 양을 줄이는 것은 매우 어리석은 일입니다. 작업("전투") 스크립트에서 최소화만 수행하면 됩니다.
  • 짧은 이름을 가진 변수는 긴 이름을 가진 변수보다 빠릅니다.
    이는 처리되는 코드의 양이 줄어들기 때문에 발생합니다. 이전 항목과 유사하게 작업("전투") 스크립트에서 최소화를 수행하면 됩니다.
  • 탭을 사용하여 코드를 표시하는 것이 공백을 사용하는 것보다 빠릅니다.
    이전 요점과 유사합니다.

마지막으로, 제가 제공한 팁과 사실은 절대적인 것이 아니며 적용의 중요성은 특정 상황에 따라 다르다는 점을 다시 한 번 상기시키고 싶습니다. 스크립트 최적화는 전체 최적화 절차의 작은 부분일 뿐이며 위의 팁 없이도 조용히 생활할 수 있는 경우가 많다는 점을 기억해야 합니다.


궁금한 점이 있으시면 당사를 이용해 보시기 바랍니다.

이 기사에서는 PHP 스크립트 처리 속도를 크게 향상시켜 호스팅 업체의 서버에서 불필요한 작업을 덜고 더 유용한 작업을 수행할 수 있는 몇 가지 팁을 제공하고 싶습니다.

큰따옴표 대신 작은따옴표를 사용하세요.

사실 큰따옴표로 묶인 텍스트는 프로세서에서 변수의 존재 여부와 니모닉 대체 항목(예: 텍스트에 개행 문자를 삽입하는 \n)을 검색합니다.

print("이것은 완전히 정상적인 텍스트이지만 PHP 프로세서는 출력하기 전에 변수 및 니모닉 대체를 검색합니다. 해당 줄이 충분히 길면 이 프로세스에는 상당한 시간이 걸립니다.");

텍스트가 작은따옴표로 묶인 경우 PHP 인터프리터는 텍스트에서 무언가를 찾을 생각조차 하지 않고 순종적으로 원래 형식으로 표시합니다. 이전 예보다 시간이 훨씬 적게 걸립니다.

print("PHP 프로세서는 작은 따옴표로 묶인 문자열을 보면 매우 기뻐할 것입니다. 그리고 어떻게 행복하지 않을 수 있습니까? 쓸데없는 작업을 수행할 필요가 없습니다!");

당연히 이 유형의 문자열은 함수뿐만 아니라 변수에서도 사용할 수 있습니다.

$string="이 줄을 다시 분석하지 않는다는 것은 얼마나 큰 축복입니까!";

변수를 따옴표로 묶지 마세요

비슷한 그림을 자주 볼 수 있습니다.

print("PHP 프로세서가 이 페이지를 처리하는 데 $time초가 걸렸습니다.");

이전 조언을 배웠고, 문자열에서 변수를 검색하고 해당 변수에 해당하는 문자열로 바꾸는 것보다 PHP 인터프리터가 문자열을 "접착"하는 것이 훨씬 쉽다는 것을 알고 있으므로 이전 예제를 추측하는 것은 어렵지 않습니다. 서버 자원을 비효율적으로 사용하는 예입니다. 이제 최적화된 스크립트로 서버를 기쁘게 해보겠습니다.

print("인생을 즐기고 있는 PHP 프로세서는 ".$time." 초 안에 이 스크립트를 처리했습니다.");

탱크에 있는 경우: 선은 점(.)을 사용하여 연결됩니다.

print("이 사이트의 주소는 http://".$_SERVER["HTTP_HOST"]."/!");

"이 사이트의 주소는 http://argon.com.ru/입니다!"라는 텍스트가 표시됩니다.

최소한의 변수 사용

모든 전역 변수는 스크립트가 실행되는 동안 메모리에 저장된다는 점을 항상 기억해야 합니다! 서버를 조롱하는 예로 다음 코드를 제공하겠습니다.

문제는 도대체 왜 우리가 추가 메모리를 차지하고 서버의 로드를 낭비해야 하는가입니다. 이런 식으로 수행하는 것이 훨씬 더 효율적입니다.

print("PHP 프로세서는 이와 같은 라인 출력을 즐깁니다.");

따라서 문자열이 두 번 미만으로 사용되는 경우 해당 문자열의 값을 변수에 할당하는 것은 해롭습니다.

짧은 변수 이름 사용

스크립트에서 이름이 너무 긴 변수를 사용하면 자연스럽게 서버의 부하가 늘어납니다.

$windows_xp_edition="프로페셔널";
$windows_xp_build="2600";
$windows_server2003_edition="표준";
$windows_server2003_build="3200";

그러나 너무 간결한 이름을 지정해서는 안됩니다. 앞으로 인상적인 크기의 대본을 편집할 때 애정 어린 단어가 아닌 제작자의 어머니를 백 번 기억하게 될 것입니다 :)

$ifa="전문";
$ifb="2600";
$ifc="표준";
시프드="3200";

가장 좋은 방법은 8자를 초과하지 않고 간결하면서도 이해하기 쉬운 이름을 제공하는 것입니다.

$wxped="전문";
$wxpbld="2600";
$ws2k3ed="표준";
Sws2k3bld="3200";

중첩된 함수 사용

이런 모습을 자주 보게 됩니다.

$string=str_replace("\n"," ",$string);
$string=str_replace("\r"," ",$string);
$string=트림($string);
$string=스트립슬래시($string);
$string=찹($string);
$string=substr($string,0,1024);
인쇄($string);

$string))))),0.1024));

동의합니다. 끔찍해 보이지만 생산성이 눈에 띄게 증가했습니다! 끝부터 시작해서 매번 변수에 해당 값을 대입하면 그런 일을 하는 것은 매우 쉽습니다...

내장 기능 사용

모든 특수 HTML 문자를 해당 니모닉 대체 문자로 바꾸는 스크립트의 간단한 예를 들어 보겠습니다.



$string=str_replace("<","<",$string);
$string=str_replace(">"",">",$string);
인쇄($string);

이 코드를 사용하면 동일한 결과를 얻을 수 있습니다.

print(htmlspecialchars($string));

보기에도 좋고, 무게도 가벼우며, 특히 긴 문자열을 처리할 때 서버의 부하를 크게 줄여줍니다.

또 하나의 예입니다. 이 스크립트를 사용하면 텍스트 파일의 내용을 배열로 읽을 수 있습니다.

$fp=fopen("database.txt","r");
while($array=fgets($fp,1024));
fclose($fp);

하지만 PHP에는 똑같은 일을 하지만 훨씬 더 빠르게 수행하는 매우 유용한 내장 file() 함수가 있습니다!

파일("database.txt");

결론: PHP 함수 참고서를 다시 한 번 살펴보는 데 게으름을 피우지 마십시오. 나는 당신과 서버의 삶을 더 쉽게 만들어 줄 많은 도구를 찾을 수 있을 것이라고 확신합니다.

자신만의 기능을 사용하세요

정확히 동일한 알고리즘을 사용하여 여러 라인을 처리해야 하는 경우가 종종 있습니다. 경험이 없는 프로그래머들이 하는 일이죠..

print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ", $string1))))),0,1024));
print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ", $string2))))),0,1024));

그리고 경험이 있는 사람들은 더 간단한 길을 택할 것입니다.

함수 형식(&$string)(

}
인쇄(형식($string1));
인쇄(형식($string2));

이렇게 하면 서버 로드를 최소화하면서 동일한 작업을 여러 번 수행할 수 있습니다.

불필요한 기능을 만들지 마세요

예를 들어, 경험이 풍부한 프로그래머가 자신에게 필요한 내장 함수가 있는지 잊어버리거나 심지어 알지 못한다면 스스로 쉽게 작성할 수 있습니다.

함수 최적화(&$string)(
$string=str_replace("&","&",$string);
$string=str_replace(""",""",$string);
$string=str_replace("<;","<",$string);
$string=str_replace(">"",">",$string);
}
print(최적화($string));

하지만 더 간단한 방법으로 극복할 수 있습니다.

print(htmlspecialchars($string);

불필요한 기능을 사용하지 마세요

비효율적인 코드의 예는 다음과 같습니다.

print("나의 삼촌");
print("가장 정직한 사람들을 강탈했습니다...");

하지만 매우 쉽게 최적화할 수 있습니다.

print("내 삼촌 "."가장 정직한 규칙...");

차이점을 느끼시나요? 저를 믿으세요. 이 경우 호스팅 업체는 확보된 서버 리소스에 대해서만 감사할 것입니다...

기능을 현명하게 사용하세요

예를 들어, 이 스크립트입니다.

print(ereg_replace("정상","불만족",$string));

전혀 필요하지 않은 정규식 처리 알고리즘(POSIX)을 활성화합니다. 그리고 서버에 훨씬 더 많은 부하가 걸립니다. 그러나 탐식적인 기능을 자원에 대한 욕심이 적은 기능으로 대체하면 운명을 완화할 수 있습니다.

print(str_replace("불행","행복",$string));

핸들러를 너무 잡아당기지 마세요

PHP 코드 태그 외부에 포함된 모든 내용은 PHP 프로세서에 의해 처리되지 않고 단순히 변경되지 않고 전송되는 것으로 알려져 있습니다. 어떤 사람들은 이렇게 사용합니다.

...페이지 헤더...
인쇄($제목);
?>
…항해…

?>
...페이지 바닥글...

그러나 PHP 처리 모드를 시작하고 종료하면 이 모드를 사용할 때보다 서버가 더 많이 로드됩니다.

print("...페이지 헤더...".$title."...탐색...");
include("동적 콘텐츠");
print("...페이지 바닥글...");
?>

계속됩니다

지금까지 나는 PHP 최적화 빙산의 아주 작은 부분만을 다루었습니다. 한 가지 조언을 따른다고 해서 생산성이 눈에 띄게 향상되지는 않을 수도 있지만, 이러한 모든 기본 프로그래머 공손 규칙을 함께 따르면 서버의 부하가 크게 줄어들고 권한이 높아집니다.

질문이나 제안사항이 있으시면 연락주시기 바랍니다.

최적화에 행운이 있기를 바랍니다!

전용 인터넷 채널이 표준이 된 요즘에는 페이지 크기에 대해 너무 걱정할 필요가 없습니다. 그러나 여전히 주목할 가치가 있습니다. 서버의 로드를 줄이고 HTTP 요청 수를 줄이려는 경우 이를 위한 몇 가지 기술이 있습니다. 이 튜토리얼에서는 여러 가지 PHP 트릭(캐싱, 압축)을 다룹니다.

1. PHP를 사용하여 CSS 파일 병합.

웹 개발자로서 우리는 보다 논리적인 구조를 만들고 나중에 쉽게 수정하기 위해 스타일을 여러 스타일 시트로 분할하는 경우가 많습니다. 그러나 이로 인해 서버에 대한 요청 수가 증가하여 페이지 로딩 속도가 느려집니다. PHP를 사용하면 일석이조의 효과를 얻을 수 있습니다. 여러 스타일 시트를 갖고 단 하나의 쿼리를 사용하여 모두 액세스할 수 있습니다.

준비

CSS 파일을 최적화하기 전에 작동하려면 스타일이 필요합니다. 몇 가지 스타일 파일을 만들어 보겠습니다.

// 메인.css
// 예를 들어 CSS

몸 (
너비: 800px;
여백: 0 자동;
색상: 회색;
}

#래퍼(
여백 상단: 30px;
배경: url(../images/cats.png);
}
// 타이포그래피.css
// 예를 들어 CSS

몸 (
글꼴 모음: Arial, san-serif;
글꼴 두께: 굵게;
}

강한 (
글꼴 크기: 120%;
}
//forms.css
// 예를 들어 CSS

형태(
위치: 상대;
상단: 400px;
Z-색인: 99;
}

입력(
높이: 50px;
너비: 400px;
}

모든 파일의 내용을 추출하고 특정 순서로 결합해야 합니다. 이는 우리 스크립트가 URL 매개변수를 통해 스타일 시트의 이름을 수신하고 이러한 파일을 열고 연결해야 함을 의미합니다.

//변수 정의
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// 파일 배열을 가져옵니다.


foreach ($files를 $key => $file로) (
}

$cssData = "";
foreach($files를 $file로)(

fclose($fileHandle);
}
}
// 브라우저에 CSS 파일이 있음을 알립니다.
if (isset($cssData)) (
에코 $cssData;
) 또 다른 (
}
?>

//변수 정의
// --- 참고: 경로에는 후행 슬래시가 필요합니다 ---
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// 파일 배열을 얻었습니다!

//파일 이름에 무서운 문자가 없는지 확인합시다 :) .
foreach ($files를 $key => $file로) (
$files[$key] = str_replace(array("/", "\\", "."), "", $file);
}

이 코드는 스타일 폴더의 경로를 설정하고 파일을 확인합니다. 폴더 경로는 폴더 이름의 시작과 끝에 슬래시가 있어야 합니다. 그렇지 않으면 오류가 많이 발생합니다. 다음으로 각 파일 이름을 확인하고 점 및/또는 슬래시를 제거합니다.

$cssData = "";
foreach($files를 $file로)(
$css파일이름 = $cssPath . $file. ".css";
$fileHandle = fopen($cssFileName, "r");

$cssData .= "\n" . fread($fileHandle, 파일 크기($cssFileName));
fclose($fileHandle);
}
}

이제 파일에서 공통 스타일 시트를 만들어야 합니다. 이를 위해 파일 배열을 순회하는 루프를 실행하고 각 파일을 열어 단일 파일로 결합합니다. "\n"은 질서와 청결을 위해 새 줄을 추가합니다. filesize() 함수는 파일의 길이를 알아내고 이를 fread()에 전달하는 데 사용됩니다.

// 브라우저에 CSS 파일이 있음을 알립니다.
header("콘텐츠 유형: 텍스트/css");
if (isset($cssData)) (
에코 $cssData;
echo "\n\n// 생성됨: " . 날짜("r");
) 또 다른 (
echo "// 파일을 사용할 수 없거나 파일이 지정되지 않았습니다.";
}
?>

코드의 마지막 부분은 모든 스타일을 브라우저에 전달합니다. 이는 CSS 정보를 전달하고 있으며 PHP가 이에 대해 브라우저에 알려야 함을 PHP에 알려야 함을 의미합니다. header() 함수를 사용하여 이를 수행하고 Content-type: text/css를 설정합니다. 다음으로 CSS를 클라이언트에 전달합니다. 하지만 그 전에 파일에 CSS 스타일이 있는지 확인합니다. 존재하지 않으면 CSS 파일 이름이 전송되지 않았음을 의미합니다. 파일이 있으면 파일을 전송하고 세대에 대한 메시지를 추가합니다.

시험

이제 스크립트를 테스트할 차례입니다. 폴더와 파일을 만듭니다. 아래 폴더 구조를 살펴보세요. 다른 구조가 필요한 경우 경로를 변경하는 것을 잊지 마십시오.

이제 모든 파일을 사이트 루트에 업로드하고 브라우저를 통해 index.php 파일에 액세스하세요. "파일을 사용할 수 없거나 파일을 지정하지 않았습니다."(파일을 사용할 수 없거나 지정하지 않음)라는 문구가 표시됩니다. 이는 연결해야 하는 파일의 이름을 지정하지 않았음을 의미합니다. 그러나 좋은 소식은 모든 것이 오류 없이 작동한다는 것입니다. 브라우저에 "index.php?q=main"을 입력해 봅시다. main.css 파일의 내용이 화면에 나타납니다. 여러 파일을 검색하여 병합해야 하는 경우 "index.php?q=main&q=forms" 요청을 보내야 합니다. 보시다시피 "q="를 원하는 만큼 반복할 수 있습니다. 최소 50개의 스타일 시트를 하나의 파일로 결합할 수 있습니다.

결론

이 방법은 매우 유용할 수 있으며 많은 장점이 있습니다. 전체 사이트에 대한 공통 스타일시트를 가질 수 있고, 예를 들어 양식이 있는 페이지에 대해서는 별도의 스타일시트를 가질 수 있습니다.

경고: index.php 파일을 CSS 폴더가 아닌 임의의 폴더에 배치하는 경우 index.php가 스타일시트인 것처럼 배경 이미지에 대한 상대 경로를 작성해야 합니다. 이것이 브라우저가 생각하는 것입니다.

2. HTML 및 CSS에서 빈 줄 제거

우리 중 많은 사람들이 코드를 작성할 때 빈 줄을 많이 사용합니다. 좋은 소식 - PHP의 빈 문자열은 브라우저에 전달되지 않습니다. 그러나 HTML로 전송됩니다.

빈 회선은 소량의 트래픽을 소비합니다. 사이트 트래픽이 높으면 이 작은 수치가 중요한 수치로 커질 수 있습니다. 그리고 여기서 PHP가 우리를 도울 것입니다.

준비

다음은 HTML 및 CSS 파일에 대한 코드입니다.

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


안녕하세요 페이지입니다!






로렘 입숨 돌...



몸 (
최소 높이: 800px;
배경: 검정색;
글꼴 크기: 18px;
}
#래퍼(
너비: 960px;
여백: 20px 자동;
패딩: 15px;
}
#헤더 h1 (
텍스트 들여쓰기: -99999em;
배경: url(../images/header.png);

디스플레이: 블록;
너비: 100%;
높이: 48px;
}
#본체 (
글꼴 두께: 굵게;
}

이 스크립트의 장점은 HTML과 CSS를 동시에 사용할 수 있다는 것입니다. 스크립트는 파일을 로드하고 모든 빈 줄을 제거하고 단어가 하나의 전체로 결합되지 않도록 공백을 1개만 남깁니다.

$fileDirectory = "";
$file = $_GET["q"];
$ext = $nameExplode;

//해커 확인
die("해커들...!");
) 또 다른 (
//시작하자


//정규표현식의 놀라운 점

fclose($handle);
//데이터 출력
if ($ext == "css") (
header("콘텐츠 유형: 텍스트/css");
}
에코 $newData;
}
?>

코드의 각 부분에 대한 자세한 내용

파일 이름을 얻고 해당 유형을 확인합니다. 다음으로 모든 데이터를 추출하고 공백과 빈 줄을 제거합니다. 이 방법은 가장 원시적이며 모든 빈 줄을 제거하지는 않지만 대부분을 처리합니다. 그리고 이것은 단지 몇 줄의 코드일 뿐입니다.

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = 폭발(".", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $파일;

이 코드는 필요한 변수를 설정합니다. 다시 말하지만, "q"를 통해 모든 데이터를 전달합니다. 파일의 폴더도 여기에 정의됩니다.

If ($ext != "css" AND $ext != "htm" AND $ext != "html") (
//해커 확인
die("해커들...!");
) 또 다른 (

여기서는 파일이 실제로 CSS인지 HTML인지 확인합니다.

//시작하자
$handle = fopen($fileName, "r");
$fileData = fread($handle, 파일 크기($fileName));
//정규표현식의 놀라운 점
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($handle);
//데이터 출력
if ($ext == "css") (

header("콘텐츠 유형: 텍스트/css");
}
에코 $newData;
}
?>

이 코드는 파일을 열고 읽은 다음 가능한 한 많은 빈 공간을 제거합니다. 이는 정규식을 사용하여 달성됩니다. 모든 공백, 탭 및 빈 줄을 찾아서 공백으로 대체합니다.

작동합니까?

브라우저에 "index.php?q=css.css"를 입력하면 CSS 한 줄이 표시됩니다. 그래서 모든 것이 작동합니다! 해당 페이지의 소스코드를 열어보면 같은 그림을 보실 수 있습니다. 이 방법을 사용하여 314자 CSS 파일을 277자로 줄였습니다. 528~448자의 HTML 파일입니다. 15줄의 코드로는 나쁘지 않습니다.

결론

이는 단 몇 줄의 코드로 어떻게 많은 일을 할 수 있는지 보여주는 훌륭한 예입니다. Google과 같은 사이트의 소스 코드를 보면 거의 빈 줄이 없다는 것을 알 수 있습니다.

3. PHP 스크립트 캐싱.

위의 예를 사용하여 스크립트에 대한 캐싱을 설정하는 방법을 보여 드리겠습니다. 목표는 사이트 속도를 높이는 것입니다. 요점은 매우 간단합니다. 사이트에 액세스할 때마다 데이터가 생성되지는 않습니다. 캐시에 저장됩니다.

캐싱을 추가하려면 스크립트에 세 가지를 추가해야 합니다. 먼저, 모든 데이터를 스크립트로 수집하고 이 입력된 데이터 세트에 고유한 파일을 생성해야 합니다. 둘째, 캐시 파일을 찾아 그것이 얼마나 최근인지 확인해야 합니다. 셋째, 나중에 사용할 수 있도록 캐시된 복사본을 사용하거나 새 캐시 파일을 생성해야 합니다.

자세한 내용은

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = 폭발(".", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $파일;
//-- 여기에 캐시 파일 이름을 생성하기에 충분한 데이터가 있습니다. --
if ($ext != "css" AND $ext != "htm" AND $ext != "html") (
//악한 사람을 확인하세요...
die("해커들...!");
) 또 다른 (

//-- 여기에서 캐시된 버전을 가로채서 확인할 수 있습니다. --

//업무를 시작하자
$handle = fopen($fileName, "r");
$fileData = fread($handle, 파일 크기($fileName));
//이제 정규식 마법을 사용해보세요!
$newData = preg_replace("/\s+/", " ", $fileData);

Fclose($핸들);
//데이터를 출력하는 시간입니다.

//-- 이제 필요한 경우 새 데이터를 저장하고 데이터를 출력할 수 있습니다. --

If ($ext == "css") (
header("콘텐츠 유형: 텍스트/css");
}
에코 $newData;
}
?>

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = 폭발(".", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $파일;
$cacheName = "./cache/" . $nameExplode. $nameExplode. ".tmp";
if ($ext != "css" AND $ext != "htm" AND $ext != "html") (
//해커
print_r($ext);
die("해커들...!");
) 또 다른 (
if (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (


fclose($cacheHandle);
$isCached = 참;
) 또 다른 (
//시작하자
$handle = fopen($fileName, "r");
$fileData = fread($handle, 파일 크기($fileName));
//정규표현식의 놀라운 점
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($handle);
//은닉처


fclose($cacheHandle);
$isCached = 거짓;
}
//데이터 출력
if ($ext == "css") (
header("콘텐츠 유형: 텍스트/css");
if ($isCached) (

}
) 또 다른 (
if ($isCached) (
에코 "";

}
}
에코 $newData;

설명

이 스크립트에는 24시간마다 캐시를 ​​업데이트하는 기능이 추가되었습니다. 편안해요. 사이트에서 무언가를 변경한 경우 24시간을 기다리거나 캐시를 지울 수 있다고 가정해 보겠습니다.

$cacheName = "./cache/" . $nameExplode. $nameExplode. ".tmp";

이 코드 조각은 파일 이름과 확장자를 가져와서 함께 붙인 다음 올바른 확장자 ".tmp"로 캐시에 추가합니다.

If (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (
$cacheHandle = fopen($cacheName, "r");
$newData = fread($cacheHandle, 파일 크기($cacheName));
fclose($cacheHandle);
$isCached = 참;
) 또 다른 (

여기서는 저장된 캐시가 있는지, 지난 24시간 이내에 생성되었는지 여부를 확인합니다(값은 초 단위이며 다른 값으로 변경할 수 있음). 두 조건이 모두 충족되면 파일을 열고 내용을 추출하여 스크립트 결과를 해당 내용으로 바꿉니다. 또한 마지막에 추가 메시지를 인쇄하려면 $isCached를 true로 설정합니다.

//캐시하자!
$cacheHandle = fopen($cacheName, "w+");
fwrite($cacheHandle, $newData);
fclose($cacheHandle);
$isCache = 거짓;
}

향후 호출에 사용하기 위해 스크립트 결과를 캐시합니다. 쓰기 모드에서 파일을 열고 거기에 정보를 덤프한 다음 닫으면 됩니다.

//데이터를 출력하는 시간입니다.
if ($ext == "css") (
header("콘텐츠 유형: 텍스트/css");
if ($isCached) (
echo "// 캐시 파일에서 검색했습니다.\n";
}
) 또 다른 (
if ($isCached) (
에코 "";
}
}

스크립트의 이 부분은 작업 결과를 볼 수 있도록 약간 수정되었습니다. 파일 내용이 캐시에서 검색된 경우 이에 대한 메시지를 추가할 수 있습니다.

해보자

스크립트를 다시 사용하면 페이지를 새로 고칠 때까지 변경 사항이 표시되지 않습니다. 아래에는 파일이 캐시에서 가져온 비문이 표시됩니다.

결론

스크립트에 간단한 캐싱을 빠르게 추가하는 방법을 안다면 올바른 방향으로 가고 있다는 의미입니다. 캐싱이 포함된 스크립트는 모든 서버의 로드를 크게 줄여줍니다.

요약하자면

이번 강의에서는 PHP를 사용하여 웹사이트 속도를 높이는 몇 가지 편리하고 간단한 방법을 보여 드렸습니다.

대규모 프로젝트를 개발할 때 프로젝트 코드를 최적화하는 문제는 점차적으로 발생합니다. 즉, 메모리 소비가 얼마나 정당한지, 작성된 PHP 코드의 실행 속도를 어떻게 높일 수 있는지입니다. 처음에 많은 사람들은 작성된 코드의 정확성과 효율성에 대해 생각하지 않고 원칙에 따라 작성합니다. 작동하면 괜찮습니다. PHP 인터프리터는 PHP 코드 실행 속도가 상당히 빠르고, PHP 외부에서 코드 실행을 느리게 만드는 병목 현상이 많지만, PHP 코드 최적화도 중요하므로 코드 최적화는 코딩 과정 초기에 적용해야 합니다.

대부분의 PHP 스크립트는 간단한 작업을 수행합니다. 스크립트의 표준 동작은 사용자로부터 소량의 정보를 다운로드하고, 데이터베이스나 파일에서 일부 정보를 검색하고, 적절한 HTML을 출력하고, 그 결과를 클라이언트에 보내는 것입니다. 여기에서 가장 먼저 이해해야 할 것은 성능, 확장 용이성, 사용되는 서버 리소스 양 감소, 데이터 전송 시간 감소 등 최적화의 결과가 정확히 무엇인지입니다. 후자의 경우 모든 중요한 영역을 찾는 것뿐만 아니라 최적화의 균형도 맞춰야 합니다.

간단한 예를 들어보겠습니다. 100MB의 여유 RAM이 있는 서버에 두 개의 스크립트가 있다고 가정해 보겠습니다. 그 결과는 동일합니다. 첫 번째 스크립트는 최대 성능에 최적화되어 있으며 10MB의 메모리가 필요하며 파일을 완전히 읽어서 파일에서 데이터를 받습니다. 두 번째 스크립트는 최소한의 메모리 소비에 최적화되어 있으며 5MB의 메모리가 필요하며 동일한 파일에서 부분적으로 데이터를 받습니다. 한 번의 요청으로 인해 첫 번째 스크립트가 두 번째 스크립트보다 빠르게 실행되지만 동시에 10개 이상의 요청이 있는 경우 두 번째 스크립트의 속도가 빨라집니다. 왜 이런 일이 발생합니까? 첫 번째 스크립트에서 병목 현상은 메모리 리소스 사용이고, 두 번째 스크립트에서는 I/O 시스템의 기능입니다. 첫 번째 스크립트가 사용 가능한 RAM을 모두 사용한 후 시스템은 가상 메모리 사용으로 전환되며 동일한 I/O 시스템은 이 구성표의 추가 병목 현상이 됩니다.

물론 이 예는 크게 단순화되었으며 RAM 외에도 다른 병목 현상이 있지만 주요 아이디어는 한 사례에 대한 최적화가 다른 경우에 중요한 포인트가 될 수 있다는 것입니다. 예시에서는 낮은 부하에서 약간의 속도 향상을 위한 최적화 결과, 높은 부하에서 스크립트 실행 속도가 크게 감소했습니다. 따라서 더 나은 수익을 얻으려면 진정으로 관심을 가질 만한 영역을 최적화하는 데 에너지를 소비하는 것이 중요합니다.

여기서는 운영 체제 최적화, 서버 설정 최적화 등을 고려하지 않겠습니다. 왜냐하면... 대부분의 웹마스터는 호스팅을 사용하므로 모든 것을 스스로 설정할 수는 없습니다. 여기서는 PHP 코드 최적화만 고려됩니다. 각각의 특정 경우에 일부 유형의 최적화는 유용하고 다른 유형은 시간과 노력을 낭비한다는 점에 유의해야 합니다. 코드 개선의 이점은 무시할 수 있는 경우가 많습니다. 아마도 시간이 지남에 따라 PHP의 내부 변경으로 인해 성공적인 최적화가 쓸모없거나 심지어 해로울 수도 있습니다.

다음은 PHP 5 버전의 주요 성능 단계입니다.

RAM 소비를 최적화하기 위한 조치:

  1. 기능의 결과를 분석하십시오. 함수를 작성하기 전에 표준에 해당하는 함수가 있는지 확인하세요.
  2. 전역 범위에서만 사용되는 큰 배열이나 객체가 완료되면 메모리를 해제합니다(로컬 범위에서는 메모리가 자동으로 해제됩니다). 기능을 참고해주세요 설정되지 않음()범위에서 변수를 제거하고 개체에 대한 다른 참조가 없는 경우에만 개체가 차지한 메모리를 해제합니다. 변수에 값 할당 없는이 개체에 대한 참조가 아직 있는지 여부에 관계없이 항상 개체를 파괴하고 개체가 차지한 메모리를 해제합니다. 이 경우 변수는 범위에서 제거되지 않습니다. 실제로 변수에는 정의되지 않은(0) 값이 포함되므로 이 변수의 내용(약 72바이트)에 대한 메모리를 차지합니다.
  3. OOP(객체 지향 프로그래밍) 사용의 정당성을 분석합니다. 객체지향 코드를 작성하기 전에 스스로에게 두 가지 질문을 던져보세요. "이것이 객체지향 접근 방식이 필요한가?" 그리고 “객체 지향 코드를 작성할 수 있나요?” 예를 들어, 클래스 내부에 정적 함수를 정의하면 해당 함수를 포함하는 데 필요한 메모리 양이 10-18% 증가합니다. 클래스 대신 배열을 구조로 사용하면 메모리가 절약됩니다. 함수를 클래스 메서드로 구현하는 것보다 단순히 별도의 파일에 함수를 넣는 것이 더 유리할 수 있습니다.
  4. 클래스에서 메서드의 정적 버전을 구현할 가능성을 분석합니다. 메소드가 매개변수를 사용하지 않는 경우 $this이면 키워드를 사용하여 선언해야 합니다. 공전.

코드 실행 속도를 높이는 조치:

  1. SQL 쿼리 최적화 분석. 대부분의 프로젝트에서 가장 큰 성능 향상을 제공하는 것은 SQL 쿼리 최적화입니다.
  2. 출력 버퍼링과 다양한 캐싱 모듈을 사용하면 성능을 25%~100% 향상할 수 있습니다.
  3. 변수, 함수, 상수 및 클래스에 더 짧은 짧은 이름을 사용하면 성능이 최대 20% 향상될 수 있습니다. 동시에 추가 코드 지원을 잊지 마십시오. 코드를 수정할 때 명확한 함수 이름이 훨씬 더 편리합니다.
  4. 변수 존재 확인(함수 isset()) 그녀에게 연락하기 전에. @를 사용하여 존재하지 않는 변수에 액세스할 때 발생하는 오류를 억제하는 것은 성능에 큰 타격을 줍니다.
  5. "작은따옴표"를 사용하면 코드를 더 빠르게 해석할 수 있습니다. "큰따옴표"의 경우 문자열 내부에서 변수를 검색합니다.
  6. 루프에서 "추가" 기능을 제거할 가능성을 분석합니다. 예를 들어, 함수 교체 세다()루프 시작 전에 계산되고 이 함수의 결과를 포함하는 변수에 대한 표현식 for($i=0; $i 이 주기의 성능이 향상됩니다. 그렇지 않으면 기능 세다()루프가 반복될 때마다 호출되어 실행됩니다.
  7. 연산자 사용 사례여러 구성을 사용하는 대신 다른 경우라면.
  8. 배열 필드에 대한 명시적 액세스를 사용합니다. 형태의 반전 $배열["ID"]반전보다 7배 더 빠르게 실행 $배열. 또한 이는 스크립트를 추가로 지원하는 동안 오류를 방지합니다. 언젠가 이름이 붙은 상수가 있을 수도 있습니다. ID.
  9. 루프에서 다차원 배열을 처리할 때 최종 배열에 대한 참조가 포함된 추가 변수를 사용합니다. 사이클 속도를 높이려면 for($i = 0; $i< 5; $i++) $a["b"]["c"][$i] = func($i); , 루프가 시작되기 전에 다음 명령을 작성할 수 있습니다 $item =p$a["b"]["c"]다음과 같이 루프를 다시 작성하십시오. for($i = 0; $i< 5; $i++) $ref[$i] = $i; .
  10. Apache mod_gzip 및 mod_deflate 모듈을 사용하면 트래픽을 줄여 페이지 로딩 속도를 높일 수 있습니다.

다음 코드 최적화 단계는 반복적으로 사용될 때만 성능을 향상시킵니다.

  1. 용법 +$나는대신에 $i++주기에서는 성능이 6% 향상됩니다.
  2. "큰따옴표"를 사용하여 변수를 연결합니다. 양식의 지시 $s="$s1$s2$s3"보다 빠르게 해석됨 $s=$s1.$s2.$s3. 이 진술은 세 개 이상의 변수에 대해서만 적용됩니다.
  3. 지침에서 전체 경로 사용 포함하다그리고 필요하다실제 경로를 찾기 위해 시스템을 검색하는 데 소요되는 시간을 줄일 수 있습니다.
  4. 더 이상 필요하지 않은 데이터베이스에 대한 열려 있는 연결을 닫습니다. 동시에 동일한 데이터베이스에 여러 번 연결하면 안 됩니다.
  5. 교체 타당성 분석 포함하다()그리고 include_once()~에 필요하다()그리고 require_once()각기.
  6. 상당한 양의 정적 행(코드 결과를 포함하지 않음)을 출력하는 대신 HTML 삽입을 코드에 사용합니다. 일반적으로 정적 페이지(HTML)를 발행하는 속도는 PHP로 작성된 페이지를 발행하는 것보다 몇 배 빠릅니다. 하지만 여기서 너무 흥분해서는 안 됩니다. 왜냐면... 인터프리터를 PHP 처리 모드로 시작하고 종료하면 서버도 로드됩니다.
  7. 기능 교체 가능성 분석 preg_replace그리고 str_replace일부 경우에. 기능 str_replace보다 빠르게 작동 preg_replace, 그리고 동시에 기능 strtr더 빠른 기능 str_replace. 또한 문자열 함수를 사용하여 strncasecmp, strpbrk그리고 스트라이프정규식을 사용하는 것보다 더 최적입니다. 그러나 이러한 함수를 중첩하는 대신 정규식 함수를 사용해야 합니다.
  8. 명시적 변수 초기화를 사용합니다. 예를 들어, 초기화되지 않은 변수의 증가는 이전에 초기화된 변수보다 9-10배 느립니다. 또한 변수를 명시적으로 초기화할 때 오류가 줄어듭니다.
  9. 결론적으로 디자인 활용에 주목하고 싶습니다. 에코, 함수 대신 인쇄, 생산성이 눈에 띄게 증가하지 않습니다.
  • 스크립트 실행 시작 시간을 결정하려면 현재 시간을 반환하는 함수 대신 다음을 사용하는 것이 좋습니다. $_SERVER["REQUEST_TIME"].
  • 프로파일러를 사용하여 코드의 중요한 섹션을 식별합니다.

코드 성능을 최적화하기 전에 데이터베이스에 대한 SQL 쿼리 최적화를 확인하고, http 쿼리를 최적화하고, js 및 css 크기를 줄이고, 템플릿 캐싱에 대해 생각한 다음, 그 후에만 코드 성능 테스트를 시작하는 것이 좋습니다.

좋은 프로그래밍 스타일에는 나중에 구멍을 패치하는 것보다 코드를 작성하는 동안 최적화하는 것이 포함됩니다.

나는 전체 httpd.conf를 연구했고, 하이로드에 대한 여러 가이드를 파헤쳤습니다. (그들은 오래되었고 "불필요한 모듈 비활성화"와 같은 모호한 조언이 포함되어 있습니다.
속도를 위해 Apache에서 비활성화해야 하는 첫 번째 모듈 중 하나는 .htaccess 파일에 대한 지원입니다. 이 지원 자체는 성능을 추가하지 않으며 이러한 파일의 존재는 더욱 그렇습니다.
1) 모든 VPS에는 VIP 관세가 적용되어도 일부 불쌍한 호스팅보다 느린 소위 "강력한" 프로세서가 있습니까?
아니요, 아마도 개인적으로 일종의 형편없는 VPS 호스트가 있거나 더 나쁜 경우 "OpenVZ, 우리는 판매된 리소스를 재판매하지 않습니다... 음, 아마도 10번 정도는 재판매하지만 더 이상 재판매하지 않습니다."와 같은 관세가 있을 수도 있습니다.
2) 이러한 상황에서 FastCGI가 도움이 될까요?
FastCGI는 PHP의 작동 모드이며 직접적으로 성능에 큰 영향을 미치지 않습니다. 또한 FastCGI에 소켓이 사용되므로 FCGI 작동 자체의 논리(Apache-FCGI와 Apache-mod_php를 비교하는 경우)가 느려집니다. 서버 "내부"에서 PHP 인터프리터를 직접 작동하는 대신 네트워크 통신을 의미하는 상호 작용("일반" 또는 유닉스 소켓). 다른 것이 도움이 될 것 같아요(아래에서 설명하겠습니다).
3) eAccelerator(AST 캐싱 등)와 같은 기능이 인기가 없는 이유는 무엇입니까?
왜 인기가 없는지, 그런 통계는 어디서 얻는지 모르겠습니다... 하지만 eAccelerator가 도덕적으로나 물리적으로 시대에 뒤떨어진 것이 사실일 수 있습니다. 예를 들어 그런 진부한 기사를 믿는다면(아니요, 저는 그렇지 않습니다. "Bitrix"와 같은 "걸작" CMS에서는 작동하지 않습니다. 이것은 내 마음에 떠오른 eAccelerator에 대한 첫 번째 언급일 뿐입니다. - 5.3 이상의 PHP 버전에서는 작동하지 않습니다.
그들 중 많은 수가 버려지는 것을 알고 있지만 이는 원인이 아니라 결과입니다.
귀하가 결과를 명시하지 않았기 때문에 이에 대해 논평할 수 없습니다. 정확히 무엇입니까? 즉, 이 말씀이 무슨 뜻인지 잘 이해가 되지 않습니다.
4) 또 무엇이 도움이 될까요?
음, 바로 메모리에서(옵션이 서로 관련되지 않을 수 있음):
1. Apache에서 .htaccess 지원 거부 또는 최소한 그 수 감소
2. 정적 데이터를 제공하기 위해 Nginx를 프런트 엔드 서버로 설치
3. 일반적으로 Apache를 완전히 포기하고 Nginx+FCGI로 전환(생각하지 마십시오. 구성의 유연성과 충분한 기능 때문에 Apache를 정말 좋아합니다. 또 다른 질문은 실제로 이러한 유연성이 필요한 사람은 거의 없으며 이를 유능하게 수행할 수 있는 사람은 거의 없다는 것입니다. , 효율적이고 완벽하게 구성... 이 점에서 Nginx는 훨씬 더 간단할 것입니다. 왜 FCGI인가? Nginx가 PHP와 상호 작용할 수 있는 다른 방법을 모르기 때문에 FCGI 풀을 설정하는 것이 필수입니다.
4. OpCache - 버전 5.5부터 "스파클"이 내장되어 있으므로 활성화하고 구성하는 것이 좋습니다. CMS 상황이 어떤지, 사이트에서 CMS를 사용하고 있는지는 모르겠지만, 경험상 PHP 프레임워크의 속도는 평균 8~20배 정도 빨라졌습니다.
5. 대안으로 HHVM
6. 확인:
a) 문제는 실제로 PHP에 있습니다. 특히 요청이 지속된 기간, 데이터베이스, 요청 수 등과 같은 모든 서버 로그를 수집하는 것이 좋습니다.
b) 디스크 하위 시스템의 속도를 확인하는 중... 손가락질은 안 하겠지만, 한때 인기 있는 한 호스팅 업체에서 꽤 많은 양의 VPS를 빌렸는데 어느 순간 디스크의 평균 속도가 느려지는 것을 발견했습니다. 하위 시스템 하위 시스템 - 1.4Kbytes/초. 약 50%의 경우에 "실패"(일명 "블록 쓰기 불가능")가 발생했습니다... 이는 오래 지속되지 않았지만 몇 달 후에 동일한 호스터가 "일반 HDD"의 관세는 어떤 이유로 "고속 SSD"의 관세보다 더 빠른 디스크 하위 시스템을 가졌습니다... 결론을 내릴 수 있습니다...
c) 프로세서의 실제 속도를 확인하십시오. 속도가 느린 프로세서와 상당히 다른 경우가 많습니다.

추신 질문을 더 정확하게 공식화하시면, 물론 필요한 경우 더 정확한 추천을 드릴 수 있을 것입니다 :)

추신 문제를 "정면"으로 해결할 수 있는 옵션이 있는데, 이는 아마도 가장 어렵고 여러 경우에 가장 생산적일 것입니다. 이것은 Varnish + 미세 조정으로 캐시(RAM)에서 나노초 단위로 대부분의 페이지를 검색할 수 있으며 때로는 분당 수천 개의 요청을 처리할 수 있으며 이는 단순한 코드 캐싱이나 그와 유사한 것이 아닙니다. .. 이는 전체 페이지 및/또는 서버 응답을 캐싱하는 것입니다. 무엇보다도 "백엔드를 전혀 건드리지 않는" 것을 허용합니다. 페이지를 요청할 때 데이터베이스에 대한 호출이 없을 수도 있고 서버 측에서 동일한 PHP(또는 기타) 코드가 실행될 수도 없습니다. 꽤 많은 미세 조정이 필요하며 "CMS의" 사이트, 프레임워크의 사이트에는 적합하지 않습니다. 처음에는 개발에 대한 올바른 접근 방식과 무엇을 어떻게 캐시해야 하는지에 대한 생각이 필요합니다. 잘못된 접근 방식을 사용하면 작동할 가능성이 가장 높지만 원하는 만큼 빠르지는 않으며 사이트의 일부가 정상적으로 작동하지 않을 수도 있습니다. 다른 해결책도 있지만 질문의 다소 일반적인 공식을 고려하면 이에 대해 이야기하기가 매우 어렵습니다.

아, 예, 중요한 세부 사항을 잊어버렸습니다... "호스팅" 회사는 왜 Apache를 사용하고 이를 (완전히) 포기하지 않습니까? 더 큰 범위에서는 Apache를 사용하면 .htaccess를 통해 일부 설정을 사용자에게 위임할 수 있기 때문입니다. 동시에 정적 애플리케이션의 경우 동일한 Nginx인 경우가 많습니다. 아시다시피 Nginx는 이러한 방식으로 일부 설정을 사용자에게 위임하는 것을 허용하지 않으므로 이러한 작업에 적합하지 않습니다. (Apache와 달리) 이것에 대해 "미끄러지지" 마십시오. 이러한 이유로 우리는 99%의 "호스팅"을 포기했습니다(Apache가 존재하고 이를 제거하거나 직접 구성할 수 없기 때문에). 이러한 접근 방식과 함께 제공되는 "브레이크").