Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam tentang cara PHP Opcache berfungsi

Analisis mendalam tentang cara PHP Opcache berfungsi

藏色散人
藏色散人ke hadapan
2022-01-05 14:01:444216semak imbas

Dalam projek PHP, terutamanya dalam senario dengan konkurensi yang tinggi dan trafik yang besar, cara untuk meningkatkan masa tindak balas PHP adalah tugas yang sangat penting.

Opcache ialah komponen yang sangat diperlukan untuk mengoptimumkan prestasi PHP, terutamanya dalam projek yang menggunakan rangka kerja PHP.

1. Gambaran Keseluruhan

Sebelum memahami fungsi OPCache, kita perlu memahami PHP-FPM The mekanisme kerja Nginx , dan mekanisme tafsiran dan pelaksanaan skrip PHP.

1.1 PHP-FPM Mekanisme kerja Nginx

Permintaan diproses dari pelayar web ke Nginx, dan kemudian ke PHP keseluruhan proses adalah seperti berikut Lima langkah:

Langkah pertama: Mulakan perkhidmatan

  • Mulakan PHP-FPM. PHP-FPM menyokong dua mod komunikasi: soket TCP dan soket Unix;
  • PHP-FPM akan memulakan dua jenis proses : Proses induk dan proses Pekerja, yang pertama bertanggungjawab untuk memantau port, memperuntukkan tugas, dan mengurus proses Pekerja adalah program cgi PHP, bertanggungjawab untuk mentafsir, menyusun dan melaksanakan skrip PHP.
  • Mulakan Nginx. Pertama, modul ngx_http_fastcgi_module akan dimuatkan untuk memulakan persekitaran pelaksanaan FastCGI dan melaksanakan proksi permintaan protokol FastCGI
  • Nota di sini: proses pekerja fastcgi (proses cgi) diuruskan oleh PHP-FPM . Bukan Nginx. Nginx hanyalah proksi

Langkah 2: Permintaan => Nginx

  • Nginx menerima permintaan dan memilih pengendali yang sesuai berdasarkan lokasi konfigurasi
  • Berikut ialah pengendali PHP proksi

Langkah 3: Nginx => PHP-FPM

  • Nginx menterjemah permintaan Fastcgi permintaan
  • dihantar ke proses induk PHP-FPM melalui soket TCP/Soket Unix

Langkah 4: PHP-FPM Master => >

    Proses induk PHP-FPM menerima permintaan
  • menugaskan proses Worker untuk melaksanakan skrip PHP Jika
  • tidak mempunyai Pekerja terbiar, 502 ralat dikembalikan
  • Proses Pekerja (php-cgi) melaksanakan skrip PHP Jika
  • tamat, ralat 504 dikembalikan Pemprosesan selesai dan hasilnya dikembalikan
Langkah 5: Pekerja PHP-FPM => Nginx

Proses PHP-FPM Worker mengembalikan hasil pemprosesan dan menutup sambungan Menunggu permintaan seterusnya
  • Proses Master PHP-FPM mengembalikan hasil pemprosesan melalui Socket
  • Pengendali Nginx menghantar setiap respons secara berurutan. penimbal ke penapis pertama → kedua → dan seterusnya → akhirnya Respons dihantar kepada klien

1.2 Mekanisme penjelasan dan pelaksanaan skrip PHP Setelah memahami aliran pemprosesan keseluruhan PHP Nginx, kita Seterusnya, mari kita lihat proses pelaksanaan khusus skrip PHP

Pertama, mari kita lihat contoh:

Mari kita analisa proses pelaksanaan:

  • php memulakan pautan pelaksanaan, memulakan enjin Zend dan memuatkan modul sambungan berdaftar

  • Baca fail skrip selepas permulaan, enjin Zend melakukan analisis leksikal (lex), analisis sintaks (bison) pada fail skrip, menjana pokok sintaks

  • Enjin Zend menyusun pokok sintaks, menjana opcode,

  • Enjin Zend Laksanakan opcode dan kembalikan hasil pelaksanaan

