APC कैश एंट्री कैसे साफ़ करें?


170

जब मैं साइट का नया संस्करण तैनात करता हूं तो मुझे सभी APC कैश प्रविष्टियों को साफ़ करने की आवश्यकता होती है। APC.php में सभी ओपकोड कैश को साफ़ करने के लिए एक बटन है, लेकिन मुझे सभी उपयोगकर्ता प्रविष्टियों, या सभी सिस्टम प्रविष्टियों या सभी प्रति-निर्देशिका प्रविष्टियों को साफ़ करने के लिए बटन नहीं दिखते हैं।

क्या कमांड-लाइन, या किसी अन्य तरीके से सभी कैश प्रविष्टियों को साफ़ करना संभव है?


1
मैं कैसे समाप्त हो गई प्रविष्टियों को साफ़ करने में रुचि रखता हूँ! आप एक ttl निर्दिष्ट कर सकते हैं, लेकिन php.net डॉक्टर का कहना है कि यह अगले अनुरोध पर समाप्त हो गया है जब यह समाप्त हो गया है ...
Surrican

जवाबों:


145

आप PHP फ़ंक्शन का उपयोग कर सकते हैं apc_clear_cache

कॉलिंग apc_clear_cache()से सिस्टम कैशे apc_clear_cache('user')क्लियर हो जाएगा और कॉलिंग से यूजर कैशे क्लियर हो जाएगा।


20
मुझे पता चला कि कमांड-लाइन के माध्यम से ऐसा करने के लिए आपको apc.ini पर जाकर सेट करना होगा: apc.enable_cli = 1
lo_fye

51
lo_fye: क्या यह वास्तव में काम करता है? मेरे अनुभव में, मैंने पाया कि एपीसी सीएलआई एपाचे के एपीसी कैश से पूरी तरह से अलग था - और ठीक ही इसलिए, क्योंकि कोई भी सीएलआई प्रक्रिया अपाचे से पूरी तरह से अलग प्रक्रिया में चलती है।
फ्रैंक किसान

9
फ्रैंक किसान: मैं पुष्टि करता हूं कि यह या तो Apache या Nginx के साथ काम करता है जो PHP 5.3.10 और PHP-FPM इंटरफ़ेस को चलाता है। मैंने एक शेल स्क्रिप्ट बनाई जो इस कमांड को निष्पादित करती हैphp -r "apc_clear_cache();"
एज़्रैस्पेक्ट्रे

13
यदि आप mod_php का उपयोग करके PHP चलाते हैं तो यह काम नहीं करता है। जिस कारण फ्रैंक किसान ने कहा।
डेविड

11
मैं Ubuntu सर्वर 12.04 को Nginx और PHP-FPM के साथ PHP संस्करण 5.4 के साथ चलाता हूं। apc_clear_cache () और apc_clear_cache ('उपयोगकर्ता') कमांड लाइन पर वेबसर्वर / वेबपेज के APC कैश को साफ़ नहीं करते हैं !!!
पीटर वोगेलेर

117

मुझे विश्वास नहीं है कि इनमें से कोई भी जवाब वास्तव में कमांड लाइन से एपीसी कैश को साफ करने के लिए काम करता है। जैसा कि फ्रैंक किसान ने ऊपर टिप्पणी की थी, सीएलआई अपाचे से अलग एक प्रक्रिया में चलता है।

कमांड लाइन से समाशोधन के लिए मेरा समाधान एक स्क्रिप्ट लिखना था जो एपीसी क्लियरिंग स्क्रिप्ट को webनिर्देशिका में कॉपी करता है और इसे एक्सेस करता है और फिर इसे हटा देता है। स्क्रिप्ट को स्थानीय होस्ट से एक्सेस किया जाना प्रतिबंधित है।

  1. apc_clear.php

    यह वह फाइल है जिसे स्क्रिप्ट वेब डायरेक्टरी में कॉपी करती है, एक्सेस करती है और डिलीट करती है।

    <?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. कैश क्लियरिंग स्क्रिप्ट

    यह स्क्रिप्ट वेब निर्देशिका के लिए apc_clear.php की प्रतिलिपि बनाती है, इसे एक्सेस करती है, फिर इसे हटा देती है। यह एक सिम्फनी कार्य पर आधारित है। सिम्फनी संस्करण में, कॉपी के सिम्फनी रूप में कॉल किए जाते हैं और अनलिंक करते हैं, जो त्रुटियों को संभालते हैं। आप चेक को जोड़ना चाहते हैं कि वे सफल हो सकते हैं।

    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
