2013-07-04 11 views
9

मुझे पता है कि ब्लेड पहले से ही सभी ब्लेड दृश्यों के लिए संकलित PHP को कैश करता है, लेकिन मैं इसे एक कदम आगे ले जाना चाहता हूं। एक वेबसाइट जो मैं काम कर रहा हूं उसे घटक दृश्यों में मॉड्यूलर किया गया है और फिर डिफ़ॉल्ट नियंत्रक में एक साथ पाई गई है। "विगेट्स" में से प्रत्येक का अपना विचार होता है, जो शायद ही कभी सामग्री बदलता है (कुछ बार अद्यतन करने वाले अपवाद के साथ)। इसलिए, मैं इन पेज लोड पर मूल्यांकन होने से रोकने के लिए इन दुर्लभ रूप से बदलते विचारों के HTML आउटपुट को कैश करना चाहता हूं।लैरवेल में कैशिंग व्यू आउटपुट 4

Laravel 3 में हम ऐसा कुछ कर सकता है (credit Laravel forums):

Event::listen(View::loader, function($bundle, $view) 
{ 
    return Cache::get($bundle.'::'.$view, View::file($bundle, $view, 
                Bundle::path($bundle).'view')); 
}); 

दुर्भाग्य से, View::loader पूरी तरह Laravel 4 में गायब हो गया है जब \Illuminate\View\View और \Illuminate\View\Environment के माध्यम से खुदाई, मुझे पता चला कि प्रत्येक दृश्य के नाम पर रखा गया एक घटना डिस्पैच "composing: {view_name}"