Dalam mod cli PHP, setiap kali skrip PHP dilaksanakan, empat langkah akan dilaksanakan dalam urutan;

Dalam mod PHP-FPM, langkah 1) dilaksanakan sekali apabila PHP-FPM dimulakan dan tidak akan dilaksanakan dalam langkah 2)~4) dilaksanakan sekali untuk setiap permintaan;

Malah, pokok sintaks dan opcode yang dijana dalam langkah 2) dan 3), hasil skrip PHP yang sama adalah sama setiap kali ia dijalankan,

dalam mod PHP-FPM Seterusnya, setiap permintaan mesti diproses semula, yang merupakan pembaziran besar sumber sistem Jadi adakah ada cara untuk mengoptimumkannya?

Sudah tentu, seperti:

  • OPCache: dahulunya dikenali sebagai Zend Optimizer, ia adalah komponen sumber terbuka bagi Pelayan Zend, sangat disyorkan
  • APC: Cache PHP Alternatif ialah komponen caching opcode PHP yang terbuka dan percuma, digunakan untuk cache dan mengoptimumkan kod perantaraan PHP ia tidak lagi dikemas kini dan tidak disyorkan
  • APCu: Ia adalah cawangan APC, berkongsi memori; , cache data pengguna dan tidak boleh cache opcode , boleh digunakan dengan Opcache
  • eAccelerate: juga tidak dikemas kini, tidak disyorkan
  • xCache: tidak disyorkan lagi

2. Pengenalan kepada OPCache

OPCache ialah sambungan cache opcode yang terbuka dan percuma yang dihasilkan secara rasmi oleh Zend Ia juga mempunyai fungsi pengoptimuman kod, menghapuskan overhed pemuatan dan penghuraian skrip PHP setiap kali.

Pelanjutan OPcache telah digabungkan dalam PHP 5.5.0 dan versi seterusnya.

Cache dua jenis kandungan:

  • OPCode
  • Interned String, seperti ulasan, nama pembolehubah, dll.

3. Prinsip OPCache

Mekanisme utama caching OPCache ialah: Letakkan opcode yang dikompilasi ke dalam memori kongsi dan sediakan untuk proses lain untuk mengakses.

Ini melibatkan mekanisme perkongsian memori Selain itu, semua operasi sumber memori mempunyai isu penguncian.

3.1 Memori Dikongsi

Sistem UNIX/Linux menyediakan banyak cara untuk berkongsi memori antara proses:

  • Sistem -V shm API: Sistem V berkongsi memori,
    • sysv shm berterusan Melainkan dipadamkan secara eksplisit oleh proses, ia sentiasa wujud dalam ingatan sehingga sistem dimatikan; 🎜>mmap API:
    Memori yang dipetakan oleh mmap tidak berterusan Jika proses ditutup, pemetaan akan menjadi tidak sah melainkan ia telah dipetakan ke fail lebih awal mmap mekanisme ialah panggilan sistem standard POSIX Terdapat dua jenis pemetaan tanpa nama dan pemetaan fail
  • Kelebihan utama mmap ialah ia memetakan fail ke ruang alamat proses
    • untuk mengelakkan. data daripada penimbal pengguna ke Proses penyalinan penimbal cache halaman kernel
    • Sudah tentu, kelebihan lain ialah panggilan sistem baca/tulis yang kerap tidak diperlukan
    • API POSIX: Memori kongsi Sistem V sudah lapuk, memori kongsi POSIX menyediakan API yang lebih mudah digunakan dan direka bentuk lebih rasional.
    • API soket Unix
  • OPCache menggunakan tiga perkongsian pertama mekanisme memori, bergantung pada konfigurasi atau mod perkongsian memori mmap lalai.
  • Berdasarkan senario caching bytecode PHP, reka bentuk pengurusan memori OPCache adalah sangat mudah, dengan bacaan dan penulisan pantas, tiada pelepasan memori dan data tamat tempoh ditetapkan kepada Wasted.

