Bagaimana cara menggunakan PHP OPCache?


249

PHP 5.5 telah dirilis dan fitur modul caching kode baru yang disebut OPCache, tetapi tampaknya tidak ada dokumentasi untuk itu.

Jadi di mana dokumentasi untuknya dan bagaimana cara menggunakan OPcache?




Sayang sekali bahwa Dokumentasi TIDAK memberi tahu kami cara mengkompilasi opcache dengan benar / menonaktifkannya atau tidak memecahkan masalah sumber autoconf PHP 5.6.24+, sehingga PHP dapat dikompilasi! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "Ada banyak pengaturan yang mungkin perlu disesuaikan. Memahami cara kerjanya dan mengidentifikasi masalah selama fase stabilisasi proses rilis PHP 5.5 akan sangat membantu." ... Posting blog itu tidak terlalu membantu. Itu tidak menjelaskan cara memahami cara kerjanya atau cara terbaik untuk menyesuaikan pengaturan :(
icc97

Jawaban:


371

Instalasi

OpCache dikompilasi secara default di PHP5.5 +. Namun itu dinonaktifkan secara default. Untuk mulai menggunakan OpCache di PHP5.5 +, Anda harus mengaktifkannya terlebih dahulu. Untuk melakukan ini, Anda harus melakukan yang berikut.

Tambahkan baris berikut ke Anda php.ini:

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

Perhatikan bahwa ketika path berisi spasi Anda harus membungkusnya dengan tanda kutip:

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

Juga perhatikan bahwa Anda harus menggunakan zend_extensionarahan alih-alih direktif "normal" extensionkarena itu mempengaruhi mesin Zend yang sebenarnya (yaitu hal yang menjalankan PHP).

Pemakaian

Saat ini ada empat fungsi yang dapat Anda gunakan:

opcache_get_configuration():

Mengembalikan array yang berisi konfigurasi yang digunakan OpCache saat ini digunakan. Ini termasuk semua pengaturan ini serta informasi versi dan file daftar hitam.

var_dump(opcache_get_configuration());

opcache_get_status():

Ini akan mengembalikan array dengan informasi tentang status cache saat ini. Informasi ini akan mencakup hal-hal seperti: keadaan cache (diaktifkan, restart, penuh dll), penggunaan memori, klik, kehilangan dan beberapa informasi yang lebih berguna. Ini juga akan berisi skrip yang di-cache.

var_dump(opcache_get_status());

opcache_reset():

Mereset seluruh cache. Berarti semua skrip cache yang mungkin akan diuraikan lagi pada kunjungan berikutnya.

opcache_reset();

opcache_invalidate():

Membatalkan skrip cache tertentu. Artinya skrip akan diuraikan lagi pada kunjungan berikutnya.

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

Pemeliharaan dan laporan

Ada beberapa GUI yang dibuat untuk membantu memelihara OpCache dan menghasilkan laporan yang bermanfaat. Alat-alat ini memanfaatkan fungsi-fungsi di atas.

OpCacheGUI

Penafian Saya penulis proyek ini

Fitur:

  • Status OpCache
  • Konfigurasi OpCache
  • Statistik OpCache
  • Atur ulang OpCache
  • Ikhtisar skrip cache
  • Pembatalan skrip cache
  • Multilingual
  • Dukungan perangkat seluler
  • Grafik mengkilap

Tangkapan layar:

status

skrip dalam cache

grafik

mobilr

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

opcache-status

Fitur:

  • Status OpCache
  • Konfigurasi OpCache
  • Statistik OpCache
  • Ikhtisar skrip cache
  • File tunggal

Tangkapan layar:

status

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

opcache-gui

Fitur:

  • Status OpCache
  • Konfigurasi OpCache
  • Statistik OpCache
  • Atur ulang OpCache
  • Ikhtisar skrip cache
  • Pembatalan skrip cache
  • Penyegaran otomatis

Tangkapan layar:

gambaran umum opcache-gui

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


6
Ada yang terkait dengan PHP-CLI? Bagaimana CLI menggunakannya? Ketika FPM dimulai kembali, OPCache me-reset - apakah itu juga mempengaruhi OPCache CLI? Apakah OPCache CLI terpisah atau apakah berbagi Cache pool yang sama dengan FPM? Terima kasih!
Shahriyar Imanov

3
OpCache diaktifkan secara default untuk saya pada instalasi terbaru saya di ubuntu 14.04, apache 2.4.7, php 5.5.9.
jstats

hai, di tangkapan layar ke-3 Anda, cache_full salah, saya berasumsi ini terkait dengan caching halaman penuh, dapatkah Anda memberi tahu saya cara mengaktifkannya? (jadikan itu benar)
brucekaushik

Saya salah, itu bukan untuk caching halaman penuh, tetapi itu akan ditampilkan sebagai benar jika memori yang digunakan cache penuh. Bagaimanapun, terima kasih!
brucekaushik

zend_extension = C: \ path \ to \ php_opcache.dll (win) - Menambahkan baris ini di php.ini berfungsi dengan baik.
kalidasan

152

OPcache menggantikan APC

Karena OPcache dirancang untuk menggantikan modul APC, tidak mungkin untuk menjalankannya secara paralel di PHP. Ini bagus untuk caching opcode PHP karena tidak mempengaruhi bagaimana Anda menulis kode.

Namun itu berarti bahwa jika Anda saat ini menggunakan APC untuk menyimpan data lain (melalui apc_store()fungsi) Anda tidak akan dapat melakukannya jika Anda memutuskan untuk menggunakan OPCache.

Anda perlu menggunakan pustaka lain seperti APCu atau Yac yang keduanya menyimpan data dalam memori PHP bersama, atau beralih untuk menggunakan sesuatu seperti memcached, yang menyimpan data dalam memori dalam proses terpisah ke PHP.

Selain itu, OPcache tidak memiliki padanan dengan meter kemajuan pengunggahan yang ada di APC. Sebaliknya, Anda harus menggunakan Kemajuan Unggahan Sesi .

Pengaturan untuk OPcache

Dokumentasi untuk OPcache dapat ditemukan di sini dengan semua opsi konfigurasi yang tercantum di sini . Pengaturan yang disarankan adalah:

; 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

Jika Anda menggunakan pustaka atau kode yang menggunakan anotasi kode, Anda harus mengaktifkan simpan komentar:

opcache.save_comments=1

Jika dinonaktifkan, semua komentar PHPDoc dikeluarkan dari kode untuk mengurangi ukuran kode yang dioptimalkan. Menonaktifkan "Komentar Doc" dapat merusak beberapa aplikasi dan kerangka kerja yang ada (mis. Doctrine, ZF2, PHPUnit)


4
Apakah pengaturan yang disarankan untuk lingkungan produksi, untuk pengembangan, atau keduanya?
marcvangend

1
Mungkin kesalahpahaman di pihak saya tentang apa sebenarnya opcache itu dan apa yang digunakan untuk tetapi saya sudah mengkonfigurasi dan diuji dengan skrip status PeeHaa di bawah ini. Semua berfungsi. Tapi saya masih menanyakan pertanyaan OP. "Bagaimana cara menggunakannya?" Ini bukan untuk caching pandangan dan hal apa itu?
isimmons

3
@isimmons "OPcache meningkatkan kinerja PHP dengan menyimpan bytecode skrip yang dikompilasi dalam memori bersama, sehingga menghilangkan kebutuhan PHP untuk memuat dan mem-parsing skrip pada setiap permintaan."
Danack

1
@marcvangend Poin bagus! Saya pikir caching hanya masuk akal dalam produksi, jadi konfigurasi ini mungkin merupakan pengaturan produksi.
Sliq

3
Adakah yang bisa menjelaskan mengapa kinerja pengaturan yang disarankan lebih buruk daripada standar atau kapan mereka harus mulai memberi efek?
RP

19

Saya akan memasukkan dua sen saya untuk apa yang saya gunakan opcache.

Saya telah membuat kerangka kerja yang luas dengan banyak bidang dan metode validasi dan enum untuk dapat berbicara dengan basis data saya.

Tanpa opcache

Saat menggunakan skrip ini tanpa opcache dan saya mendorong 9000 permintaan dalam 2,8 detik ke server apache, maka maks. Keluar pada 90-100% cpu selama 70-80 detik hingga memenuhi semua permintaan.

Total time taken: 76085 milliseconds(76 seconds)

Dengan opcache diaktifkan

Dengan opcache diaktifkan, beroperasi pada waktu cpu 25-30% selama sekitar 25 detik dan tidak pernah melewati penggunaan cpu 25%.

Total time taken: 26490 milliseconds(26 seconds)

Saya telah membuat file blacklist opcache untuk menonaktifkan caching semua kecuali kerangka yang semuanya statis dan tidak perlu mengubah fungsionalitas. Saya memilih secara eksplisit untuk hanya file kerangka sehingga saya dapat mengembangkan tanpa khawatir tentang memuat ulang / memvalidasi file cache. Setelah semuanya di-cache menghemat satu detik dari total permintaan25546 milliseconds

Ini secara signifikan memperluas jumlah data / permintaan saya dapat menangani per detik tanpa server bahkan berkeringat.


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;Cukup ganti; dengan enter di file ini. Tapi inilah yang saya gunakan. sebagian besar barang bawaan
Tschallacka

1
btw, saya menjalankan ini dengan memcache melakukan 2100 permintaan basis data per detik menjalankan skrip yang saya gunakan dalam 150 mikrodetik (sekitar
1/6

1
Opcache menyimpan file php dalam bentuk yang dikompilasi dalam memori. Jadi Anda tidak perlu membaca dari disk dan mengkompilasi & mengoptimalkan file oleh parser php lagi. Memcache adalah sesuatu yang dapat Anda gunakan untuk menyimpan variabel di antara sesi. Katakanlah misalnya pengguna memiliki skrip pembaruan yang meminta parameter yang sama selama 10 detik sementara pengguna menatap layar. Anda dapat menggunakan mem cache untuk mengkompilasi permintaan sekali, dan kemudian terus meminta permintaan dikompilasi dari memori bukan dari regenerasi itu.
Tschallacka

2
tidak. opcache.revalidate_freq=60;menentukan berapa lama file dapat hidup dalam memori dalam hitungan detik. ketika waktu habis itu mengkompilasi ulang file.
Tschallacka

3
Sebenarnya, opcache.revalidate_freqkontrol seberapa sering skrip diperiksa untuk perubahan (berdasarkan apakah timestamp-nya berubah). Jadi jika stempel waktu skrip tetap sama dengan terakhir kali kompilasi, skrip tidak akan dikompilasi ulang. Semua ini dengan asumsi Anda belum mengubah opcache.validate_timestampspengaturan, yang diaktifkan secara default.
jjlin

4

Dengan PHP 5.6 di Amazon Linux (harus sama dengan RedHat atau CentOS):

yum install php56-opcache

dan kemudian restart apache.


2

Saya mengalami ini ketika mengatur moodle. Saya menambahkan baris berikut dalam file 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/en/book.intl.php


1
Mungkin perlu dicatat bahwa pengaturan ini didokumentasikan di sini: docs.moodle.org/30/en/OPcache
sierrasdetandil

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.