Wordpress 메모리 소비를 면밀히 살펴 보았습니다. 내 사이트에서 각 페이지 히트마다 20MB의 RAM이 할당되는 것처럼 보입니다. 모든 플러그인을 실행할 수있는 편안한 환경을 준비하기 위해서입니다.
최적화 할 단일 지점이 없으며 대부분의 메모리를 먹는 나쁜 사람이 없습니다. 소비는 모두 많은 많은 PHP 모듈에 퍼져 있습니다.
Wordpress가 메모리에서 환경을 한 번만 초기화 한 다음 적중마다 여러 번 재사용하는 방법은 무엇입니까? 각 사용자가 클릭 할 때마다 PHP가 20MB를 천천히 먹고 싶지는 않습니다. 메모리가 많은 서버에서도 모든 작업을 완료하는 데 몇 초가 걸립니다. 기본적으로 재사용 할 수있는 읽기 전용 메모리 청크가 필요합니다.
또한 ... 왜 20MB입니까? 누구든지 이것에 대한 통찰력을 제공 할 수 있습니까?
편집 : 여기 내 개발 컴퓨터에서 실행되는 Wordpress의 WinCacheGrind 출력입니다 (공유 호스팅보다 훨씬 빠름). 보시다시피 메인 페이지의 HTML을 생성하는 데 약간의 시간이 소요됩니다. 공유 호스팅으로 속도를 늦추고 문제를 해결할 수 있습니다. 대부분의 시간이 걸리는 방법을 선택했습니다. 이것을 최적화하는 방법은 무엇입니까?
편집 : 여기이 환상적인 functions.php 프로파일 링 도구의 쿼리 통계입니다 .
로드 : 12 쿼리-532ms-19.1MB-43 캐시 적중 / 53 쿼리 : 15 쿼리-563ms-19.0MB-72 캐시 적중 / 86 표시 : 21 개의 쿼리-705ms-19.2MB-234 캐시 적중 / 257
편집 : 당신은 당신을 놀라게 보장 뭔가를보고 싶습니까? index.php 끝에 다음 줄을 삽입하십시오.
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
현재 게시물의 본문이 메모리에 저장된 횟수를 세려고했습니다. 나는 20 개의 인스턴스를 세었다. 그런 다음 PHP에 참조 횟수가 있다는 것을 알았으므로 사본 수는 3으로 줄었습니다. 2는 WP_Query에 있고, 하나는 객체 캐시에 있습니다. 더 조사 중입니다.
이것이 워드 프레스가 메모리 문제를 대상으로 리팩토링을 필요로하는 이유입니다. 더 이상 복잡한 메모리 사용으로 인해 메모리 소비를 비난 할 수 없습니다. 그것은 단순히 많은 일들을 잘못 합니다.
편집 : 이것을 알아 내려고 하루를 보낸 후, 여기 내 결과가 있습니다.
1) 모든 메모리의 88 %가 요청 또는 포함 또는 포함 _once 유형의 호출에서 발생합니다.
2) php 파일은 대부분의 요청을 처리하는 첫 번째 부분 (놀랍지 않게)에서 발생하며 모든 메모리가 소비되는 곳입니다.
3) 요청하는 동안 실행되는 모든 기능을 구성하는 것은 매우 흥미 롭습니다. 총 12000 건 이상의 통화가 있습니다. 나는 그것을 더 보이게하기 위해 그것들을 흔들 었습니다 (레벨 축은 기본적으로 스택 깊이입니다).
4) 내가 생각할 수있는 유일한 방법은 포함 된 .php 파일의 양을 최소화하는 것입니다. 내가 가져온 파일마다 기능을 분할하면 많은 파일이 최대 한두 번 적중되었음을 알 수 있습니다. 필요하지 않을 때는 건너 뛰는 방법이 필요합니다. 예를 들어, 원격 데이터베이스 백업 플러그인이 전혀 사용되지 않도록로드 및 등록됩니다. 파일 이름으로 분할 된 위의 플롯은 다음과 같습니다.
내 블로그 메모리 풋 프린트를 30 % 이상 줄이게하는 리팩토링에 대해 명성이 높은 현상금을 제공하고 있습니다.
편집 : WP 3.1을 설치했습니다. 이전 버전과의 비교입니다.
파란색은 WP 3.1이고 빨간색은 3.0.4입니다. 새로운 WP는 더 빠르지 만 더 많은 메모리를 사용합니다.
다음은 포함 파일 별 목록입니다.
이를 통해 "All In One SEO pack"이 얼마나 많은 메모리를 사용하는지 알 수 있습니다. 한 가지 방법은 플러그인 기능의 일부만 사용하여 원하는 것을 얻을 수 있다는 것입니다. 또한 내 플러그인은 꽤 나빠 보입니다.
예를 들어 comment.php (내 블로그에 대한 의견을 허용하지 않음) 및 기타 여러 가지에 조건부로드를 시도하고 싶습니다. 더 이상 사용되지 않는 코드를 모두 삭제했습니다. 요청에 따라 전역 테이블 만로드하도록 kses.php를 정리했습니다. l10n (현지화하지 않음)을 단순화하여 함수가 조회없이 문자열을 즉시 반환합니다. 나는 여전히 임의로 설정 한 30 % 마크와는 거리가 멀다.
편집 : 기본 설정 (32MB의 opcode 캐시)으로 APC를 다운로드하여 활성화했습니다. 비교는 다음과 같습니다.
코드 로딩이 엄청나게 빨라지고 메모리에서 공간을 덜 차지한다는 것을 알 수 있습니다 (아마도 원본 소스가 아닌 opcode 만 처리하기 때문에). 그러나 메모리 소비는 여전히 높습니다.