यदि आप उस का उपयोग कर रहे हैं तो आप बस सर्वर को पुनः आरंभ कर सकते हैं, जैसे कि Apache यदि आप mod_php या PHP FPM का उपयोग कर रहे हैं। आपका समाधान अधिक सुरुचिपूर्ण है (कोई सर्वर पुनरारंभ की आवश्यकता नहीं है) लेकिन अधिक जटिल :)
एल योबो

5
यह php-fpm / apache को पुनरारंभ करने की तुलना में अच्छा है क्योंकि इसमें आपके उपयोगकर्ता को sudo एक्सेस की आवश्यकता नहीं है। यदि आप कई सर्वरों पर तैनाती कर रहे हैं, तो प्रत्येक के लिए sudo पासवर्ड में टाइपिंग कर सकते हैं।
एंड्रयू

व्यक्तिगत रूप से मुझे sudo पासवर्ड टाइप करने में कोई दिक्कत नहीं है (मेरी तैनाती स्क्रिप्ट पासवर्ड को सहेजती है)। लेकिन मैं जितना हो सके डाउनटाइम से बचना चाहता हूं, इसीलिए मैं एपीसी फाइलों को फ्लश करने में दिलचस्पी रखता हूं। Nginx के लिए बिना किसी डाउनटाइम के पुनरारंभ करने का एक (नहीं-तो-आसान) तरीका है। मैं PGPfcgi के लिए नहीं जानता, लेकिन मुझे ऐसा नहीं लगता। क्या फ्लशिंग APC डाउनटाइम का कारण बनता है?
जुलिएन

@andrew आप अपना पासवर्ड टाइप किए बिना sudo का उपयोग करने के लिए अपने उपयोगकर्ता को कॉन्फ़िगर कर सकते हैं। हालांकि अगर एपीसी को मंजूरी देनी है, तो यह वास्तव में बेहतर है, जैसा कि जूलियन ने कहा।
चोकोडेवेलपर

1
@ जूलियन मुझे लगता है कि यह सर्वर लोड बढ़ा सकता है यदि आप सीपीयू गहन परिणाम या कुछ और संग्रहीत कर रहे हैं। मैं इसे पीक ऑवर पर नहीं करूंगा।
चोकोडेवेल्टर

68

मुझे पता है कि यह सभी के लिए नहीं है: लेकिन क्यों नहीं एक सुंदर अपाचे को फिर से शुरू करना है?

उदाहरण के लिए Centos / RedHat Linux के मामले में:

sudo service httpd graceful

उबंटू:

sudo service apache2 graceful

4
मुझे पता है कि यह आदर्श नहीं है, लेकिन मुझे खुशी है कि आपने एक त्वरित और गंदे समाधान के लिए इसका उल्लेख किया है।
ब्रायन पेटी

1
इस धागे को फिर से खोलने के लिए क्षमा करें, लेकिन मैं एक ही मुद्दे का सामना कर रहा हूं और मैं सोच रहा हूं कि एक क्रोनजॉब एक ​​सुंदर एपाचे 2 को फिर से शुरू करने के लिए आदर्श क्यों नहीं है? इस दृष्टिकोण के कुछ डाउनसाइड क्या हैं?
user2028856

@ user2028856 इसमें कुछ भी गलत नहीं है सिवाय इसके कि कुछ में हमेशा सर्वर का पूर्ण नियंत्रण नहीं हो सकता है। तो अगर यह आपके लिए काम करता है - इसका उपयोग करें।
तदस सासनकसक

@TadasSasnauskas "हमेशा सर्वर का पूर्ण नियंत्रण नहीं होने" से आपका क्या अभिप्राय है? मेरा मतलब है कि इसे हर आधे घंटे में चलाया जाएगा या इसलिए अपाचे को क्रोन बैकअप जैसे कुछ अन्य चल रहे कार्यों को क्रैश करने या तोड़ने का कारण होगा?
user2028856

@ user2028856 मेरा मतलब था कि कुछ लोग वेब सर्वर को पुनः आरंभ करने की क्षमता के बिना साझा सर्वर पर अपनी साइटों की मेजबानी कर सकते हैं। हर 30 मिनट के लिए सुशोभित दौड़ को फिर से शुरू किया जाना चाहिए, क्योंकि आप एपीसी सक्षम (लंबी कहानी संक्षेप में: कुछ मामलों में कर्नेल आतंक पैदा कर सकते हैं) के माध्यम से पृष्ठभूमि के श्रमिकों को नहीं चलाते हैं
ताड़ास सन्नौसकस

29

यह दस्तावेज़ीकरण में नहीं बताया गया है, लेकिन आपको जो ओपोड कैश करना चाहिए, उसे साफ़ करने के लिए:

apc_clear_cache('opcode');

संपादित करें: यह केवल एपीसी के कुछ पुराने संस्करणों पर लागू होता है।

कोई फर्क नहीं पड़ता कि आप किस संस्करण का उपयोग कर रहे हैं, आप php cli स्क्रिप्ट से mod_php या fastcgi APC कैश को साफ़ नहीं कर सकते हैं क्योंकि cli स्क्रिप्ट mod_php या fastcgi के रूप में एक अलग प्रक्रिया से चलेगी। आपको apc_clear_cache () प्रक्रिया (या चाइल्ड प्रोसेस) के भीतर से कॉल करना होगा, जिसके लिए आप कैश साफ़ करना चाहते हैं। सरल php स्क्रिप्ट को चलाने के लिए कर्ल का उपयोग करना एक ऐसा दृष्टिकोण है।


1
मुझे जोड़ना चाहिए, यदि आप mod_php चला रहे हैं और क्ली-मोड php के माध्यम से कैश को साफ़ करना चाहते हैं, तो आप वास्तव में ऐसा नहीं कर सकते हैं क्योंकि दोनों अलग-अलग वातावरण में चल रहे हैं। मेरा समाधान था कि cli मोड php कॉल http पर file_get_contents का उपयोग करके स्वयं हो। बदसूरत, लेकिन यह काम करता है।
कॉलिनम

बिना किसी वास्तविक http सर्वर को स्थापित किए बिना netcat कार्यों के साथ सीधे php-fpm के लिए एक वैध फास्टकेजी अनुरोध के एक डंप को पाइप करना, क्योंकि php-fpm सर्वर http एक से अलग हो सकता है
बालू

यह उत्तर गलत है। जैसे कि डॉक्यूमेंटेशन में बताया गया है कि ऑपकोड कैश हमेशा क्लियर किया जाता है अगर दिए गए पैरामीटर! = 'उपयोगकर्ता' है।
नौसिखिएर

@naitsirch शायद यह एक बग था जो नवीनतम संस्करण में तय किया गया है .. जिस समय मैंने उत्तर पोस्ट किया यह मेरे लिए काम कर रहा है। दुर्भाग्य से मुझे नहीं पता कि उस समय मैं किस संस्करण का उपयोग कर रहा था, लेकिन यह उत्तर जाहिरा तौर पर 25 अन्य लोगों के लिए उपयोगी है, जो उसी संस्करण का उपयोग करते हुए अनायास थे .. जो कि दस्तावेज़ीकरण हमेशा सही नहीं होता है और निश्चित रूप से पुराने संस्करणों के लिए हमेशा सही नहीं होता है।
कॉलिनएम

12

अगर आप apc कैश को कमांड में क्लियर करना चाहते हैं: (sudo का उपयोग करें यदि आपको इसकी आवश्यकता है)

APCu

php -r "apcu_clear_cache();" 

एपीसी

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

मुझे अपने टर्मिनल पर इस तरह की त्रुटि हो रही है कि कृपया मेरी मदद करें "PHP घातक त्रुटि: लाइन 1 पर कमांड लाइन कोड में अपरिभाषित फ़ंक्शन apc_clear_cache () पर कॉल करें"
RaviPatidar

1
आपको अपने एप का परीक्षण ठीक से "php -m | grep apc" के साथ स्थापित करना चाहिए
Léo Benoist

9

यदि आप एक NGINX / PHP-FPM स्टैक पर चल रहे हैं, तो आपका सबसे अच्छा शर्त शायद सिर्फ php-fpm को पुनः लोड करना है

service php-fpm reload (या जो कुछ भी आपके लोड कमांड आपके सिस्टम पर हो सकता है)


सेवा php5-fpm रीलोड वह काम है जो मुझे काम करता है मैंने apc.php स्टेटस फ़ाइल और कैश स्टेटस को चेक किया था रीसेट किया गया था मुझे ऐड ऑप्शन apc.stat = 0 से php.ini के बाद इसकी आवश्यकता थी
सलेम

5

एपीसी दस्तावेज़ में परिभाषित:

कैश रन साफ़ करने के लिए:

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

4

कमांड-लाइन उपयोग के लिए एक और संभावना, जिसका अभी तक उल्लेख नहीं किया गया है, वह है कर्ल का उपयोग करना।

यदि आप शेयर एप आदि स्क्रिप्ट का उपयोग कर रहे हैं तो यह सभी कैश प्रविष्टियों के लिए आपकी समस्या को हल नहीं करता है, लेकिन यह आपके द्वारा रखी गई एक अनुकूलित स्क्रिप्ट या किसी अन्य को कॉल कर सकता है।

यह opcode कैश को साफ करता है:

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

उपयोगकर्ता कैश को साफ़ करने के लिए OB पैरामीटर को 3 में बदलें:

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

एक स्क्रिप्ट में दोनों पंक्तियों को रखो और इसे अपने दूत में $ PASSWORD के साथ बुलाओ।


4

यदि आप परिणाम को json के माध्यम से मॉनिटर करना चाहते हैं, तो आप इस तरह की स्क्रिप्ट का उपयोग कर सकते हैं:

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

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, इस स्क्रिप्ट को http या कर्ल के माध्यम से कॉल करना होगा और यदि इसे आपके एप्लिकेशन के वेब रूट में उजागर किया गया है, तो आपको इसे सुरक्षित करना होगा। (आईपी टोकन द्वारा ...)


3

apc_clear_cache () केवल उसी php SAPI पर काम करता है जो आप चाहते हैं कि आप कैश को साफ़ कर दें। यदि आपके पास PHP-FPM है और आप apc cache क्लियर करना चाहते हैं, तो आप इसे php स्क्रिप्ट में से एक के माध्यम से करते हैं, कमांड लाइन नहीं, क्योंकि दोनों कैश अलग हो जाते हैं।

मैंने CacheTool लिखा है , एक कमांड लाइन टूल जो इस समस्या को हल करता है और एक कमांड से आप कमांडलाइन से अपने PHP-FPM APC कैश को साफ़ कर सकते हैं (यह आपके लिए php-fpm से जुड़ता है, और apc फ़ंक्शन को निष्पादित करता है)

यह ओपचे के लिए भी काम करता है।

देखें कि यह यहाँ कैसे काम करता है: http://gordalina.github.io/cachetool/


2

APC के स्थिर के पास अपने इंटरफ़ेस में कैश को साफ़ करने का विकल्प है। उन प्रविष्टियों को साफ़ करने के लिए आपको apc इंटरफ़ेस में लॉगिन करना होगा।

APC के पास apc.php फ़ाइल में उपयोगकर्ता नाम और पासवर्ड सेट करने का विकल्प है।

यहां छवि विवरण दर्ज करें


आपको यह पृष्ठ कहां से मिलेगा?
पचेरियर

यदि आप php-apcअपने सिस्टम में पैकेज स्थापित करते हैं तो @ स्पेसर आपको यह इंटरफ़ेस मिलेगा ।
अजनबी

2

यदि आप ubuntu के तहत fpm चलाते हैं, तो नीचे दिए गए कोड को चलाने की आवश्यकता है (12 और 14 पर जाँच की गई)

service php5-fpm reload

1

apc.ini

apststat = "1" APC को प्रत्येक अनुरोध पर स्क्रिप्ट को जांचने के लिए बाध्य करेगा, यह निर्धारित करने के लिए कि क्या इसे संशोधित किया गया है। यदि इसे संशोधित किया गया है तो यह नए संस्करण को फिर से जमा और कैश करेगा।

यदि यह सेटिंग बंद है, तो APC जाँच नहीं करेगा, जिसका अर्थ है कि APC को फ़ाइलों को रीचेक करने के लिए बाध्य करने के लिए, वेब सर्वर को फिर से शुरू करना होगा या कैश को मैन्युअल रूप से साफ़ करना होगा। ध्यान दें कि FastCGI वेब सर्वर कॉन्फ़िगरेशन पुनरारंभ पर कैश को साफ़ नहीं कर सकता है। एक उत्पादन सर्वर पर जहां स्क्रिप्ट फाइलें शायद ही कभी बदलती हैं, एक महत्वपूर्ण प्रदर्शन को बढ़ाया जा सकता है विकलांग आंकड़े।


1

नए APC व्यवस्थापक इंटरफ़ेस में उपयोगकर्ता कैश और ओपकोड कैश जोड़ने के विकल्प हैं, एक दिलचस्प कार्यक्षमता opCode कैश से निर्देशिका को जोड़ना / ताज़ा करना / हटाना है।

एपीसी एडमिन डॉक्यूमेंटेशन

यहां छवि विवरण दर्ज करें


0

मेरे लिए एक अच्छा समाधान केवल पुराने उपयोगकर्ता कैश का उपयोग नहीं करना था, तैनाती के बाद और अधिक।

यदि आप प्रत्येक कुंजी में उपसर्ग जोड़ते हैं, तो आप कैश प्रविष्टियों की डेटा संरचना को बदलने पर उपसर्ग बदल सकते हैं। यह आपको तैनाती पर निम्नलिखित व्यवहार प्राप्त करने में मदद करेगा:

  1. केवल अद्यतन संरचनाओं की तैनाती के बाद पुरानी कैश प्रविष्टियों का उपयोग न करें
  2. अपने पेज को धीमा नहीं करने के लिए पूरे कैश को परिनियोजित करें
  3. कुछ पुरानी कैश्ड प्रविष्टियों को आपकी तैनाती के बाद पुन: उपयोग किया जा सकता है (यदि प्रविष्टियां अपने आप पहले ही हटा नहीं दी गई थीं)
  4. APC समाप्ति के बाद या कैश की अनुपलब्ध जगह पर पुरानी कैश प्रविष्टियाँ निकाल देगा

यह केवल उपयोगकर्ता कैश के लिए संभव है।


0

APC.php फ़ाइल बनाएँ

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

इसे अपने ब्राउज़र से चलाएं।


2
जहां तक ​​मैं समझता हूं, सीएलआई उदाहरण एपीसी कैश मेमोरी सेगमेंट को साझा नहीं करेगा, इसलिए यह खाली, पृथक एपीसी कैश सेगमेंट के अलावा कुछ भी नहीं करेगा।
एबी कैरोल

डिस्ट्रोस और कॉन्फ़िगरेशन के आधार पर एपीसी कैश में अलग मेमोरी सेगमेंट हो सकता है, मैंने इसे अधिक सामान्य समाधान के लिए अपडेट किया है।
अंशुमान

0

सिम्फनी के लिए मेरा काम-आस-पास उसी सर्वर पर उदाहरणों की लूट का निर्माण करना है:

चरण 1. एक फ़ाइल ध्वज सेट करने के लिए ट्रिगर या कुछ बनाएं (जैसे। सिम्फनी कमांड) फिर बनाएं marker file..

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

चरण 2. प्रारंभ में अनुक्रमणिका फ़ाइल पर क्लियरिंग कोड जोड़ें और निकालें marker file

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

स्टेप 2. रन एप।


-1

एपीसी के साथ हमारे पास एक समस्या थी और फ़ाइलों के लिए सहानुभूति के लिए सहानुभूति - यह फाइलों में ही परिवर्तनों को नजरअंदाज करना प्रतीत होता है। किसी तरह फाइल पर टच परफॉर्म करने से खुद को मदद मिली। मैं नहीं बता सकता कि किसी फाइल को मोडिफाई करने और उसे छूने में क्या अंतर है, लेकिन किसी तरह यह जरूरी था ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.