Bagaimana cara menghapus entri cache APC?

170

Saya perlu menghapus semua entri cache APC ketika saya menggunakan versi baru situs. APC.php memiliki tombol untuk menghapus semua cache opcode, tapi saya tidak melihat tombol untuk menghapus semua Entri Pengguna, atau semua Entri Sistem, atau semua Entri Per Direktori.

Apakah mungkin untuk menghapus semua entri cache melalui baris perintah, atau cara lain?

lo_fye
sumber
1
saya akan tertarik pada cara menghapus entri yang kadaluwarsa! Anda dapat menentukan ttl, tetapi php.net doc mengatakan itu dihapuskan atas permintaan berikutnya ketika telah kedaluwarsa ...
The Surrican

Jawaban:

145

Anda dapat menggunakan fungsi PHP apc_clear_cache.

Memanggil apc_clear_cache()akan menghapus cache sistem dan memanggil apc_clear_cache('user')akan menghapus cache pengguna.

Travis Beale
sumber
20
Saya menemukan bahwa untuk melakukan ini melalui command-line Anda harus masuk ke apc.ini dan mengatur: apc.enable_cli = 1
lo_fye
51
lo_fye: Apakah itu benar-benar berfungsi? Dalam pengalaman saya, saya menemukan bahwa APC CLI benar-benar terpisah dari cache APC apache - dan memang seharusnya begitu, karena setiap proses CLI berjalan dalam proses yang sepenuhnya terpisah dari Apache.
Frank Farmer
9
Frank Farmer: Saya mengkonfirmasi ini berfungsi baik dengan Apache atau Nginx yang menjalankan PHP 5.3.10 dan antarmuka PHP-FPM. Saya membuat skrip shell yang menjalankan perintah iniphp -r "apc_clear_cache();"
ezraspectre
13
Ini TIDAK berfungsi jika Anda menjalankan PHP menggunakan mod_php. Karena alasan itulah Frank Farmer menyatakan.
David
11
Saya menjalankan Ubuntu Server 12.04 dengan Nginx dan PHP-FPM dengan PHP versi 5.4. apc_clear_cache () dan apc_clear_cache ('user') pada baris perintah JANGAN hapus cache APC dari server web / halaman web !!!
Pieter Vogelaar
117

Saya tidak percaya salah satu dari jawaban ini benar-benar berfungsi untuk membersihkan cache APC dari baris perintah. Seperti yang dikomentari Frank Farmer di atas, CLI berjalan dalam proses yang terpisah dari Apache.

Solusi saya untuk membersihkan dari baris perintah adalah menulis skrip yang menyalin skrip kliring APC ke webdirektori dan mengaksesnya lalu menghapusnya. Script dibatasi untuk diakses dari localhost.

  1. apc_clear.php

    Ini adalah file yang disalin skrip ke direktori web, mengakses, dan menghapus.

    <?php
    if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
    {
      apc_clear_cache();
      apc_clear_cache('user');
      apc_clear_cache('opcode');
      echo json_encode(array('success' => true));
    }
    else
    {
      die('SUPER TOP SECRET');
    }
    
  2. Script kliring cache

    Skrip ini menyalin apc_clear.php ke direktori web, mengaksesnya, lalu menghapusnya. Ini didasarkan pada tugas Symfony. Dalam versi Symfony, panggilan dibuat ke bentuk salinan dan pembatalan tautan Symfony, yang menangani kesalahan. Anda mungkin ingin menambahkan cek bahwa mereka berhasil.

    copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory
    
    $url = 'http://localhost/apc_clear.php'; //use domain name as necessary
    $result = json_decode(file_get_contents($url));
    
    if (isset($result['success']) && $result['success'])
    {
      //handle success
    }
    else
    {
      //handle failure
    }
    
    unlink($apcPaths['web']);
    