Event::listen('composing: *', function($view) { 
    if(!in_array($view->getName(), Config::get('view.alwaysFresh'))) { 
    // Hacky way of removing data that we didn't pass in 
    // that have nasty cyclic references (like __env, app, and errors) 
    $passedData = array_diff_key($view->getData(), $view->getEnvironment() 
                    ->getShared()); 

    return Cache::forever($view->getName() . json_encode($passedData), function() { 
     return 'test view data -- this should appear in the browser'; 
    }); 
}, 99); 

ऊपर दरकिनार नहीं करता है: इस घटना के लिए सुनकर तथापि कॉलबैक से लौट रहे एक ही प्रभाव नहीं है के रूप में यह Laravel 3 में किया था, देखने नाम और डेटा प्रत्येक दृश्य पर यह करने के लिए पारित किया जा रहा प्रस्तुत करना प्रदान करता है सामान्य दृश्य सहित और प्रतिपादन प्रक्रिया।

तो आप सामान्य दृश्य प्रतिपादन को कैसे रोक सकते हैं और इस रचनात्मक घटना से कैश की गई सामग्री को वापस कैसे कर सकते हैं? क्या यह वर्तमान में लारवेल में कुछ बदसूरत हैकरी के बिना संभव है?

+0

मैं पूछना अगर तुम एक तरह से फिर से बनाए गए दृश्य डेटा से बचने के लिए के रूप में में यह कर रहे हैं सकता है -

// Manual flushing Flatten::flushAll(); Flatten::flushPattern('users/.+'); Flatten::flushUrl('http://localhost/users/taylorotwell'); // Flushing via an UrlGenerator Flatten::flushRoute('user', 'taylorotwell'); Flatten::flushAction('[email protected]', 'taylorotwell'); // Flushing template sections (see below) Flatten::flushSection('articles'); 

लिंक करने के लिए: आप निम्न विधियों के माध्यम से ऐसा कर सकते हैं? क्या आपको अभी भी दृश्य बनाने के लिए डेटाबेस को हिट करने की आवश्यकता है, भले ही दृश्य परिणाम स्वयं कैश में सहेजा गया हो? सर्विसप्रोवाइडर और फेकाड्स (मैं +2 या +3 अगर मैं कर सकता था!) ​​के लिए एक बेहद विस्तृत मार्गदर्शिका के लिए – fideloper

उत्तर

34

त्वरित और गंदा

ठीक है, एक ही विकल्प, के रूप में मुझे यकीन है कि आप जानते हैं हूँ, नियंत्रकों के अंदर आइटम कैश करने के लिए के रूप में देखें गाया जा रहा है। मुझे संदेह है कि आप ऐसा नहीं करना चाहते हैं, क्योंकि यह लंबे समय तक कम रखरखाव योग्य है।

अधिक पोषणीय (?) विधि

हालांकि, अगर देखें लोडर/रेंडरर एक घटना जहाँ आप चाहते हैं आग नहीं है, आप बना सकते हैं। चूंकि लार्वेल 4 में प्रत्येक पैकेज/लाइब्रेरी ऐप कंटेनर में सेट है, इसलिए आप वास्तव में व्यू लाइब्रेरी को अपने आप से बदल सकते हैं।

चरणों मैं ले जाएगा है:

  1. एक पुस्तकालय/पैकेज बनाएँ। लक्ष्य एक वर्ग बनाना है जो लैरवेल के दृश्य तर्क को बढ़ाता है। एक नज़र डालने के बाद, आप this one का विस्तार करना चाहेंगे - यह View मुखौटा
  2. यदि आपने व्यू फ़ेडेड को अपने आप के साथ बढ़ाया है (उर्फ अगर चरण 1 में फ़ाइल पर मेरी धारणा सही है), तो आपको बस आवश्यकता होगी alias for View को app/config/app.php में अपने आप से बदलने के लिए।

संपादित करें- मैंने इस के साथ खेला। यद्यपि मैं एक परिणाम परिणाम कैशिंग के साथ जरूरी नहीं हूं, बनाम एसक्यूएल प्रश्न या "भारी लिफ्ट" बना रहा हूं, यहां मैं लैरवेल 4:

लार्वेल 4 में दृश्य प्रतिपादन एक ऐसी घटना को आग नहीं डालें जो हमें एक दृश्य के परिणाम को कैश करे। यहां एक दृश्य के परिणाम को कैश करने के लिए मैंने उस कार्यक्षमता में कैसे जोड़ा है।

आप किसी व्यू के परिणाम को कैशिंग करने की विधियों पर विचार करना चाह सकते हैं।उदाहरण के लिए, यह देखने के लिए आवश्यक डेटा प्राप्त करने के लिए डेटाबेस से बात करने के कड़ी मेहनत के आसपास नहीं मिलता है। किसी भी मामले में, यह मूल वस्तुओं को विस्तार या बदलने पर एक अच्छा अवलोकन देता है।

सबसे पहले, एक पैकेज बनाएं और इसकी ऑटोलोडिंग सेट करें। मैं नामस्थान Fideloper\View का उपयोग करूंगा। यह composer.json वसीयत में Autoloading है इस तरह दिखता है:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php" 
    ], 
    "psr-0": { 
     "Fideloper": "app/" 
    } 
}, 

इसके बाद, View मुखौटा बदलने के लिए एक वर्ग पैदा करते हैं। हमारे मामले में, इसका मतलब है कि हम Illuminate\View\Environment का विस्तार करेंगे।

इस कक्षा में, हम दृश्य के परिणाम का परिणाम लेंगे और इसे कैश (या कैश नहीं) में कुछ तर्क जोड़ देंगे। यहाँ Fideloper/View/Environment.php है:

<?php namespace Fideloper\View; 

use Illuminate\View\Environment as BaseEnvironment; 
use Illuminate\View\View; 

class Environment extends BaseEnvironment { 

    /** 
    * Get a evaluated view contents for the given view. 
    * 
    * @param string $view 
    * @param array $data 
    * @param array $mergeData 
    * @return \Illuminate\View\View 
    */ 
    public function make($view, $data = array(), $mergeData = array()) 
    { 
     $path = $this->finder->find($view); 

     $data = array_merge($mergeData, $this->parseData($data)); 

     $newView = new View($this, $this->getEngineFromPath($path), $view, $path, $data); 

     // Cache Logic Here 

     return $newView; 
    } 

} 

