APC önbellek girdilerini nasıl temizleyebilirim?


170

Sitenin yeni bir sürümünü dağıtırken tüm APC önbellek girdilerini temizlemem gerekir. APC.php, tüm opcode önbelleklerini temizlemek için bir düğmeye sahiptir, ancak tüm Kullanıcı Girişlerini veya tüm Sistem Girişlerini veya tüm Dizin Başına Girişleri temizlemek için düğmeler görmüyorum.

Tüm önbellek girdilerini komut satırı üzerinden veya başka bir yolla silmek mümkün müdür?


1
ben süresi dolmuş girişleri temizlemek nasıl ilgilenen olurdu! bir ttl belirtebilirsiniz, ancak php.net doktor süresi dolduğunda bir sonraki istek üzerine silindiğini söylüyor ...
Surrican

Yanıtlar:


145

PHP işlevini kullanabilirsiniz apc_clear_cache.

Arayan apc_clear_cache()sistem önbelleği temizler ve çağıran apc_clear_cache('user')kullanıcı önbelleği temizler.


20
Bunu komut satırı üzerinden yapmak için apc.ini'ye gitmeniz ve şunu ayarlamanız gerektiğini keşfettim: apc.enable_cli = 1
lo_fye

51
lo_fye: Bu gerçekten işe yarıyor mu? Deneyimlerime göre, APC CLI'nın apache'nin APC önbelleğinden tamamen ayrı olduğunu gördüm - ve haklı olarak, herhangi bir CLI işlemi Apache'den tamamen ayrı bir işlemde çalıştığından.
Frank Farmer

9
Frank Farmer: Bunun PHP 5.3.10 ve PHP-FPM arayüzünü çalıştıran Apache veya Nginx ile çalıştığını onaylıyorum. Bu komutu yürüten bir kabuk komut dosyası oluşturdumphp -r "apc_clear_cache();"
ezraspectre

13
PHP mod_php kullanarak çalıştırırsanız bu çalışmaz. Frank Farmer bunun için belirtti.
David

11
Ubuntu Server 12.04'ü Nginx ile ve PHP-FPM'yi PHP sürüm 5.4 ile çalıştırıyorum. komut satırındaki apc_clear_cache () ve apc_clear_cache ('kullanıcı') web sunucusunun / web sayfalarının APC önbelleğini TEMİZLEMEZ !!!
Pieter Vogelaar

117

Bu yanıtların hiçbirinin APC önbelleğini komut satırından temizlemek için işe yaramadığına inanmıyorum. As Frank Farmer yukarıda yorumladı, bir işlemde CLI çalışır Apache'den ayırır.

Komut satırından temizleme çözümüm, bir APC temizleme komut dosyasını webdizine kopyalayıp erişen ve daha sonra silen bir komut dosyası yazmaktı . Komut dosyasına yerel ana bilgisayardan erişilmesi sınırlıdır.

  1. apc_clear.php

    Bu, komut dosyasının web dizinine kopyaladığı, eriştiği ve sildiği dosyadır.

    <?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. Önbellek temizleme komut dosyası

    Bu komut dosyası apc_clear.php dosyasını web dizinine kopyalar, bu dizine erişir ve siler. Bu bir Symfony görevine dayanmaktadır. Symfony sürümünde, hataları işleyen Symfony kopyalama ve bağlantı kaldırma formuna çağrılar yapılır. Başarılı olduklarını kontrol etmek isteyebilirsiniz.

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

8
Ayrıca sunucuyu yeniden başlatabilirsiniz, örneğin mod_php kullanıyorsanız Apache veya kullanıyorsanız PHP FPM. Çözümünüz daha zarif (sunucunun yeniden başlatılması gerekmez) ama daha karmaşık :)
El Yobo

5
Bu, php-fpm / apache'yi yeniden başlatmaktan daha iyidir, çünkü konuşlandırma kullanıcınızın sudo erişimine sahip olmasını gerektirmez. Birden fazla sunucuya dağıtıyorsanız, her biri için sudo şifresi yazmak yorucu olabilir.
andrew

