PHP용 고성능 자동 로더

13910 단어 phphighperformance
PHP 5.6 이상 버전의 Autolodon e라이브러리에 대한 예제 코드입니다.
도서관
https://github.com/EFTEC/autoloadone
샘플 소스 코드
https://github.com/EFTEC/autoloadone-example
우리는 왜 이 도서관이 필요합니까?
  • 고성능 라이브러리입니다.그것은 속도와 메모리 사용에 최적화되었다.
  • 특별한 구성이 필요하지 않습니다.그것은 거의 모든 항목에 적용된다.
  • 표준, PSR-0 PSR-4 또는 그 어떠한 것도 필요하지 않습니다.그러나 그것은 호환된다.

  • 무엇이 자동 장탄기입니까?


    다음 예를 보도록 하겠습니다.
    $obj=new \example\folder\SomeClass();
    
    이 클래스를 실행하려면 코드를 사용해서 포함해야 합니다.
    include __DIR__'/folder/SomeClass.php';
    $obj=new \example\folder\SomeClass();
    
    그러나 어떤 클래스가 다른 클래스를 호출하거나 우리가 더 많은 클래스를 호출한다면?그리고 우리는 반드시 수동으로 그것을 포함해야 한다.include를 여러 번 호출하면 시스템이 실패할 수 있습니다.우리는 include_를 한 번 사용하는 것을 피할 수 있지만, 모든 문제를 해결할 수는 없습니다.
    자동 로더를 사용할 때, 필요할 때만 파일을 불러옵니다.
    include 'autoload.php';
    $obj=new \example\folder\SomeClass();
    
    Composer의 자동 로드는 다음 정책을 사용합니다.그것은 작곡가에 의존한다.json은 이름 공간을 설정하고 만듭니다.그러나 이것은 우리의 코드가 PSR-0 또는 PSR-4라는 엄격한 준칙을 따르도록 요구한다.
    include 'vendor/autoloader.php';
    $obj=new \example\folder\SomeClass();
    
    
    작곡가와json
    "autoload": {
      "psr-4": {
        "example\\folder\": "example/folder/",
    
    그러나 이 자동 로드기는 다음과 같은 작업을 수행합니다.
  • 그것은 도서관을 포함한다.자동 로더의 유형에 따라 다른 라이브러리도 포함됩니다.
  • 작성할 때 불러오는 그룹을 읽습니다.실행됨 json.이 수조는 약간의 이상한 최적화가 있지만, 호출할 때마다 연결을 한다.언제 불러요?고객이 매번 요청할 때마다!
  • return array(
        '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
    
    이것은 $vendorDir와 연결되어 있으며, 요청마다 x 클래스가 실행됩니다.일반적인 Laravel 프로젝트에서는 +600회라고 불린다.
  • 파일을 호출하는 정책은 다르다.
  • 이것은 요청에 따라 호출되기 때문에 시스템의 성능에 영향을 줄 수 있다.예를 들어 한 고객이 이 사이트에 전화를 걸면 9개의 aax 전화를 걸면 10개의 요청을 하고 있다.
    Autolodone의 작동 방식은 다릅니다.
  • 우선 어떤 작곡가도 사용하지 않는다.json.
  • 정보를 한 번 이상 컴파일하고 결과를 4개 변수에 저장해야 합니다. 하나는 이름 공간 = > 경로 관계, 다른 하나는 이름 공간 = > 파일 이름 관계입니다.
  • 세 가지 방법만 포함하기 때문에 PHP는 다른 PHP 파일과 클래스를 불러올 필요가 없습니다.
  • Autolodone의 정보는 다음과 같이 간단하게 저장됩니다.
    'example\folder' => '/folder',
    
    따라서 인코딩도 하지 않고 상대 폴더를 계산할 때도 없습니다.그러나 그것도 별도의 최적화가 있다.수동으로 편집할 수 있습니다.
    폴더가 여러 번 사용되면 메모리를 절약하기 위해 복구할 수 있습니다.
    $array=[]'example\folder2\Class1' => '|1|',
    'example\folder2\Class2' => '|1|'...];
    
    // And in another array
    
    $array=[1 => '/folder2/MultipleClasses.php'];
    
    클래스 example\folder2\Class1을 호출하려면 두 번째 그룹을 읽고 전체 경로를 만듭니다.이 변환은 요청 클래스에서만 실행되기 때문에 이 클래스를 호출하지 않으면 성능에 해를 끼치지 않습니다.

    PSR-0


    강제적
  • 완전히 제한된 명칭 공간과 클래스는 다음과 같은 구조를 가져야 한다
  • 각 네임스페이스에는 최상위 수준의 네임스페이스(공급업체 이름)가 있어야 합니다.
  • 각 네임스페이스에는 여러 개의 하위 네임스페이스가 있습니다.
  • 파일 시스템에서 로드할 때 각 이름 공간 구분자는 DIRECTORY_구분자로 변환됩니다.
  • 클래스 이름의 모든 문자는 디렉터리 구분자로 변환됩니다.문자는 이름 공간에 특별한 의미가 없습니다.
  • 완전히 제한된 명칭 공간과 클래스의 접미사는.파일 시스템에서 불러올 때 php를 사용합니다.
  • 공급업체 이름, 네임스페이스 및 클래스 이름의 알파벳 문자는 소문자와 대문자의 조합이 될 수 있습니다.
  • PSR-4

  • '클래스'란 클래스, 인터페이스, 특징과 기타 유사한 구조를 가리킨다.
  • 전체 한정 클래스 이름은 다음과 같습니다.
  •     \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    
  • 완전히 한정된 클래스 이름은 반드시 최고급 명칭 공간 이름을 가지고 있어야 하며'공급업체 명칭 공간'이라고도 부른다.
  • 완전히 한정된 클래스 이름은 하나 이상의 하위 이름 공간 이름을 가질 수 있다.
  • 완전 한정 클래스는 반드시 종지 클래스를 가지고 있어야 한다.
  • 밑줄은 클래스 이름을 완전히 제한하는 어떤 부분에서도 특별한 의미가 없다.
  • 클래스 이름의 알파벳 문자는 소문자와 대문자의 임의의 조합이 될 수 있다.

  • 모든 클래스 이름은 대소문자를 구분하는 방식으로 인용해야 합니다.
  • 완전히 제한된 클래스 이름에 해당하는 파일을 로드할 때...
  • 완전히 제한된 클래스 이름 ("네임스페이스 접두사") 에서 하나 이상의 선행자 이름공간과 서브네임스페이스 이름 (선행자 이름공간 구분자 제외) 의 연속 시퀀스는 최소한 "기본 디렉터리"에 해당합니다.
  • 이름공간 접두사 뒤에 있는 연속 하위 이름공간 이름은 기본 디렉터리의 하위 디렉터리에 해당합니다. 여기서 이름공간 구분자는 디렉터리 구분자를 나타냅니다.하위 디렉토리 이름은 하위 이름공간 이름의 대소문자와 일치해야 합니다.

  • 종료 클래스 이름은 .php 로 끝나는 파일 이름에 대응합니다.파일 이름은 종료 클래스의 대소문자와 일치해야 합니다.
  • 자동 로드 프로그램은 이상을 일으켜서는 안 되고 그 어떠한 단계의 오류를 일으켜서는 안 되며 값을 되돌려주어서는 안 된다.
  • Autolodone 회사


    PSR-0, PSR-4, 이름 공간, 다른 폴더, 심지어 클래스가 없는 모든 경우에 적용됩니다.PSR-4를 사용하는 경우 즉시 사용할 수 있습니다.

    어떻게 시작합니까?


    1) 라이브러리를 다운로드하거나 composer를 통해 포함합니다.


    Autolodone 파일을 다운로드할 수 있습니다.php
    https://github.com/EFTEC/autoloadone
    composer를 통해 설치할 수도 있습니다.

    composer require eftec/autoloadone


    이 라이브러리는 의존 관계가 없기 때문에 모든 폴더에 다운로드하여 복사할 수도 있습니다.

    2) 프로젝트 루트 디렉토리에 다음 파일 만들기


    <?php
    
    // if true then it also include files with autoloader
    define('_AUTOLOAD_COMPOSERJSON',true);
    // we include our library manually
    include 'vendor/eftec/autoloadone/AutoLoadOne.php';
    

    3) 웹 페이지로 실행



    이 코드는 폴더를 스캔하여 클래스, 인터페이스, 구조, 간단한 PHP 파일을 추가하고 저장할 정보가 있는지 수집합니다.프로젝트의 규모에 따라 시간이 걸릴 수 있습니다.새 PHP 파일을 추가할 때마다 같은 폴더의 새 클래스가 아닌 다른 클래스와 같은 이름 공간을 사용해야 합니다.

    4) 우리 교실을 소모한다.


    이것은 autoload라는 파일을 생성합니다.php, 이것은 우리의 자동 불러오는 것입니다.
    우리는 그것을 이렇게 부를 수 있다.
    <?php
    include 'autoload.php';
    
    이렇게

    어떻게 사용합니까?


    우선, 이 생성기나 자동 캐리어는 특정한 구조 폴더를 필요로 하지 않고, 심지어는 작곡가를 편집할 필요도 없다.json.이 라이브러리는composer를 무시합니다.json.

    간단한 폴더와 클래스


    📁 폴더/SomeClass.php
    namespace example\folder;
    
    class SomeClass
    {
    }
    
    다음 클래스를 가정하면 클래스의 이름은 파일(SomeClass.php)의 이름(SomeClass)과 같습니다.우리는 어떻게 이런 것을 자동 캐리어에 추가합니까?클래스가 루트 폴더에 있으면 이미 포함되어 있습니다.
    라이브러리가 자동으로 불러오는 동안 다음 줄을 생성합니다.php
    $arrautoload = [
        'example\folder' => '/folder'..]
    
    이름공간 예시\폴더로 클래스를 보려면 폴더라는 폴더를 볼 것이라고 합니다.

    여러 클래스를 포함하는 간단한 PHP 파일


    왜 우리는 여러 종류의 파일을 포함해야 합니까?때때로 프로젝트의 업무 논리나 우리가 프로젝트의 파일 수를 줄이기를 원하기 때문에 우리는 엄격한 결합된 파일이 필요하다.
    📁 2/MultipleClasses 축소php
    namespace example\folder2;
    
    class Class1 {
    
    }
    
    class Class2 {
    
    }
    
    Autolodone은 다음과 같이 모든 클래스를 이 파일에 저장합니다.
    $arrautoloadCustom = [
       'example\folder2\Class1' => '/folder2/MultipleClasses.php',
       'example\folder2\Class2' => '/folder2/MultipleClasses.php'...
    
    이것은 두 개의 폴더를 포함하는 간단한 파일이기 때문에 자동 불러오는 것을 포함한다.php는 단순 클래스와 다르다.클래스 "example\folder2\Class1"을 호출하면 파일 "/folder2/MultipleClasses"를 호출합니다.php 등등.

    여러 개의 PHP 파일, 각 파일에 하나의 클래스가 있고 같은 폴더와 네임스페이스를 공유합니다.


    📁 폴더 3/고객.php
    namespace example\erp;
    class Customer
    {
    }
    
    📁 폴더 3/직원.php
    namespace example\erp;
    class Employees
    {
    }
    
    Autolodone은 이름 공간을 폴더와 연결시키기 때문에 효과적인 작업 방식입니다.
    $arrautoload = [
       'example\erp' => '/folder3',
    

    We don't need to run AutoLoadOne again if we add a new class in the same folder and in the same namespace.


    우리 루트 폴더 이외의 라이브러리입니다.


    가시화 인터페이스 (웹) 에서 다른 폴더 (상대 또는 절대 경로) 에서 라이브러리를 사용하는 것을 포함하여 많은 설정을 설정할 수 있습니다

    이 예에서 우리는 상대 경로를 사용할 것이다.
    📁 루트 폴더 <--우리의 루트 폴더
    📁 외부 프로젝트/somefolder/ClassExternal.php<--우리가 포함하고 싶은 클래스.
    Autolodone 관심 추가
    $arrautoload = [
       'external\somenamespace' => '../externalproject/somefolder'
    

    클래스가 아닌 PHP 파일을 추가합니다.


    클래스 없이 PHP 파일을 추가하고 실행할 수도 있습니다.이를 위해, 우리는 파일의 모든 부분에 주석을 추가해야 한다.
    /** @autorun */
    
    Autolodone 관심 추가
    @include __DIR__.'/noclasses/noclass.php';
    
    그것은 직접 파일을 포함한다.

    우선 순위가 있는 비클래스 PHP 파일을 추가합니다.


    이 시스템은 우선 순위가 있는 파일을 포함할 수 있도록 합니다.이를 위해, 우리는 파일의 모든 부분에 이 주석을 추가해야 한다
    /** @autorun first */
    
    그것은 일반적인 자동 운행 전에 호출된다.

    네임스페이스와 폴더는 포함되지 않습니다.


    이 라이브러리에서는 폴더 및/또는 네임스페이스를 사용하여 파일을 제외할 수도 있습니다.
    예를 들어, 이 라이브러리는composer 클래스를 자동으로 만듭니다.우리는 그것을 삭제함으로써 약간의 메모리를 절약할 수 있다.우리는 폴더나 이름 공간을 통해 삭제할 수 있다
    'ComposerAutoloaderInit18396353ba4e6f59a571a2e69914dd47' => '|2|real.php',
    'Composer\Autoload\ComposerStaticInit18396353ba4e6f59a571a2e69914dd47' => '|2|static.php'
    

    좋은 웹페이지 즐겨찾기