तो, कि जहां अपने काम के थोक होगा - कि // Cache Logic Here को भरना। हालांकि, हमारे पास कुछ नलसाजी करने के लिए छोड़ दिया गया है।

अगला, हमें फेकाडे के रूप में काम करने के लिए हमारी नई Environment कक्षा सेट अप करने की आवश्यकता है। मेरे पास creating Laravel facades पर एक ब्लॉग पोस्ट है। यहां इस मामले में इसे पूरा करने का तरीका बताया गया है:

हमारे नए पर्यावरण के लिए मुखौटा बनाएं। हम इसे कोड में fideloper.view नाम देंगे।

<?php namespace Fideloper\View; 

use Illuminate\Support\Facades\Facade; 

class ViewFacade extends Facade { 

    /** 
    * Get the registered name of the component. 
    * 
    * @return string 
    */ 
    protected static function getFacadeAccessor() { return 'fideloper.view'; } 

} 

फिर, सेवा प्रदाता जो Laravel बता देंगे जब fideloper.view कहा जाता है क्या बनाने के लिए पैदा करते हैं। ध्यान दें कि विस्तारित Environment कक्षा बनाने के लिए इसे Illuminate\View\ViewServiceProvider की कार्यक्षमता की नकल करने की आवश्यकता है।

<?php namespace Fideloper\View; 

use Illuminate\Support\ServiceProvider; 

class ViewServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app['fideloper.view'] = $this->app->share(function($app) 
     { 
      // Next we need to grab the engine resolver instance that will be used by the 
      // environment. The resolver will be used by an environment to get each of 
      // the various engine implementations such as plain PHP or Blade engine. 
      $resolver = $app['view.engine.resolver']; 

      $finder = $app['view.finder']; 

      $env = new Environment($resolver, $finder, $app['events']); 

      // We will also set the container instance on this view environment since the 
      // view composers may be classes registered in the container, which allows 
      // for great testable, flexible composers for the application developer. 
      $env->setContainer($app); 

      $env->share('app', $app); 

      return $env; 
     }); 
    } 

} 

अंत में, हम यह सब एक साथ हुक और Laravel बता हमारी सेवा प्रदाता लोड और अपने स्वयं के साथ रोशन के दृश्य मुखौटा बदलने के लिए की जरूरत है। संपादित app/config/app.php:

'providers' => array(

    // Other providers 

    'Fideloper\View\ViewServiceProvider', 

), 

हमारे अपने साथ देखें मुखौटा बदलें::

'aliases' => array(

    // Other Aliases 

    //'View'   => 'Illuminate\Support\Facades\View', 
    'View'   => 'Fideloper\View\ViewFacade', 

), 

फिर आप View::make() विधि में जो कुछ भी तर्क आप चाहते हैं का उपयोग कर सकेंगे

सेवा प्रदाता जोड़े !

अंत में

वेब अनुरोध के अनुसार कई "अनुरोध" में लोड करने के लिए कुछ पैटर्न देखते हैं कि यह ध्यान देने योग्य है। उदाहरण के लिए, सिम्फनी, आप define controllers as servers हैं। ज़ेंड ने एक्शन स्टैक्स की एक अवधारणा है (जो?) आपको

... अनुरोध के दौरान निष्पादित करने के लिए प्रभावी रूप से [नियंत्रक] कार्रवाइयों की कतार बनाने में आपकी सहायता करता है।

शायद आप लैरवेल के भीतर उस संभावना का पता लगाना चाहते हैं, और उन "क्रियाओं" के परिणाम कैश करना (सीधे दृश्य को कैशिंग करना)।

बस एक विचार, सिफारिश नहीं।

