문제

온라인 게임을 위해 우리는 테마별로 그룹화된 수많은 PHP 클래스와 함수를 파일과 폴더에 작성했습니다.결국 우리는 이제 우리가 호출하는 파일 세트에 모든 백엔드 코드(로직 및 DB 액세스 레이어)를 갖게 되었습니다. 라이브러리 다음을 사용하여 GUI(웹 페이지, 프리젠테이션 레이어)에 라이브러리를 포함합니다. include_once('pathtolib/file.inc').

문제는 우리가 포함에 게을러서 대부분의 include 문이 libs 파일 내부에서 작성되어 각 웹페이지에서 libs 파일을 포함할 때마다 실제로 전체 libs를 파일별로 로드한다는 것입니다.

이는 성능에 상당한 영향을 미칩니다.그러므로 가장 좋은 해결책은 무엇입니까?

  • libs 파일에서 모든 include 문을 제거하고 웹 페이지에서 필요한 것만 호출하십시오.
  • 다른 일을 하시나요?

서버는 클래식 LAMP 스택(PHP5)을 사용합니다.

편집하다:우리는 간단한 함수(기존 이유와 대부분의 코드)와 클래스를 혼합했습니다.따라서 자동 로드로는 충분하지 않습니다.

도움이 되었습니까?

해결책

  • 필요한 경우에만 모든 포함을 수동으로 관리
  • include_path를 있어야 할 곳으로만 ​​설정하세요. 기본값은 .:/usr/lib/pear/:/usr/lib/php와 같습니다. 있어야 할 곳만 지정하세요. php.net/set_include_path
  • 자동 로드를 사용하지 마십시오. 속도가 느리고 APC 및 이에 상응하는 캐시 작업이 훨씬 더 어려워집니다.
  • APC에서 "stat" 작업을 끌 수 있지만 파일을 업데이트할 때마다 수동으로 캐시를 지워야 합니다.

다른 팁

객체 지향 방식으로 프로그래밍을 수행했다면 다음을 사용할 수 있습니다. 자동 로드 호출할 때 필요에 따라 소스 파일에서 클래스를 로드하는 함수입니다.

편집하다:누군가가 자동 로딩을 언급하는 두 답변을 모두 다운보트한 것으로 나타났습니다.우리가 틀렸나요?성능 목적으로 사용하기에는 __autoload 함수의 오버헤드가 너무 높습니까?이 기술에 대해 내가 깨닫지 못하는 것이 있다면 그것이 무엇인지 정말 알고 싶습니다.

정말 하드 코어를 얻으려면 정적 분석을 수행하고 언제 필요한 라이브러리가 무엇인지 정확히 파악하고 해당 라이브러리만 포함하십시오.

당신이 사용하는 경우 include 그리고는 아니다 include_once, 그러면 거기에서도 약간의 속도가 절약됩니다.

Zend Optimizer에 대한 Matt의 답변은 실제로 그렇습니다.원한다면 opcode 캐시인 APC(Advanced PHP Cache)를 무료로 사용해 보세요.PECL 저장소에 있어야 합니다.

spl_autoload_register() 또는 __autoload()를 사용하여 클래스에 필요한 파일을 포함하는 데 필요한 모든 규칙을 만들 수 있지만 자동 로드에는 자체 성능 오버헤드가 발생합니다.php.ini 설정이나 Apache 구성을 사용하여 사용하는 모든 내용이 모든 GUI 페이지 앞에 추가되는지 확인해야 합니다.

일반 함수가 포함된 파일의 경우 유틸리티 클래스로 래핑하고 간단한 찾기 및 바꾸기를 수행하여 모든 function() 호출을 util::function()으로 대체하면 이러한 함수를 자동 로드할 수 있습니다. (역시 전역 함수가 아닌 메서드를 호출하는 데 오버헤드가 발생합니다).

본질적으로 가장 좋은 방법은 코드를 다시 살펴보고 포함 문제를 해결하여 디자인 빚을 갚는 것입니다.이는 가장 큰 성능상의 이점을 제공하며 eAccelerator, Zend Platform 및 APC와 같은 최적화 프로그램을 최대한 활용할 수 있게 해줍니다.

다음은 동적으로 항목을 로드하는 샘플 방법입니다.

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

당신이 찾고 있는 것은 자동 맵 PECL 확장.

기본적으로 미리 계산된 지도 파일을 로드하는 데 드는 약간의 오버헤드만으로 자동 로드가 가능합니다.특정 디렉토리가 특정 PHP 파일에서만 가져오는 것을 알고 있는 경우 맵 파일을 하위로 나눌 수도 있습니다.

그것에 대해 더 자세히 읽을 수 있습니다. 여기.

PHP를 사용한지 꽤 됐는데 이런 경우에는 Zend Optimizer나 Cache가 도움이 되어야 하지 않을까요?PHP는 여전히 모든 요청에 ​​대해 포함된 모든 파일을 다시 로드하고 컴파일합니까?

자동 로딩이 답인지 잘 모르겠습니다.이러한 파일이 포함된 경우 이를 포함하는 클래스에 필요할 수 있으므로 어쨌든 자동 로드됩니다.

PHP가 각 페이지 로드 시 라이브러리를 구문 분석할 필요가 없도록 바이트 코드 캐시(이상적으로는 APC)를 사용하십시오.자동 로드를 사용하면 바이트 코드 캐시 사용의 이점이 무효화된다는 점에 유의하세요. 여기).

사용 프로파일러.측정값 없이 최적화하려고 하면 맹목적으로 작업하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top