2016-07-23 2 views
1

나는 PHP에 익숙하며 모든 절차가있는 웹 사이트 프로젝트를 상속 받았다. (파일 검색시 어디에서나 함수 정의조차도 존재하지 않는다.). 나는 C# 및 Java 세계에서 온 것입니다. 나는 점진적으로 OOP를 추가하는 방법을 찾고있다. (그들은 내가 프론트 엔드를 업데이트하기를 원하고, 동시에 백엔드를 수정하도록 설득하려고 노력하고 있으며 프레임 워크 (dammit)를 사용하고 싶지 않습니다.)PHP - 오토로더 구현, 모든 클래스를 미리로드

오토로더를 보면서 ... 음, 여기 내 이해가있다. 이것은 클래스가 저장된 폴더를 등록하는 방법이며, 클래스, 특성 등을 인스턴스화 할 때 클래스/파일 이름/네임 스페이스를 기반으로 폴더를 검색하고 적절한 정의를로드합니다.

가 자동 로더 폴더를 검색하고 모든 페이지 수명주기에 적절한 정의를로드 (또는 그들을 캐시 않음)을 수행합니다

나는 몇 가지 질문이?

사전로드 : 은 자동 로더, 또는 대안을 사용하는 방법이 있나요, 메모리에 모든 클래스 정의로드를 사전에 모든 세션에서이를 사용할 수?

그렇다면 클래스 파일을 업데이트 할 때 클래스 파일을 변경하면이 메커니즘으로 메모리에 모든 것을 다시로드하라는 것을 어떻게 알 수 있습니까? 질문에 대한

UPDATE :

가 귀하의 답변 주셔서 모두 감사하고 조금 도움이되지만 ... I에 유래에 대한 잘못된 질문 (들) 포즈의 나쁜 버릇을해야합니까.

피하고자하는 것은 클래스를 추가하여 페이지 속도를 줄이는 것입니다. 그래서 라이브러리를 추가하고 오토로더로 경로를 등록한다고합시다. 페이지는 여러 종속성이있는 클래스를 인스턴스화합니다. 종속성 그래프에 15 개의 파일이 있다고 가정 해 보겠습니다. 각 요청주기마다 서버는 한 페이지에 15 개의 다른 파일과 페이지를로드합니다.

컴파일 된 언어에서 왔기 때문에 이러한 클래스를 메모리에로드하지 않는 것이 조금 이상합니다. 모든 수업은 5MB를 넘지 않아야합니다.

(아니면 그냥 심볼릭 링크를 램 디스크를 만들고 부팅 거기에 모든 파일을 복사 만해야합니까?)

+0