+0

+1 डेटाबेस हिट के परिणाम कैशिंग के लिए बेहतर भाग्य हो सकता है। मैं उनके बारे में पढ़ने से परहेज कर रहा हूं, लेकिन आपने मुझे अन्यथा विश्वास दिलाया है। इनका उपयोग करने के लिए यह एक अच्छा मामला है, और लैरवेल कार्यक्षमता को विस्तारित करने के लिए एक अच्छा कूद बिंदु। धन्यवाद! –

+0

और अपने प्रश्न का उत्तर देने के लिए हाँ मैं डीबी अनुरोधों को कैशिंग कर रहा हूं, इसलिए कैशिंग दृश्य आउटपुट की संभावना अनावश्यक माइक्रो-ऑप्टिमाइज़ेशन है। लेकिन, लैरवेल कार्यक्षमता को विस्तारित करने के लिए यह प्रक्रिया जानना अच्छा है। –

+0

मैं बस कुछ स्पष्ट करना चाहता हूं। देखें कैशिंग को डाटाबेस से बात करने की ज़रूरत होती है जब तक आपके पास ऐसी विधि होती है जो कैश किए गए एचटीएमएल के कैश किए गए राज्य और टाइमस्टैम्प को जांचती है। अपने नियंत्रक विधि में, आप मॉडलों से कुछ भी कॉल करने से पहले विधि के शीर्ष पर कैश स्थिति की जांच करें। यदि कैश स्थिति अभी भी मान्य है, तो सभी डीबी सामग्री को छोड़ दें, और केवल HTML को वापस करें। यदि कैश स्थिति अब मान्य नहीं है, तो सामान्य अनुरोध करें और परिणामों को दोबारा कैश करें। उदाहरण के लिए, आप Smarty का उपयोग कैसे करते हैं। – AgmLauncher

4

लैरवेल (और न केवल) में कैशिंग दृश्य/भागों के लिए एक पुस्तकालय है - Flatten।

यह रनटाइम पर पृष्ठों को कैशिंग करने के लिए एक शक्तिशाली कैश सिस्टम है। यह क्या करता है यह काफी सरल है: आप उसे बताते हैं कि कौन सा पृष्ठ कैश किया जाना है, जब कैश फिसल जाना है, और वहां से फ़्लैटन इसे सब संभालता है। यह चुपचाप अपने पृष्ठों को सादे HTML पर फ़्लैट करेगा और उन्हें स्टोर करेगा। ऐसा लगता है कि यदि कोई उपयोगकर्ता किसी ऐसे पृष्ठ पर जाता है जो पहले ही फ़्लैटेड हो चुका है, तो सभी PHP को एक साधारण HTML पृष्ठ प्रदर्शित करने के लिए हाईजैक किया गया है। यह आपके एप्लिकेशन की गति को एक आवश्यक बढ़ावा प्रदान करेगा, क्योंकि आपके पृष्ठ के कैश को केवल तब प्रदर्शित किया जाता है जब डेटा प्रदर्शित होने पर कोई परिवर्तन किया जाता है।

artisan flatten:build कमांड के माध्यम से अपने आवेदन में सभी अधिकृत पृष्ठों को कैश करने के लिए। यह आपके आवेदन को क्रॉल करेगा और पृष्ठ से पृष्ठ पर जायेगा, उन सभी पृष्ठों को कैश करेगा जिन्हें आपने अनुमति दी थी।

फ्लशिंग

कभी-कभी आप किसी विशिष्ट पृष्ठ या पैटर्न फ्लश करने के लिए कर सकते हैं। यदि प्रति उदाहरण आप अपने उपयोगकर्ताओं की प्रोफाइल को कैश करते हैं, तो आप उन लोगों को फ्लश करना चाहेंगे जब उपयोगकर्ता इसकी सूचनाओं को संपादित करता है। https://github.com/Anahkiasen/flatten

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