Jeremy Kauffman
sumber
8
Anda juga dapat memulai ulang server, mis. Apache jika Anda menggunakan mod_php atau PHP FPM jika Anda menggunakannya. Solusi Anda lebih elegan (tidak perlu me-restart server) tetapi lebih rumit :)
El Yobo
5
Ini lebih baik daripada memulai kembali php-fpm / apache karena tidak mengharuskan pengguna penempatan Anda untuk memiliki akses sudo. Jika Anda menggunakan beberapa server, mengetikkan kata sandi sudo untuk masing-masing server bisa membuat Anda bosan.
andrew
Secara pribadi saya tidak keberatan mengetikkan kata sandi sudo (skrip penerapan saya menyimpan kata sandi). Tapi saya ingin menghindari downtime sebanyak mungkin, itu sebabnya saya tertarik membilas file APC. Untuk Nginx ada cara (tidak-begitu-mudah) untuk memulai kembali tanpa downtime. Saya tidak tahu untuk PGPfcgi, tapi saya rasa tidak. Apakah pembilasan APC menyebabkan downtime?
Julien
@danrew Anda dapat mengonfigurasi pengguna untuk menggunakan sudo tanpa mengetik kata sandi Anda. Meskipun jika hanya membersihkan APC, itu memang lebih baik, seperti yang dikatakan Julien.
ChocoDeveloper
1
@ Julien Saya kira itu dapat meningkatkan beban server jika Anda menyimpan hasil cpu intensif atau sesuatu. Saya tidak akan melakukannya pada jam sibuk.
ChocoDeveloper
68

Saya tahu ini bukan untuk semua orang, tetapi: mengapa tidak melakukan restart anggun Apache?

Untuk misalnya dalam kasus Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
Tadas Sasnauskas
sumber
4
Saya tahu ini tidak ideal, tapi saya senang Anda menyebutkan ini untuk solusi cepat dan kotor.
Bryan Petty
1
Maaf untuk membuka kembali utas ini tetapi saya dihadapkan dengan masalah yang sama dan saya bertanya-tanya mengapa bukan cronjob yang membuat apache2 anggun restart ideal? Apa saja kelemahan dari pendekatan ini?
user2028856
@ user2028856 Tidak ada yang salah dengan itu kecuali beberapa mungkin tidak selalu memiliki kontrol penuh terhadap server. Jadi jika itu berhasil untuk Anda - gunakanlah.
Tadas Sasnauskas
@TadasSasnauskas Apa yang Anda maksud dengan "tidak selalu memiliki kontrol penuh terhadap server."? Maksud saya akan menjalankannya setiap setengah jam atau lebih menyebabkan apache crash atau menghancurkan beberapa tindakan berjalan lainnya seperti cadangan cron?
user2028856
@ user2028856 Saya bermaksud bahwa beberapa mungkin meng-host situs mereka di server bersama tanpa kemampuan untuk me-restart server web. Menjalankan restart dengan anggun setiap 30 menit harus baik-baik saja mengingat Anda tidak menjalankan pekerja latar belakang melalui cli dengan apc diaktifkan (cerita panjang: dalam beberapa kasus dapat menyebabkan panik kernel)
Tadas Sasnauskas
29

Ini tidak dinyatakan dalam dokumentasi, tetapi untuk menghapus cache opcode Anda harus melakukan:

apc_clear_cache('opcode');

EDIT: Ini sepertinya hanya berlaku untuk beberapa versi APC yang lebih lama ..

Apa pun versi yang Anda gunakan, Anda tidak dapat menghapus mod_php atau fastcgi APC cache dari skrip php cli karena skrip cli akan dijalankan dari proses berbeda seperti mod_php atau fastcgi. Anda harus memanggil apc_clear_cache () dari dalam proses (atau proses anak) yang Anda ingin hapus cache. Menggunakan curl untuk menjalankan skrip php sederhana adalah salah satu pendekatannya.