Şahsen sudo parolasını yazmayı umursamıyorum (dağıtım betiğim parolayı kaydeder). Ama mümkün olduğunca kesinti sürelerinden kaçınmak istiyorum, bu yüzden APC dosyalarını yıkamakla ilgileniyorum. Nginx için, kesinti olmadan yeniden başlatmanın (o kadar kolay olmayan) bir yolu var. PGPfcgi'yi bilmiyorum, ama sanmıyorum. APC'nin yıkanması çalışmama süresine neden olur mu?
Julien

@andrew Şifrenizi, parolanızı yazmadan sudo kullanacak şekilde yapılandırabilirsiniz. APC'yi temizlemek tek gereken şey olsa da, Julien'in söylediği gibi, bu gerçekten daha iyi.
ChocoDeveloper

1
@Julien Eğer cpu yoğun sonuçları veya başka bir şey saklıyorsanız sunucu yükünü artırabilir sanırım. Yoğun bir saatte yapmazdım.
ChocoDeveloper

68

Bunun herkes için olmadığını biliyorum ama: neden zarif bir Apache yeniden başlatması yapmıyorsunuz?

Örneğin, Centos / RedHat Linux için:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

4
Bunun ideal olmadığını biliyorum, ama hızlı ve kirli bir çözüm için bundan bahsettiğinize sevindim.
Bryan Petty

1
Bu konuyu yeniden açtığım için üzgünüm ama aynı sorunla karşı karşıyayım ve neden bir cronjob zarif bir apache2 yeniden başlatma ideal hale getirmiyor merak ediyorum? Bu yaklaşımın dezavantajları nelerdir?
user2028856

@ user2028856 Bazıları her zaman sunucunun tam denetiminde olmayabilir, ancak bununla ilgili yanlış bir şey yoktur. Yani sizin için çalışıyorsa - kullanın.
Tadas Sasnauskas

@TadasSasnauskas "Sunucunun her zaman tam denetime sahip olmaması" ile ne demek istiyorsun? Yani her yarım saatte bir çalıştırmak apache'nin çökmesine veya cron yedekleme gibi diğer bazı eylemleri kırmasına neden olur mu?
user2028856

@ user2028856 Bazılarının web sunucusunu yeniden başlatma özelliği olmadan sitelerini paylaşılan sunucuda barındırabileceğini söyledim. Arka plan işçilerini apc etkinken cli aracılığıyla çalıştırmamanız durumunda her 30 dakikada bir zarif yeniden başlatma çalışıyor (uzun hikaye kısa: bazı durumlarda çekirdek paniğine neden olabilir)
Tadas Sasnauskas

29

Bu belgelerde belirtilmemiştir, ancak opcode önbelleğini temizlemek için yapmanız gerekenler:

apc_clear_cache('opcode');

EDIT: Bu sadece APC bazı eski sürümleri için geçerli gibi görünüyor.

Hangi sürümü kullanırsanız kullanın, cli komut dosyası mod_php veya fastcgi olarak farklı bir işlemden çalışacağından, mod_php veya fastcgi APC önbelleğini php cli komut dosyasından temizleyemezsiniz. Önbelleği temizlemek istediğiniz işlemin (veya alt işlemin) içinden apc_clear_cache () öğesini çağırmalısınız. Basit bir php betiği çalıştırmak için curl kullanmak böyle bir yaklaşımdır.


1
Mod_php çalıştırıyorsanız ve cli-mode php ile önbelleği temizlemek istiyorsanız, iki farklı ortamlarda çalıştığı için bunu gerçekten yapamazsınız. Benim çözüm cli_pp php file_get_contents kullanarak http üzerinden kendisini çağırmak oldu. Çirkin, ama işe yarıyor.
ColinM

Netcat ile geçerli bir fastcgi isteğinin doğrudan bir php-fpm'ye dökümü gerçek bir http sunucusu yüklemeye gerek kalmadan çalışır, çünkü php-fpm sunucusu http
one'dan