Apabila memori Terbuang lebih besar daripada nilai yang ditetapkan, mekanisme OPCache dimulakan semula secara automatik, cache dikosongkan dan dijana semula.

3.2 Kunci Mutex

Sebarang operasi sumber memori melibatkan mekanisme kunci. Memori dikongsi: Hanya satu proses dibenarkan untuk melaksanakan operasi tulis dalam satu unit masa, dan berbilang proses dibenarkan untuk melaksanakan operasi baca Operasi tulis dilakukan pada masa yang sama dan baca operasi tidak disekat, jadi terdapat sangat sedikit keadaan terkunci.

Ini membawa kepada masalah lain: kod baharu, senario trafik yang besar, proses beratur untuk melaksanakan operasi opcode cache yang membawa kepada pembaziran sumber;

4. Tafsiran cache OPCache

OPCache ialah penyelesaian cache Opcode rasmi Selepas versi PHP5.5, ia telah dibungkus ke dalam kod sumber PHP dan dikeluarkan bersama .

Ia menyimpan kod bait dan data yang dijana oleh kompilasi PHP ke dalam memori dikongsi Pada setiap permintaan, kod op yang disusun dibaca terus daripada cache dan dilaksanakan. Tingkatkan kecekapan berjalan PHP dengan menyimpan proses penyusunan skrip.

Jika anda menggunakan sambungan APC untuk melakukan kerja yang sama, kini amat disyorkan untuk menggunakan OPCache, terutamanya dalam PHP7.

4.1 OPCode cache

Opcache akan cache OPCode dan kandungan berikut:

  • Fungsi yang terlibat dalam skrip PHP
  • Kelas yang ditakrifkan dalam skrip PHP
  • laluan fail skrip PHP
  • skrip PHP OPArray
  • Skrip PHP sendiri struktur/kandungan

4.2 Interned String cache

Pertama sekali kita perlu faham, apakah Interned String?

Dalam PHP5.4, mekanisme Interned String telah diperkenalkan untuk mengoptimumkan penyimpanan dan pemprosesan rentetan PHP.

Terutama apabila berurusan dengan ketulan rentetan yang besar, seperti doces PHP, Interned String boleh mengoptimumkan memori.

Rentetan Intern Kandungan cache termasuk: Nama pembolehubah, nama kelas, nama kaedah, rentetan, ulasan , dsb.

Dalam mod PHP-FPM, aksara cache String Interned dihadkan kepada dalam proses Worker.

Dan cache dalam OPCache, maka rentetan cache Interned String boleh digunakan antara proses Worker untuk menjimatkan memori.

Kita perlu memberi perhatian kepada satu perkara Dalam pembangunan PHP, biasanya terdapat bahagian besar komen, yang juga akan dicache dalam OPCache.

Anda boleh mematikan caching komen melalui konfigurasi php.ini.

Walau bagaimanapun, dalam rangka kerja seperti Zend Framework, akan merujuk ulasan, jadi sama ada untuk mematikan cache ulasan perlu dilayan secara berbeza.

5. Strategi kemas kini OPCache

ialah cache, yang mempunyai strategi tamat tempoh dan kemas kini.

Strategi kemas kini OPCache adalah sangat mudah Data tamat tempoh ditetapkan kepada Terbuang Apabila nilai yang ditetapkan dicapai, cache dikosongkan dan cache dibina semula.

Nota di sini: Dalam senario trafik tinggi, membina semula cache adalah tugas yang sangat memakan sumber.

OPCache tidak menghalang proses lain daripada membaca apabila mencipta cache.

Ini akan menyebabkan sejumlah besar proses mencipta cache baharu berulang kali. Oleh itu, Jangan tetapkan masa tamat OPCache