Kolin
sumber
1
Saya harus menambahkan, jika Anda menjalankan mod_php dan ingin menghapus cache melalui cli-mode php, Anda tidak dapat melakukan ini karena keduanya berjalan di lingkungan yang berbeda. Solusi saya adalah memiliki cli mode panggilan php sendiri melalui http menggunakan file_get_contents. Jelek, tapi berhasil.
ColinM
Mem-pipe dump dari permintaan fastcgi yang valid secara langsung ke php-fpm dengan netcat berfungsi tanpa harus menginstal server http yang sebenarnya, karena server php-fpm mungkin terpisah dari http one
baloo
Jawaban ini salah. Seperti dijelaskan dalam dokumentasi, opcode cache selalu dihapus jika parameter yang diberikan adalah! = 'Pengguna'.
naitsirch
@naitsirch Mungkin ini adalah bug yang diperbaiki pada versi terbaru .. Pada saat saya memposting jawabannya, inilah yang berhasil bagi saya. Sayangnya saya tidak tahu versi apa yang saya gunakan pada saat itu tetapi jawaban ini tampaknya bermanfaat bagi 25 orang lain yang seolah-olah menggunakan versi yang sama dengan saya. Dokumentasi tidak selalu benar dan jelas tidak selalu benar untuk versi yang lebih lama.
ColinM
12

Jika Anda ingin menghapus cache apc dalam perintah: (gunakan sudo jika Anda membutuhkannya)

APCu

php -r "apcu_clear_cache();" 

APC

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
Léo Benoist
sumber
Saya mendapatkan kesalahan pada terminal saya seperti itu tolong bantu saya "PHP Fatal error: Panggil ke fungsi yang tidak ditentukan apc_clear_cache () dalam kode baris perintah pada baris 1"
RaviPatidar
1
Anda harus menguji apc Anda terinstal dengan benar dengan "php -m | grep apc"
Léo Benoist
9

Jika Anda menjalankan tumpukan NGINX / PHP-FPM, taruhan terbaik Anda adalah dengan memuat ulang php-fpm

service php-fpm reload (atau apa pun perintah muat ulang Anda di sistem Anda)

kode passion4code
sumber
layanan reload php5-fpm adalah apa yang membuatnya bekerja saya memeriksa file status apc.php dan status cache telah direset Saya membutuhkan ini setelah menambahkan opsi apc.stat = 0 ke php.ini
Salem
5

Sebagaimana didefinisikan dalam Dokumen APC:

Untuk menghapus proses cache:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
codersofthedark
sumber
4

Kemungkinan lain untuk penggunaan baris perintah, belum disebutkan, adalah menggunakan curl.

Ini tidak menyelesaikan masalah Anda untuk semua entri cache jika Anda menggunakan skrip stock apc.php, tetapi bisa memanggil skrip yang diadaptasi atau skrip lain yang telah Anda pasang.

Ini membersihkan cache opcode:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"

Ubah parameter OB ke 3 untuk menghapus cache pengguna:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"

Masukkan kedua baris dalam skrip dan sebut dengan $ PASSWORD di env Anda.

Andy Triggs
sumber
4

Jika Anda ingin memantau hasilnya melalui json, Anda dapat menggunakan skrip semacam ini:

<?php

$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);

Seperti disebutkan dalam jawaban lain, skrip ini harus dipanggil melalui http atau curl dan Anda harus diamankan jika terkena di root web aplikasi Anda. (dengan ip, token ...)

Gulungan
sumber
3

apc_clear_cache () hanya bekerja pada SAPI php yang sama dengan yang Anda ingin Anda cache dihapus. Jika Anda memiliki PHP-FPM dan ingin menghapus cache apc, Anda harus melakukannya melalui salah satu skrip php, BUKAN baris perintah, karena dua cache dipisahkan.

Saya telah menulis CacheTool , alat baris perintah yang memecahkan masalah ini dengan tepat dan dengan satu perintah Anda dapat menghapus cache PHP-FPM APC Anda dari baris perintah (itu terhubung ke php-fpm untuk Anda, dan menjalankan fungsi apc)

Ini juga berfungsi untuk opcache.

Lihat cara kerjanya di sini: http://gordalina.github.io/cachetool/

Samuel Gordalina
sumber
2

Stabil APC memiliki opsi untuk menghapus cache di antarmuka itu sendiri. Untuk menghapus entri tersebut, Anda harus masuk ke antarmuka APC.

APC memiliki opsi untuk mengatur nama pengguna dan kata sandi dalam file apc.php.

masukkan deskripsi gambar di sini