Bu cevap yanlış. Belgelerde açıklandığı gibi, verilen parametre! = 'Kullanıcı' ise opcode önbelleği her zaman temizlenir.
naitsirch

@naitsirch Belki de bu son sürümde düzeltilen bir hataydı .. Cevabı gönderdiğimde bu benim için işe yaradı. Ne yazık ki o anda hangi sürümü kullandığımı bilmiyorum ama görünüşe göre aynı sürümü kullandığım görünüşe göre 25 kişi için faydalıdır .. Belgeler her zaman doğru değildir ve kesinlikle eski sürümler için her zaman doğru değildir.
ColinM

12

Komutta apc önbelleğini temizlemek istiyorsanız: (gerekiyorsa sudo kullanın)

APCu

php -r "apcu_clear_cache();" 

APC

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"

Terminalimde bana bu şekilde yardım alıyorum lütfen "PHP Fatal error: 1 satırındaki Komut satırı kodunda tanımlanamayan fonksiyon apc_clear_cache () çağrısı"
RaviPatidar

1
Apc'nizin "php -m | grep apc" ile düzgün bir şekilde yüklendiğini test etmelisiniz
Léo Benoist

9

Bir NGINX / PHP-FPM yığınında çalışıyorsanız, en iyi seçenek muhtemelen sadece php-fpm'yi yeniden yüklemektir.

service php-fpm reload (veya yeniden yükleme komutunuz sisteminizde ne olursa olsun)


hizmet php5-fpm yeniden yükleme ne işe yarar ben apc.php durum dosyasını kontrol ve önbellek durumu sıfırlandı php.ini için apc.stat = 0 ekledikten sonra buna ihtiyacım vardı
Salem

5

APC Belgesinde tanımlandığı gibi:

Önbellek çalıştırmasını temizlemek için:

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

4

Komut satırı kullanımı için henüz bahsedilmeyen bir başka olasılık, curl kullanmaktır.

Bu, stock apc.php komut dosyasını kullanıyorsanız tüm önbellek girdileri için sorununuzu çözmez, ancak uyarlanmış bir komut dosyasını veya yerleştirdiğiniz başka bir komut dosyasını çağırabilir.

Bu, opcode önbelleğini temizler:

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

Kullanıcı önbelleğini temizlemek için OB parametresini 3 olarak değiştirin:

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

Her iki satırı bir betik içine koyun ve env'nize $ PASSWORD ile çağırın.


4

Sonuçları json ile izlemek istiyorsanız, bu tür komut dosyalarını kullanabilirsiniz:

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

Diğer yanıtlarda belirtildiği gibi, bu komut dosyasının http veya curl yoluyla çağrılması gerekir ve uygulamanızın web köküne maruz kaldığında güvence altına alınmanız gerekir. (ip tarafından, jeton ...)


3

apc_clear_cache () yalnızca önbelleğin temizlenmesini istediğiniz aynı php SAPI üzerinde çalışır. PHP-FPM'niz varsa ve apc önbelleğini temizlemek istiyorsanız, bunu iki önbellek ayrılmış olduğu için komut satırı DEĞİL php komut dosyalarından biri aracılığıyla yapmalısınız.

CacheTool , tam olarak bu sorunu çözen bir komut satırı aracı yazdım ve bir komutla PHP-FPM APC önbelleğini komut satırından temizleyebilirsiniz (sizin için php-fpm'ye bağlanır ve apc işlevlerini yürütür)

Aynı zamanda opcache için de çalışır.

Nasıl çalıştığını buradan görebilirsiniz: http://gordalina.github.io/cachetool/


2

APC'nin kararlılığı, arayüzünün kendisinde bir önbelleği temizleme seçeneğine sahiptir. Bu girişleri silmek için apc arayüzüne giriş yapmalısınız.

APC, apc.php dosyasında kullanıcı adı ve parola ayarlama seçeneğine sahiptir.

resim açıklamasını buraya girin


Bu sayfayı nereden alıyorsunuz?
Pacerier

@Pacerier php-apcSisteminizde paket kurulu ise bu arayüzü alacaksınız .
Yabancı

2

Ubuntu altında fpm çalıştırırsanız, aşağıdaki kodu çalıştırmanız gerekir (12 ve 14'te kontrol edilir)

service php5-fpm reload

1

apc.ini

apc.stat = "1", APC'yi değiştirilip değiştirilmediğini belirlemek için her istekte komut dosyasını statize etmeye (kontrol etmeye) zorlar. Değiştirilmişse, yeni sürümü yeniden derler ve önbelleğe alır.

Bu ayar kapalıysa, APC kontrol etmez, bu da genellikle APC'yi dosyaları yeniden kontrol etmeye zorlamak, web sunucusunun yeniden başlatılması veya önbelleğin manuel olarak temizlenmesi gerektiği anlamına gelir. FastCGI web sunucusu yapılandırmalarının yeniden başlatma sırasında önbelleği temizlemeyebileceğini unutmayın. Komut dosyası dosyalarının nadiren değiştiği bir üretim sunucusunda, devre dışı bırakılan istatistikler sayesinde önemli bir performans artışı elde edilebilir.


1

Yeni APC Yönetici arayüzü, kullanıcı önbelleği ve opcode önbelleği ekleme / temizleme seçeneklerine sahiptir, İlginç bir işlevsellik, opCode Cache'den direktör eklemek / yenilemek / silmek.

APC Yönetici Belgeleri

resim açıklamasını buraya girin


0

Benim için iyi bir çözüm, dağıtımdan sonra artık eski kullanıcı önbelleğini kullanmamaktı.

Her bir tuşunuza önek eklerseniz, önbellek girişlerinin veri yapısını değiştirme önekini değiştirebilirsiniz. Bu, konuşlandırmayla ilgili aşağıdaki davranışları elde etmenize yardımcı olacaktır:

  1. Yalnızca güncellenen yapıları dağıttıktan sonra eski önbellek girdilerini kullanmayın
  2. Sayfanızı yavaşlatmamak için dağıtımdaki önbelleğin tamamını temizlemeyin
  3. Bazı eski önbelleğe alınan girişler dağıtımınızı geri aldıktan sonra tekrar kullanılabilir (Girişler otomatik olarak kaldırılmadıysa)
  4. APC süresi dolduktan sonra VEYA eksik önbellek alanında eski önbellek girdilerini kaldıracak

Bu yalnızca kullanıcı önbelleği için mümkündür.


0

APC.php dosyası oluştur

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

Tarayıcınızdan çalıştırın.


2
Anladığım kadarıyla, CLI örneği aynı APC önbellek bellek segmentini paylaşmayacak, bu nedenle boş, izole bir APC önbellek segmentini temizlemek dışında hiçbir şey yapmayacak.
AB Carroll

dağıtımlara ve yapılandırmalara bağlı olarak APC önbelleği ayrı bir bellek segmentine sahip olabilir, daha genel bir çözüm için güncelledim.
anshuman

0

Symfony için benim çalışma etrafında aynı sunucuda örnekleri yağma inşa:

Adım 1. Bir dosya bayrağı (örn. Symfony komutu) ayarlamak için tetikleyici veya başka bir şey oluşturun marker file.

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

Adım 2. Başlangıçta dizin dosyasına temizleme kodu ekleyin ve kaldırın marker file.

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

2. Adım. Uygulamayı çalıştırın.


-1

APC ve dosyalara sembolik bağlantılarla ilgili bir sorun yaşadık - dosyalardaki değişiklikleri görmezden geliyor gibi görünüyor. Bir şekilde dosyanın kendisine dokunmak yardımcı oldu. Bir dosyayı değiştirme ve ona dokunma arasındaki farkın ne olduğunu söyleyemem, ancak bir şekilde gerekliydi ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.