필자는 [PHP-FIG : Autoloader] (http://www.php-fig.org/psr/psr-4/)와 [Composer] (https://getcomposer.org)를 살펴볼 것입니다. /doc/01-basic-usage.md)를 다운로드하십시오. – ldg

+0

나는이 길로 갈 필요가 있다고 생각한다. https://en.wikipedia.org/wiki/List_of_PHP_accelerators –

+0

@PaulPerrick 링크를 제공해 주셔서 감사합니다. 내 배포 설정에 대해 생각하게 만듭니다. – BeetleJuice

답변

0

아무도 내가 무엇을 찾고 있었는지 알 수는 있지만 가장 좋은 방법은 PHP 5.5 이상에 미리 설치된 OptCache (내 클라이언트는 5.3을 사용하므로 그것에 대해 알지 못했습니다)입니다.

https://github.com/zendtech/ZendOptimizerPlus

젠드 OPcache 젠드 OPcache는 오피 캐싱 및 최적화를 통해 빠른 PHP 실행을 제공

. 사전 컴파일 된 스크립트 바이트 코드를 공유 메모리에 저장하여 PHP 성능을 향상시킵니다. 이렇게하면 디스크의 코드를 읽고 나중에 액세스 할 때 컴파일하는 단계가 제거됩니다. 에 더하여, 코드 실행을 더 빠르게 수행 할 수있는 바이트 코드 최적화 패턴을 적용합니다.

1

난 당신이 자동 로딩의 목적을 오해 할 수있다 생각합니다. PHP가 인식하지 못하는 클래스를 코드에서 호출 할 때 수행 할 작업에 대한 지침입니다. 그게 전부 야. 오토로더는 PHP가 클래스를 볼 수 있도록 requires /path/to/classfile을 호출합니다.

오토로더는 폴더를 검색하고 모든 페이지 수명주기에 적절한 정의 을로드합니까 (또는 캐시합니까?)?

요청에 따라 캐싱이 없으므로 파일을 변경하면 다음 http 요청에 이러한 변경 사항이 통합됩니다. 에 전 부하, 자동 로더를 사용하는 방법, 또는 어떤 대안이 모든 클래스 정의를 : 그것은 당신이 echo 2

사전 로딩에 예를 변화 echo 1를 들어, 스크립트에서 다른 명령을 변경 것처럼입니다 메모리를 늘리고 모든 세션에서 을 사용할 수있게 하시겠습니까?

필요하지 않습니다. 잘 쓰여진 오토로더는 수업을 어디서 찾을 수 있는지에 대한 지침이 있으므로 가능한 모든 수업을 미리로드하는 것은 낭비입니다. undefined classes 오류가 계속 발생하면 오토로더를 개선하거나 현재의 로더 지침에 따라 클래스 파일을 배치해야합니다.

모든 클래스를 미리로드하려면php.iniauto_prepend_file 설정을 사용하십시오. The docs say

자동으로 초기화 스크립트에 기본 파일

설정이 전에 해석 될 파일의 ​​이름을 지정합니다. 그 스크립트에는 다음과 같은 것이 있습니다 :

//put all your class files in this folder 
$dir = '/path/to/classes/folder'; 
$handle = opendir($dir); 

//require all PHP files from classes folder 
while (false !== ($item = readdir($handle))){ 
    $path = $dir.'/'.$item; 
    if(is_file($path) && pathinfo($path,PATHINFO_EXTENSION)==='php') 
     require_once $path; 
} 

이것은 단순화되었습니다. 어떤 디렉토리의 모든 파일을 스크립트에 포함시키는 것만 큼 위험 할 수 있으므로이 작업을 수행하지 않을 것입니다. 하위 디렉토리에 파일을 포함 시키려면이 설정을 조정해야합니다.

기본적으로 do not do. 그냥 좋은 오토로더를 가지고.

1

PHP의 자동 로더는 게으르다. PHP가 알지 못하는 클래스의 사용을 발견하면, 등록 된 오토로더 (또는 오토로더 체인)에게 그것을 찾도록 요청할 것입니다. 클래스가 정의 된 파일을 가져올 위치를 파악하여 포함시키는 것은 오토로더의 작업입니다. 클래스 이름을 지정하고 클래스 파일을 구성하기위한 일종의 컨벤션을 갖는 것은 유용한 오토로더를 갖추는 데 핵심적이며 PHP 커뮤니티에서는 PSR-4과 같은 몇 가지 규칙이 생겨났습니다.

오토로더는 폴더를 검색하고 모든 페이지 수명주기에 적절한 정의를로드합니까 (또는 캐시합니까?)?

자동 로더는 모든 요청에 ​​대해 호출되지만, 자동로드가 필요할 때만 호출됩니다.

사전로드 : 자동 로더 또는 일부 대체 방법을 사용하여 모든 클래스 정의를 메모리에 미리로드하고 모든 세션에서 사용할 수있게 할 수 있습니까?

나는 그렇게 생각하지 않지만, 클래스 수가 증가함에 따라 점점 더 많은 낭비가된다.

에 오신 것을 환영합니다. 레거시 PHP 세계는 Modernizing Legacy Applications In PHP을 확인하는 것이 좋습니다. 그것은 모르도르에서 샤이어로 돌아 가기위한 전략 지침과 같습니다.