Setiap kali kod baharu dikeluarkan, cache akan dibuat berulang kali. Bagaimana untuk mengelakkannya?

  • Jangan keluarkan kod semasa tempoh puncak , ini adalah peraturan yang perlu dipatuhi dalam apa jua keadaan
  • Memanaskan kod, seperti menggunakan Skrip melaraskan URL akses PHP dalam kelompok, atau menggunakan API yang didedahkan oleh OPCache seperti opcache_compile_file() untuk penyusunan dan caching

6. Konfigurasi OPCache

6.1 Konfigurasi Memori

  • opcache.preferred_memory_model="mmap" OPcache modul memori pilihan. Jika dibiarkan kosong, OPcache akan memilih modul yang berkenaan Biasanya, pemilihan automatik sudah memadai. Nilai pilihan termasuk: mmap, shm, posix dan win32.
  • opcache.memory_consumption=64 Saiz memori kongsi OPcache, dalam megabait, lalai 64M
  • opcache.interned_strings_buffer=4 Saiz memori digunakan untuk menyimpan rentetan sementara, dalam Unit megabait, lalai 4M
  • opcache.max_wasted_percentage=5 Had atas memori terbuang, dalam peratusan. Jika had ini dicapai, OPcache akan menjana acara mulakan semula. Lalai5

6.2 Nombor dan saiz fail yang dibenarkan untuk dicache

  • opcache.max_accelerated_files=2000 Jadual cincang OPcache Bilangan maksimum fail skrip yang boleh disimpan. Nilai sebenar ialah nombor perdana pertama yang terdapat dalam set nombor perdana { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } yang lebih besar daripada atau sama dengan nilai yang ditetapkan. Nilai minimum julat nilai tetapan ialah 200, nilai maksimum ialah 100000 sebelum PHP 5.5.6 dan 1000000 selepas PHP 5.5.6. Nilai lalai 2000
  • opcache.max_file_size=0 Saiz fail maksimum cache dalam bait. Tetapkan kepada 0 untuk cache semua fail. Lalai 0

6.3 Cache berkaitan anotasi

  • opcache.load_comments boolean Jika dilumpuhkan, walaupun fail mengandungi ulasan, ulasan ini tidak akan dimuatkan. Pilihan ini boleh digunakan bersama opcache.save_comments untuk memuatkan kandungan anotasi atas permintaan.
  • opcache.fast_shutdown boolean Jika didayakan, acara penyambungan henti pantas akan digunakan. Apa yang dipanggil acara penyambungan semula henti cepat merujuk kepada modul pengurusan memori yang bergantung pada enjin Zend untuk melepaskan memori semua pembolehubah yang diminta sekaligus, dan bukannya melepaskan setiap blok memori yang diperuntukkan dalam urutan.

6.4 Konfigurasi cache tahap kedua

  • opcache.file_cache Konfigurasikan direktori cache peringkat kedua dan dayakan cache peringkat kedua. Mendayakan cache peringkat kedua boleh meningkatkan prestasi apabila memori SHM penuh, pelayan dimulakan semula atau SHM ditetapkan semula. Nilai lalai ialah rentetan kosong "", yang melumpuhkan caching berasaskan fail.
  • opcache.file_cache_only boolean Dayakan atau lumpuhkan caching opcode dalam memori kongsi.
  • opcache.file_cache_consistency_checks boolean Sama ada hendak mengesahkan jumlah semak fail semasa memuatkan skrip daripada cache fail.
  • opcache.file_cache_fallback boolean Pada platform Windows, apabila proses tidak dapat dilampirkan pada memori kongsi, caching berasaskan fail digunakan, iaitu: opcache.file_cache_only=1. Caching fail perlu didayakan secara eksplisit.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Analisis mendalam tentang cara PHP Opcache berfungsi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:awaimai.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam