2014-06-09 10 views
8

मैं अपने आवेदन के माध्यम से सिम्फनी 2 कैश को खाली करने की कोशिश कर रहा हूं जैसे कि मैं php app/console cache:clear कर रहा था।सिम्फनी 2 पर प्रोग्रामेटिक रूप से स्पष्ट कैश 2

//solution 1 
$process = new Process('php '.__DIR__.'/../../../../../app/console cache:clear'); 
$process->setTimeout(3600); 
$process->run(); 

//solution 2 
$input = new StringInput(null); 
$output = new NullConfigurationOutput(); 
$command = new CacheClearCommand(); 
$command->setContainer($container); 
$command->run($input, $output); 

//solution 3  
$container->get('cache_clearer')->clear($container->getParameter('kernel.cache_dir')); 

मैं भी rm -Rf कैश फ़ोल्डर के लिए कोशिश की है:

मैं जैसे कई अलग अलग समाधान, की कोशिश की है।

उनमें से कोई भी पूरी तरह से काम नहीं कर रहा है क्योंकि मुझे कई त्रुटियां मिल रही हैं। निम्न त्रुटि वह है जिसे मैं समाधान 2 पर प्राप्त कर रहा हूं (जो सबसे अच्छा प्रतीत होता है):

सत्र शुरू करने में विफल: पहले ही PHP ($ _SESSION सेट है) से शुरू हुआ।

ऐसा लगता है कि सिम्फनी पृष्ठ को पुनर्निर्माण करने या रेंडर प्रक्रिया के दौरान एप्लिकेशन को रीबूट करने की कोशिश कर रहा है।

कोई PHP कोड के माध्यम से कैश को कैसे साफ़ कर सकता है?

संपादित करें: मैं वास्तव में अपने रूटिंग सिस्टम की वजह से कैश को पुन: उत्पन्न करने की कोशिश कर रहा हूं। मैंने एक बंडल बनाया है जो एक सिम्फनी 2 रूट लेता है और एसईओ उद्देश्य के लिए इसे फिर से लिखने की संभावना जोड़ता है (उदाहरण: मेरे पास एक फ्रंटकॉन्टर मार्ग है जो इस श्रेणी के साथ/श्रेणी को इंगित करता है, मैं इसे श्रेणी-एसईओ-अनुकूलित करने के लिए फिर से लिख सकता हूं। एचटीएमएल)।

यदि मैं ऐसे मार्ग पर हूं जहां विशेष पैरामीटर की आवश्यकता है, जैसे कि आईडी, मुझे इसे फिर से लिखने के लिए इसके लिए एक विशेष मार्ग बनाना होगा। उदाहरण के लिए,/श्रेणी/3 के लिए मुझे एक मार्ग बनाने की आवश्यकता है जिसका नाम श्रेणी_3 है और .. सिम्फनी को यह जानने के लिए कि मैंने रूटिंग सिस्टम बदल दिया है, मुझे कैश साफ़ करना पड़ा।

+0

यहां उत्तर दिया गया: [Symfony2 में कंटेनर कैश को अमान्य कैसे करें?] (http://stackoverflow.com/questions/19995020/how-to-invalidate-container-cache-in-symfony2) –

उत्तर

5

बिल्कुल वही समस्या जो मेरे पास थी। मेरे लिए सरल समाधान था:

use Symfony\Component\Filesystem\Filesystem; 

और नियंत्रक में:

$fs = new Filesystem(); 
$fs->remove($this->container->getParameter('kernel.cache_dir')); 

यह वर्तमान वातावरण के लिए कैश निर्देशिका को नष्ट करेगा।

+3

इससे डाउनटाइम हो जाएगा उत्पादन सर्वर पर। –

3

इसी तरह का एक प्रश्न पहले से ही उत्तर दिया गया है: Symfony 2.4 execute Command from Controller - 20 मार्च को 15:37 बमैक्स का उत्तर दिया।

मैं परीक्षण किया है और pomaxa के कोड बढ़ाया गया है:

नियंत्रक कोड

use Symfony\Component\Console\Input\ArgvInput; 
use Symfony\Component\Console\Output\ConsoleOutput; 

$command = $this->container->get('yourservice.cache.clear'); 
//$dynamicEnvMode = $this->container->getParameter('kernel.environment') 
$staticEnvMode = 'dev'; // to use develop mode 
$staticEnvMode = 'prod --no-debug'; // to use production mode 
$input = new ArgvInput(array('--env=' . $staticEnvMode)); 
$output = new ConsoleOutput(); 
$command->run($input, $output); 

मैं स्थिर वातावरण मोड का इस्तेमाल किया और मैं इसके बजाय सेवा की CacheClearCommand वस्तु का उपयोग करने की कोशिश की है, लेकिन यह हेवन ' टी काम किया। कैश स्पष्ट ऑपरेशन लोड करने के लिए लंबे समय तक उपयोग कर सकता है, इसलिए सेवा का उपयोग करना बेहतर हो सकता है।

सर्वश्रेष्ठ तरीका कैश स्पष्ट किए बिना आपकी समस्या का समाधान करेगा। तेजी से बदलती इकाइयों, कार्यों या आपको जो भी चाहिए, ढूंढें, और उनके लिए कैशिंग अक्षम करें। यदि आप एक विस्तृत प्रश्न पोस्ट करते हैं (और लिंक को टिप्पणी में डालते हैं), तो आपको कैश और कहां अनदेखा करने की आवश्यकता क्यों है, तो मैं आपको एक और तरीका खोजने में मदद कर सकता हूं।

+0

धन्यवाद szecsikescso मैंने अभी अपनी पोस्ट को विवरण के साथ संपादित किया है। – user3348802

+2

ऐसा प्रतीत होता है कि यह समाधान सिम्फनी 3 पर लागू नहीं होता है। S3 ऐप में इसका परिणाम "फ़ाइल को हटाने में विफल" हुआ है ... \ var \ cache \ prod \ session \ sess _... ' – geoB

संबंधित मुद्दे