2014-05-23 87 views
0

動態參數我有一個日誌系統,多站點aplication取決於每個網站,我希望他們每個人都有自己的日誌文件,所以我做的是:緩存問題與config.yml

1)我使用config.yml中的動態變量取決於$_SERVER['HTTP_HOST']

config.yml:

imports: 
    - { resource: param.php } 

    ... 

monolog: 
    handlers: 
     user: 
      type: stream 
      path: %kernel.logs_dir%/%domain_name%.%log_filename% 
      channels: [user] 

=>%domain_name%是我的動態可變

2)I將其設置在應用程序/配置/ param.php:

<?php 

$url = $_SERVER['HTTP_HOST']; 

$domain = preg_replace('/^www./', '', $url); 

$container->setParameter('domain_name', $domain); // this set my variable `%domain_name%` with the current domain (ex: site1.com) 

問題:

此代碼正常工作,但whe n我切換到其他網站,%domain_name%的值保持等於其初始值。

例:

  • 我在www.site1.com =>%domain_name%值是 「site1.com」,所以它的工作原理 罰款
  • 我切換到www.site2.com =>%domain_name%值始終爲 「site1.com」 和 不是 「site2.com」

爲什麼?

緩存問題。事實上,在高速緩存config.yml Symfony的負載,它保持的%domain_name%

的第一個值刪除此值我必須執行以下命令:rm -rf app/cache/*但它不是一個解決方案。

那麼沒人有解決這個問題的辦法?謝謝

回答

0

我不太清楚,如果你正在使用參數文件/配置的預期。

對我有信息丟失,直接回答你的問題,所以這裏有兩種可能的情況:

1)網站www.site1.com和www.site2.com在相同的源指向(相同的服務器):

在這種情況下,我不會將domain_name定義爲配置值,當然它不是一個獨特的配置參數,它更像是一個變量。建立一個服務或考慮定義一個額外的環境。

2)www.site1.com和www.site2.com是兩個截然不同的項目:

在你不應該部署緩存目錄中的內容(你應該這樣做無論如何這種情況;但在這種情況下,這將是問題;))。

編輯 您可以實現不同的配置文件來解決:

  • config_site1.yml#配置爲www.site1.com
  • config_site2.yml#配置爲www.site2.com

您的/ web目錄中的控制器:

  • app_site1.php
  • app_site2.php

初始化AppKernel與請求的環境,並指向控制器的虛擬主機的配置或您的htaccess文件。 我想你可以在app.php控制器改變甚至是這樣的:

[...] 
require_once __DIR__.'/../app/AppKernel.php'; 

$request = Request::createFromGlobals(); 

$kernel = new AppKernel($request->giveMeMyHostEnvironmentMappingShizzle(), false); 
$kernel->loadClassCache(); 
[...] 

親切的問候

+0

我在第一種情況下,但我用獨白寫日誌,所以我必須定義路徑日誌文件中config.yml,我想,每個站點都有自己的日誌文件,所以我用這個動態的變量 – DOZ

+0

是好的,這就說得通了。 看看這裏:http://stackoverflow.com/questions/9516301/symfony2-how-can-i-use-different-parameters-ini-per-host-name 他們使用symfony2.0,因爲它看起來像,但這可以解決你的問題。這就像建議:定義一個額外的環境可以/應該是你的問題的最佳解決方案。 – user3463725

1

我們在我們的多站點CMS環境同樣的問題。 Symfony的主要是設計來運行網站,所以config.yml被運行一次,然後緩存。如果你注入動力參數到config.yml(通過任何方式:全局,常量,Apache的環境,等等)意味着,它們被緩存爲每個後續請求第一次運行:(所以接下來的獨特域站點請求後,將使用緩存值從第一個站點。在大多數情況下,這產生了問題。

有人建議爲每個站點創建不同的環境。但是當你託管站點的幾百,幾千或幾百萬那是不實際的。

替代緩存位置 目前,我們可以設想的最佳解決方案是針對每個站點的specify a different cache folder。因此,您擴展app/appKernel.php和自定義請使用getCacheDir函數。

//app/appKernel.php 
class AppKernel extends Kernel 
{ 
    public function getCacheDir() 
    { 
     return $this->rootDir.'/cache/'.$this->environment.'/'.$_SERVER['HTTP_HOST']; 
    } 
} 

請參閱API Reference for Kernel