vinothvetrivel
sumber
Di mana Anda mendapatkan halaman ini?
Pacerier
@Pacerier Anda akan mendapatkan antarmuka ini jika Anda memiliki php-apcpaket yang terinstal di sistem Anda.
Stranger
2

jika Anda menjalankan fpm di bawah ubuntu, perlu menjalankan kode di bawah ini (diperiksa pada 12 dan 14)

service php5-fpm reload
hrnsky
sumber
1

apc.ini

apc.stat = "1" akan memaksa APC untuk membuat stat (memeriksa) skrip pada setiap permintaan untuk menentukan apakah telah dimodifikasi. Jika sudah dimodifikasi akan mengkompilasi ulang dan menyimpan versi yang baru.

Jika pengaturan ini tidak aktif, APC tidak akan memeriksa, yang biasanya berarti memaksa APC untuk memeriksa kembali file, server web harus direstart atau cache harus dibersihkan secara manual. Perhatikan bahwa konfigurasi server web FastCGI mungkin tidak menghapus cache saat restart. Pada server produksi di mana file skrip jarang berubah, peningkatan kinerja yang signifikan dapat dicapai oleh statistik yang dinonaktifkan.

mal
sumber
1

Antarmuka Admin APC baru memiliki opsi untuk menambah / menghapus cache pengguna dan cache opcode, Salah satu fungsinya yang menarik adalah menambah / menyegarkan / menghapus direktori dari opCode Cache

Dokumentasi Admin APC

masukkan deskripsi gambar di sini

Jithin Jose
sumber
0

Solusi yang baik bagi saya adalah tidak menggunakan lagi cache pengguna yang sudah usang setelah digunakan.

Jika Anda menambahkan awalan ke masing-masing tombol Anda, Anda dapat mengubah awalan tentang mengubah struktur data entri cache. Ini akan membantu Anda mendapatkan perilaku berikut saat digunakan:

  1. Jangan gunakan entri cache yang ketinggalan jaman setelah penerapan hanya struktur yang diperbarui
  2. Jangan bersihkan seluruh cache saat digunakan untuk tidak memperlambat halaman Anda
  3. Beberapa entri lama yang di-cache dapat digunakan kembali setelah mengembalikan penyebaran Anda (Jika entri tersebut belum dihapus secara otomatis)
  4. APC akan menghapus entri cache lama setelah kedaluwarsa ATAU pada ruang cache yang hilang

Ini hanya mungkin untuk cache pengguna.

mabe.berlin
sumber
0

Buat file APC.php

foreach(array('user','opcode','') as $v ){
    apc_clear_cache($v);
}

Jalankan dari browser Anda.

tidak manusiawi
sumber
2
Sejauh yang saya mengerti, instance CLI tidak akan berbagi segmen memori cache APC yang sama, jadi ini tidak akan melakukan apa pun selain membersihkan segmen cache APC yang kosong dan terisolasi.
AB Carroll
tergantung pada distro & konfigurasi cache APC mungkin memiliki segmen memori yang terpisah, saya memperbaruinya untuk solusi yang lebih umum.
anshuman
0

Pekerjaan saya di sekitar untuk Symfony build memiliki menjarah instance di server yang sama:

Langkah 1. Buat pemicu atau sesuatu untuk mengatur flag file (mis. Perintah Symfony) lalu buat marker file..

file_put_contents('clearAPCU','yes sir i can buggy')

Langkah 2. Pada file indeks saat mulai tambahkan kode kliring dan hapus marker file.

if(file_exists('clearAPCU')){
    apcu_clear_cache();
    unlink('clearAPCU');
}

Langkah 2. Jalankan aplikasi.

Ajsti.pl - Maciej Szewczyk
sumber
-1

Kami memiliki masalah dengan APC dan symlinks ke symlinks ke file - sepertinya mengabaikan perubahan dalam file itu sendiri. Entah bagaimana melakukan sentuhan pada file itu sendiri membantu. Saya tidak tahu apa perbedaan antara memodifikasi file dan menyentuhnya, tapi entah kenapa itu perlu ...

jakub.lopuszanski
sumber