จะใช้ PHP OPCache อย่างไร


249

PHP 5.5 ได้เปิดตัวและมีโมดูลการแคชรหัสใหม่ที่เรียกว่า OPCache แต่ดูเหมือนจะไม่มีเอกสารใด ๆ

ดังนั้นเอกสารสำหรับมันอยู่ที่ไหนและฉันจะใช้ OPcache ได้อย่างไร



4
เอกสารประกอบ: php.net/manual/en/book.opcache.php
David Oliver เมื่อ

น่าเสียดายที่เอกสารไม่ได้บอกเราว่าจะรวบรวมopcacheอย่างถูกต้อง / ปิดการใช้งานหรือไม่แก้ปัญหา autoconf ของ PHP 5.6.24+ แหล่งที่มาดังนั้น PHP จะรวบรวม! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "มีการตั้งค่าจำนวนมากซึ่งอาจจำเป็นต้องปรับเปลี่ยนการทำความเข้าใจวิธีการทำงานและการระบุปัญหาในช่วงการรักษาเสถียรภาพของกระบวนการวางจำหน่าย PHP 5.5 จะช่วยได้อย่างมาก" ... โพสต์บล็อกนั้นไม่มีประโยชน์มาก ไม่ได้อธิบายวิธีการทำความเข้าใจวิธีการทำงานหรือวิธีปรับการตั้งค่าที่ดีที่สุด :(
icc97

คำตอบ:


371

การติดตั้ง

OpCache รวบรวมโดยค่าเริ่มต้นใน PHP5.5 + อย่างไรก็ตามมันจะปิดการใช้งานโดยค่าเริ่มต้น ในการเริ่มใช้ OpCache ใน PHP5.5 + คุณต้องเปิดใช้งานก่อน ในการทำเช่นนี้คุณต้องทำดังต่อไปนี้

เพิ่มบรรทัดต่อไปนี้ใน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_extensionคำสั่งแทนคำสั่ง "ปกติ" extensionเพราะมันจะส่งผลกระทบต่อเครื่องมือ Zend จริง (เช่นสิ่งที่เรียกใช้ PHP)

การใช้

ขณะนี้มีสี่ฟังก์ชันที่คุณสามารถใช้:

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);

การบำรุงรักษาและรายงาน

มี GUI บางส่วนที่สร้างขึ้นเพื่อช่วยรักษา OpCache และสร้างรายงานที่เป็นประโยชน์ เครื่องมือเหล่านี้ใช้ประโยชน์จากฟังก์ชั่นด้านบน

OpCacheGUI

ขอสงวนสิทธิ์ฉันเป็นผู้เขียนโครงการนี้

คุณสมบัติ:

  • สถานะ OpCache
  • การกำหนดค่า OpCache
  • สถิติ OpCache
  • รีเซ็ต OpCache
  • ภาพรวมของสคริปต์ที่แคช
  • การทำให้สคริปต์ใช้งานไม่ได้
  • พูดได้หลายภาษา
  • รองรับอุปกรณ์มือถือ
  • กราฟเงา

ภาพหน้าจอ:

สถานะ

แคสคริปต์

กราฟ

mobilr

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 ภาพรวม

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


6
มีอะไรเกี่ยวกับ PHP-CLI บ้าง? CLI ใช้ประโยชน์อย่างไร? เมื่อ FPM รีสตาร์ท OPCache จะรีเซ็ต - มันส่งผลต่อ OPCache ของ CLI หรือไม่ OPCache ของ CLI แยกจากกันหรือแชร์ Cache pool เดียวกันกับ FPM หรือไม่ ขอบคุณ!
Shahriyar Imanov

3
OpCache ถูกเปิดใช้งานโดยค่าเริ่มต้นสำหรับฉันในการติดตั้งล่าสุดของฉันบน Ubuntu 14.04, apache 2.4.7, php 5.5.9
jstats

สวัสดีในสกรีนช็อตที่ 3 ของคุณ cache_full เป็นเท็จฉันสมมติว่ามันเกี่ยวกับการแคชแบบเต็มหน้าคุณช่วยบอกวิธีการเปิดใช้มันได้ไหม (ทำให้เป็นจริง)
brucekaushik

ฉันผิดที่ไม่ได้มีไว้สำหรับแคชแบบเต็มหน้า แต่มันจะปรากฏขึ้นเป็นจริงหากหน่วยความจำที่แคชใช้นั้นเต็ม ขอบคุณทุกคน!
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

คุณจะต้องใช้ไลบรารีอื่นเช่นAPCuหรือYacซึ่งทั้งสองเก็บข้อมูลในหน่วยความจำ PHP ที่ใช้ร่วมกันหรือสลับไปใช้สิ่งที่ต้องการ memcached ซึ่งเก็บข้อมูลในหน่วยความจำในกระบวนการแยกเป็น PHP

นอกจากนี้ 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" อาจทำให้แอปพลิเคชันและกรอบงานบางอย่างที่มีอยู่ (เช่น Doctrine, ZF2, PHPUnit)


4
การตั้งค่าที่แนะนำสำหรับสภาพแวดล้อมการผลิตเพื่อการพัฒนาหรือทั้งสองอย่าง
marcvangend

1
อาจจะมีความเข้าใจผิดในส่วนของฉันในสิ่งที่ opcache คืออะไรและมันใช้สำหรับอะไร แต่ฉันได้กำหนดค่าและทดสอบด้วยสคริปต์สถานะ PeeHaa ด้านล่าง ทั้งหมดใช้งานได้ แต่ฉันยังคงถามคำถาม OP "จะใช้งานอย่างไร?" มันไม่ได้มีไว้สำหรับการดูแคชและมันเป็นอย่างไร
isimmons

3
@isimmons "OPcache ปรับปรุงประสิทธิภาพการทำงานของ PHP โดยการจัดเก็บสคริปต์ไบต์ก่อนคอมไพล์ในหน่วยความจำที่ใช้ร่วมกันดังนั้นจึงไม่จำเป็นต้องให้ PHP โหลดและแยกวิเคราะห์สคริปต์ในแต่ละคำขอ"
Danack

1
@marcvangend จุดดี! ฉันคิดว่าการแคชทำให้เข้าใจได้จริงในการผลิตดังนั้นการกำหนดค่าเหล่านี้อาจเป็นการตั้งค่าการผลิต
Sliq

3
ทุกคนสามารถอธิบายได้หรือไม่ว่าเหตุใดประสิทธิภาพการตั้งค่าที่แนะนำจึงแย่กว่าค่าเริ่มต้นหรือเมื่อใดที่ควรจะให้ผล
RP

19

ฉันจะลดลงในสองเซ็นต์ของฉันสำหรับสิ่งที่ฉันใช้ opcache

ฉันได้ทำเฟรมเวิร์กที่กว้างขวางพร้อมฟิลด์จำนวนมากและวิธีการตรวจสอบและ enums เพื่อให้สามารถพูดคุยกับฐานข้อมูลของฉัน

ไม่มี opcache

เมื่อใช้สคริปต์นี้โดยไม่ใช้ opcache และฉันกด 9000 คำขอใน 2.8 วินาทีไปยังเซิร์ฟเวอร์ apache มันจะออกมาสูงสุดที่ 90-100% cpu เป็นเวลา 70-80 วินาทีจนกระทั่งมันจับกับคำขอทั้งหมด

Total time taken: 76085 milliseconds(76 seconds)

ด้วยการเปิดใช้งาน opcache

ด้วยการเปิดใช้งาน opcache จะทำงานที่เวลา 25-30% cpu เป็นเวลาประมาณ 25 วินาทีและไม่เคยผ่านการใช้งาน cpu 25%

Total time taken: 26490 milliseconds(26 seconds)

ฉันได้สร้างไฟล์บัญชีดำ opcache เพื่อปิดการใช้งานแคชทุกอย่างยกเว้นกรอบซึ่งเป็นแบบคงที่และไม่จำเป็นต้องเปลี่ยนการทำงาน ฉันเลือกเฉพาะไฟล์เฟรมเวิร์กอย่างชัดเจนเพื่อให้ฉันสามารถพัฒนาได้โดยไม่ต้องกังวลกับการโหลดซ้ำ / ตรวจสอบความถูกต้องของไฟล์แคช การมีทุกสิ่งที่แคชจะบันทึกวินาทีในจำนวนคำขอทั้งหมด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

1
btw ฉันจะใช้สิ่งนี้กับ memcache ทำตามคำขอฐานข้อมูล 2100 ครั้งที่สองเรียกใช้สคริปต์ที่ฉันใช้ภายใน 150 microseconds (ประมาณ 1 ใน 6 ของมิลลิวินาที)
Tschallacka

1
Opcache เก็บไฟล์ php ในรูปแบบที่คอมไพล์ในหน่วยความจำ ดังนั้นคุณจึงไม่มีค่าใช้จ่ายในการอ่านจากดิสก์และการคอมไพล์ & ปรับแต่งไฟล์โดย php parser อีกต่อไป Memcache เป็นสิ่งที่คุณสามารถใช้เพื่อเก็บตัวแปรในระหว่างเซสชัน ตัวอย่างเช่นผู้ใช้มีสคริปต์อัปเดตที่ร้องขอพารามิเตอร์เดียวกันเป็นเวลา 10 วินาทีในขณะที่ผู้ใช้จ้องที่ ascreen คุณสามารถใช้ mem cache เพื่อคอมไพล์เคียวรีหนึ่งครั้งจากนั้นทำการร้องขอเคียวรีที่คอมไพล์จากหน่วยความจำซึ่งไม่ใช่การสร้างใหม่
Tschallacka

2
มันไม่ opcache.revalidate_freq=60;กำหนดระยะเวลาที่ไฟล์จะอยู่ในหน่วยความจำในไม่กี่วินาที เมื่อเวลาหมดลงคอมไพล์ไฟล์อีกครั้ง
Tschallacka

3
ที่จริงแล้วopcache.revalidate_freqควบคุมความถี่ในการตรวจสอบสคริปต์สำหรับการเปลี่ยนแปลง (ขึ้นอยู่กับว่ามีการเปลี่ยนแปลงการประทับเวลา) ดังนั้นหากการประทับเวลาของสคริปต์ยังคงเหมือนเดิมในครั้งสุดท้ายที่รวบรวมมันจะไม่ถูกคอมไพล์ใหม่ ทั้งหมดนี้เป็นการสมมติว่าคุณไม่ได้เปลี่ยนการopcache.validate_timestampsตั้งค่าซึ่งเปิดใช้งานโดยค่าเริ่มต้น
jjlin

4

ด้วย PHP 5.6 บน Amazon Linux (ควรเหมือนกันบน RedHat หรือ CentOS):

yum install php56-opcache

จากนั้นรีสตาร์ท apache


2

ฉันพบสิ่งนี้เมื่อตั้งค่า moodle ฉันเพิ่มบรรทัดต่อไปนี้ในไฟล์ 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

intl -> http://php.net/manual/th/book.intl.php


1
อาจเป็นเรื่องน่าสังเกตว่าการตั้งค่านี้มีการบันทึกไว้ที่นี่: docs.moodle.org/30/th/OPcache
sierrasdetandil

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.