PHP OPCache를 사용하는 방법?


249

PHP 5.5가 출시되었으며 OPCache라는 새로운 코드 캐싱 모듈을 제공하지만 이에 대한 문서는 없습니다.

그렇다면 문서는 어디에 있으며 OPcache를 어떻게 사용합니까?




문서에서 opcache를 올바르게 컴파일 / 비활성화하거나 PHP 5.6.24 + 소스의 autoconf를 해결하는 방법을 알려주지 않아 PHP가 컴파일되지 않습니다! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "조정이 필요한 설정이 많이 있습니다. PHP 5.5 릴리스 프로세스의 안정화 단계에서 작동 방식을 이해하고 문제를 식별하면 큰 도움이됩니다." ... 그 블로그 게시물은별로 도움이되지 않습니다. 작동 방법 또는 설정을 가장 잘 조정하는 방법을 이해하는 방법은 설명하지 않습니다. (
icc97

답변:


371

설치

OpCache는 기본적으로 PHP5.5 +에서 컴파일됩니다. 그러나 기본적으로 비활성화되어 있습니다. PHP5.5 +에서 OpCache를 사용하려면 먼저 활성화해야합니다. 이렇게하려면 다음을 수행해야합니다.

에 다음 줄을 추가하십시오 php.ini.

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

경로에 공백이 있으면 따옴표로 묶어야합니다.

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

또한 실제 Zend 엔진 (예 : PHP를 실행하는 엔진)에 영향을주기 때문에 zend_extension"normal"지시문 대신 지시문 을 사용해야합니다 extension.

용법

현재 사용할 수있는 네 가지 기능이 있습니다.

opcache_get_configuration():

OpCache가 현재 사용하는 구성을 포함하는 배열을 반환합니다. 여기에는 모든 ini 설정과 버전 정보 및 블랙리스트 파일이 포함됩니다.

var_dump(opcache_get_configuration());

opcache_get_status():

캐시의 현재 상태에 대한 정보가있는 배열을 반환합니다. 이 정보에는 캐시 상태 (활성화, 재시작, 전체 등), 메모리 사용량, 적중, 누락 및 기타 유용한 정보가 포함됩니다. 캐시 된 스크립트도 포함됩니다.

var_dump(opcache_get_status());

opcache_reset():

전체 캐시를 재설정합니다. 다음에 방문 할 때 가능한 모든 캐시 된 스크립트가 다시 구문 분석됩니다.

opcache_reset();

opcache_invalidate():

캐시 된 특정 스크립트를 무효화합니다. 다음에 방문 할 때 스크립트가 다시 파싱됨을 의미합니다.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

유지 보수 및 보고서

OpCache를 유지 관리하고 유용한 보고서를 생성하는 데 도움이되는 GUI가 있습니다. 이러한 도구는 위의 기능을 활용합니다.

OpCacheGUI

면책 조항 나는이 프로젝트의 저자입니다

풍모:

  • OpCache 상태
  • OpCache 구성
  • OpCache 통계
  • OpCache 재설정
  • 캐시 된 스크립트 개요
  • 캐시 된 스크립트 무효화
  • 다국어
  • 휴대 기기 지원
  • 반짝이는 그래프

스크린 샷 :

상태

캐시 된 스크립트

그래프

모빌 러

URL : https://github.com/PeeHaa/OpCacheGUI

opcache- 상태

풍모:

  • OpCache 상태
  • OpCache 구성
  • OpCache 통계
  • 캐시 된 스크립트 개요
  • 하나의 파일

스크린 샷 :

상태

URL : https://github.com/rlerdorf/opcache-status

opcache-gui

풍모:

  • OpCache 상태
  • OpCache 구성
  • OpCache 통계
  • OpCache 재설정
  • 캐시 된 스크립트 개요
  • 캐시 된 스크립트 무효화
  • 자동 새로 고침

스크린 샷 :

opcache-gui-overview

URL : https://github.com/amnuts/opcache-gui


6
PHP-CLI에 관한 것이 있습니까? CLI는 어떻게 그것을 사용합니까? FPM이 다시 시작되면 OPCache가 재설정됩니다. CLI의 OPCache에도 영향을 미칩니 까? CLI의 OPCache는 분리되어 있습니까? 아니면 FPM과 동일한 캐시 풀을 공유합니까? 감사!
Shahriyar Imanov

3
OpCache는 ubuntu 14.04, apache 2.4.7, php 5.5.9의 최신 설치에서 기본적으로 활성화되어 있습니다.
jstats

안녕하세요, 세 번째 스크린 샷에서 cache_full이 false입니다. 전체 페이지 캐싱과 관련된 것으로 가정하고 있습니다. 켜는 방법을 알려주십시오.
brucekaushik

나는 전체 페이지를 캐싱하기위한 것이 아니라 캐시가 사용하는 메모리가 가득 찬 경우 true로 표시됩니다. 어쨌든 고마워!
brucekaushik

zend_extension = C : \ path \ to \ php_opcache.dll (win)-php.ini에이 줄을 추가하면 정상적으로 작동합니다.
kalidasan

152

OPcache가 APC를 대체합니다

OPcache는 APC 모듈을 대체하도록 설계되었으므로 PHP에서 병렬로 실행할 수 없습니다. 이것은 코드 작성 방법에 영향을 미치지 않기 때문에 PHP opcode 캐싱에 좋습니다.

그러나 현재 APC를 사용하여 apc_store()기능을 통해 다른 데이터를 저장 하는 경우 OPCache를 사용하기로 결정한 경우 에는 해당 기능을 수행 할 수 없습니다.

공유 PHP 메모리에 데이터를 저장하는 APCu 또는 Yac 와 같은 다른 라이브러리를 사용 하거나 메모리에 별도의 프로세스로 데이터를 PHP에 저장하는 memcached와 같은 것을 사용하도록 전환해야합니다.

또한 OPcache에는 APC에 존재하는 업로드 진행률 표시기가 없습니다. 대신 세션 업로드 진행을 사용해야합니다 .

OPcache 설정

OPcache에 대한 문서를 찾을 수 있습니다 여기에 나열된 모든 설정 옵션과 함께 여기 . 권장되는 설정은 다음과 같습니다.

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

코드 주석을 사용하는 라이브러리 또는 코드를 사용하는 경우 주석 저장을 활성화해야합니다.

opcache.save_comments=1

비활성화하면 모든 PHPDoc 주석이 코드에서 삭제되어 최적화 된 코드의 크기가 줄어 듭니다. "Doc Comments"를 비활성화하면 기존 응용 프로그램 및 프레임 워크 (예 : Doctrine, ZF2, PHPUnit)가 손상 될 수 있습니다.


4
프로덕션 환경, 개발 또는 둘 다에 권장되는 설정입니까?
marcvangend

1
어쩌면 정확히 opcache가 무엇이며 어떻게 사용되는지에 대한 오해가 있지만 아래 PeeHaa 상태 스크립트로 구성하고 테스트했습니다. 모두 작동합니다. 그러나 여전히 OP 질문을하고 있습니다. "사용 방법?" 뷰를 캐싱하는 것이 아니며 문제가 있습니까?
isimmons

3
@isimmons "OPcache는 사전 컴파일 된 스크립트 바이트 코드를 공유 메모리에 저장하여 PHP가 각 요청에 대해 스크립트를로드하고 파싱 할 필요가 없도록하여 PHP 성능을 향상시킵니다."
Danack

1
@marcvangend 좋은 지적! 캐싱은 프로덕션 환경에서만 의미가 있다고 생각하므로 이러한 구성은 프로덕션 설정일 수 있습니다.
Sliq November

3
권장 설정 성능이 기본값보다 나쁜 이유 또는 효과를 발휘해야하는시기를 누구나 설명 할 수 있습니까?
RP

19

나는 opcache를 사용하는 것에 대해 내 2 센트를 떨어 뜨릴 것입니다.

데이터베이스와 대화 할 수 있도록 많은 필드와 유효성 검사 방법 및 열거 형으로 광범위한 프레임 워크를 만들었습니다.

opcache없이

opcache 없이이 스크립트를 사용하고 2.8 초 동안 9000 요청을 아파치 서버에 푸시하면 모든 요청을 따라 잡을 때까지 70-80 초 동안 90-100 % CPU에서 최대 시간을 초과합니다.

Total time taken: 76085 milliseconds(76 seconds)

opcache가 활성화 된 상태

opcache를 활성화하면 약 25 초 동안 25-30 %의 CPU 시간으로 실행되며 25 %의 CPU 사용을 절대로 통과하지 않습니다.

Total time taken: 26490 milliseconds(26 seconds)

나는 정적이며 기능을 변경할 필요가없는 프레임 워크를 제외한 모든 것의 캐싱을 비활성화하기 위해 opcache 블랙리스트 파일을 만들었습니다. 캐시 파일을 다시로드하거나 유효성을 검사하지 않아도 개발할 수 있도록 프레임 워크 파일 만 명시 적으로 선택합니다. 모든 것을 캐시하면 총 요청 시간이 1 초 절약됩니다.25546 milliseconds

이렇게하면 서버가 땀을 흘리지 않고도 초당 처리 할 수있는 데이터 / 요청의 양이 크게 늘어납니다.


3
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;그냥; ini 파일에 입력하십시오. 그러나 이것이 내가 사용한 것입니다. 대부분 기본 항목
Tschallacka 10

1
btw, memcache를 사용하여 2100 데이터베이스 요청을 초당 실행하면 150 마이크로 초 (약 1/6 초) 내에서 사용하는 스크립트가 실행됩니다.
Tschallacka

1
Opcache는 PHP 파일을 컴파일 된 형태로 메모리에 캐시합니다. 따라서 더 이상 PHP 파서가 디스크를 읽고 파일을 컴파일 및 최적화하는 오버 헤드가 없습니다. Memcache는 세션 사이에 변수를 저장하는 데 사용할 수있는 것입니다. 예를 들어 사용자가 화면을 응시하는 동안 10 초 동안 동일한 매개 변수를 요청하는 업데이트 스크립트가 있다고 가정하십시오. mem cache를 사용하여 쿼리를 한 번 컴파일 한 다음 메모리에서 컴파일 된 쿼리를 계속 요청하는 것이 좋습니다.
Tschallacka

2
그렇지 않습니다. opcache.revalidate_freq=60;파일이 메모리에서 얼마나 오래 살 수 있는지 결정합니다. 시간이 다되면 파일을 다시 컴파일합니다.
Tschallacka

3
실제로, opcache.revalidate_freq타임 스탬프 변경 여부에 따라 스크립트에서 변경을 확인하는 빈도를 제어합니다. 따라서 스크립트의 타임 스탬프가 마지막으로 컴파일 된 시간과 동일하게 유지되면 다시 컴파일되지 않습니다. 이 모든 opcache.validate_timestamps설정은 기본적으로 활성화되어 있는 설정을 변경하지 않았다고 가정합니다 .
jjlin

4

Amazon Linux에서 PHP 5.6을 사용하는 경우 (RedHat 또는 CentOS에서 동일해야 함) :

yum install php56-opcache

그런 다음 아파치를 다시 시작하십시오.


2

무들을 설정할 때이 문제가 발생했습니다. php.ini 파일에 다음 줄을 추가했습니다.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

국제-> http://php.net/manual/en/book.intl.php


1
이 설정은 여기에 문서화되어 있습니다. docs.moodle.org/30/en/OPcache
sierrasdetandil

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.