2010-05-05 7 views
4

모든 중요한 기능을 이제는 1800 줄의 단일 PHP 파일에 포함하도록 코드를 디자인했습니다.1800 라인 PHP 포함 속도를 높이려면 어떻게해야합니까? 페이지로드 속도가 10 초 /보기로 느려집니다.

간단한 "require_once ("codeBank.php ")"로 다른 PHP 파일 (예 : AJAX 프로세서)에서 호출합니다.

몇 가지 글로벌 배열과 많은 다른 기능이 포함되어 있어도 모든 기능을로드하는 데 약 10 초가 걸리는 것으로 나타났습니다. 예를 들어, 주요 AJAX 프로세서 코드는 간단한 구문 확인 (codeBank.php에 작동 기능이 저장 됨)을 수행하는 데 8 초 밖에 걸리지 않습니다.

require_once를 주석 처리 할 때 내 AJAX 응답 시간이 10 초에서 40ms로 빨라지므로 PHP가 1800 줄의 함수로 무언가를하려하고 있음을 분명히 알 수 있습니다. APC가 설치되어 있어도 놀랍습니다.

내 코드 속도를 100 밀리 초로 낮추려면 어떻게해야합니까? 캐시의 이점을 어떻게 든 얻지 못하고 있습니까? 단일 기능 뱅크 파일을 다른 부분으로 잘라야합니까? 응답 시간을 망칠 수있는 다른 미묘한 일이 있습니까?

PHP 작업이 스피드 충돌을 일으키는 데 도움이되는 도구는 무엇입니까?

==========================

[EDIT] 해결.

==========================

과 같이 많은 종류의 사람들이 주목 한 이유는 단지 가지고 논리적 이유가 없다 1800 라인 PHP 함수 라이브러리는 속도 저하를 야기합니다. 실제로 일어난 일은 더 긴 API 호출 함수 중 하나를 호출하는 디버그 라인이 있다는 것입니다. PHP 파일을 포함 할 때마다 원격 쿼리 데이터에서 전체 데이터 구조를 구성했습니다.

일단 내가 그 라인을 죽이면, 모든것이 30ms 응답으로 돌아갔습니다. 이상한 점은 require_once()가 AJAX 스크립트가 호출 될 때마다 php 파일을 여는 것입니다. 그러나 그것은 저 모양이 아니며 AJAX 스크립트가 끝날 때마다 닫히고 매번 다시 열리고 재 컴파일된다는 것을 잊고 있습니다.

+4

이것은 WTF가 제작 한 것입니다. DailyWTFs, 즉. – aviraldg

+0

명확하게 그 기능을 수행하고 대역폭의 톤을 저장 모듈로 나눕니다. 이렇게하면 코드를 더 깔끔하고 쉽게 처리 할 수 ​​있습니다. –

+0

줄 번호가 아닙니다. PHP 페이지가 길어서 빠르게로드됩니다. 나는 또한 총 길이의 10 배에 달하는 전체 인프라를 가지고 있으며 그로 인해 속도가 느려지지는 않습니다. – staticsan

답변

0

함수를 작은 파일로 그룹화하고 필요할 때로드 할 수 있습니까?

전역 함수 또는 클래스입니까, 아니면 정적 메서드입니까?

그렇다면 PHP의 자동 로딩 기능을 활용할 수 있습니다. __autoload()을 보거나보다 유연한 솔루션을 보려면 spl_autoload_register()을보십시오.

0

분명히 그 파일을 분리합니다. 만약 당신이 코드베이스를 체계화함으로써 얻을 수있는 생산성 향상은 가치가 있습니다.

+1

클래스를 그룹으로 묶어 모든 클래스를 하나의 파일로 사용하면 실제로 여러 파일을 가져오고 구문 분석하는 데 필요한 I/O 시간보다 빠릅니다. – James

+0

@beagleguy 생산성을 높일 수 있습니다 - 1800 라인 파일을 두들겨 골머리가 덜합니다. – alex

+0

그는 성능을 얻으 려합니다. – James

6

코드가 100 000 줄인 파일을 가질 수 있으며로드하는 데 10 초가 걸리지 않아야합니다.

거기에 초기화 코드가있어 실행 중임을 인식하지 못할 수 있습니다. 프로파일 러 (xdebug 또는 Zend Studio의 프로파일 러)를 살펴보고 최적화 과정을 거치기 전에 느려지는 것을 정확히 알아보십시오. 파일 길이가 1800 라인이기 때문에 간단하다고 생각된다면 잘못된 경로에 처하게됩니다.

+0

당신에게 명성을, 좋은 선생님! 우리는 우리가 신선했을 때 그 다음날 빨리 눈을 뜨면서 해결했습니다. – somerandomguy

0

포함 (심지어 1800 줄)이 그렇게 느리게 할 수 있다는 것은 매우 놀라운 일입니다. 먼저 코드를 살펴보고 불필요한 처리를 수행하지 않는지 확인해야합니다. 실제로 파일을 파싱하는 것이 병목 현상이되지 않아야합니다.

그렇다면 include는 많은 PHP 프로그램의 주요 병목 현상 중 하나입니다. PHP의 __autoload 함수를 사용하여 (원하는 것만 포함하는) 작은 파일로 코드를 리팩터링 할 수도 있습니다. 존재하지 않는 클래스를 참조 할 때마다 자동으로 호출되는 함수이므로 함수를 정적 클래스에 넣어야합니다. 예 :

// include/ajaxlib.php 
class AjaxLib { 
    public static function renderResponse($data) { 
     // whatever 
    } 
} 

// a common include file: 
function __autoload($class) { 
    require 'include/' . strtolower($class) . '.php'; 
} 

// your code: 
AjaxLib::renderResponse($foo); 
1

이 처리되면 해당 여전히 APC는 다음 파일 문제를 캐싱 할 때 느린 경우 또한, 파일을 캐시 APC를 사용 :) 거기에 수면() 함수가 있지 않은지 확인 다른 곳에있다. 20,000 줄의 파일을 문제없이 포함 시켰습니다.

0

1800 라인 파일이 문제가된다고 상상할 수는 없지만, 모든 페이지에 1870 라인의 많은 클래스 중 하나만 포함되어 있어도 문제가 발생하지 않습니다. 포함하고있는 파일에 파일 또는 네트워크 액세스가 있습니까?