使用 Symfony2 更改 cache_dir 和 log_dir

Posted

技术标签:

【中文标题】使用 Symfony2 更改 cache_dir 和 log_dir【英文标题】:Changing cache_dir and log_dir with Symfony2 【发布时间】:2011-11-13 12:02:00 【问题描述】:

由于部署限制,我希望我的 Symfony2 应用程序使用的日志和缓存目录位于我的文件系统中 /var/... 下的某个位置。出于这个原因,我正在寻找一种方法来配置 Symfony 并覆盖这两个目录的默认位置。

我看过 kernel.cache_dir 和 kernel.log_dir 并阅读了 Kernel.php 类。从我所见,我认为不可能通过配置更改目录位置,我必须修补 Kernel.php 类。

这是真的吗,或者有没有办法在不修改框架代码的情况下实现我想要的?

【问题讨论】:

【参考方案1】:

将以下方法添加到 app/AppKernel.php(AppKernel 扩展内核),使它们返回您的首选路径:

public function getCacheDir()

    return $this->rootDir . '/my_cache/' . $this->environment;


public function getLogDir()

    return $this->rootDir . '/my_logs';

【讨论】:

【参考方案2】:

我很高兴找到你的帖子,但我对无用的答案有点困惑。

我遇到了同样的问题,发现日志取决于配置参数 kernel.logs_dir.

所以我只是将它添加到我的config.yml 参数中:

kernel.logs_dir: /var/log/symfonyLogs

我希望它对你有帮助,即使它的答案很晚。

【讨论】:

【参考方案3】:

我认为最简单的方法是将文件夹链接到另一个地方。我们在 prod 服务器上做了这个,但是当你在 Windows 上进行本地开发时,设置符号链接有点复杂。

ln -s /var/cache/ /var/www/project/app/cache

类似的东西。

【讨论】:

我用ln -snf 很容易地解决了很多问题(比如Assetic 中的愚蠢错误),这是要走的路。【参考方案4】:

我想提供一个替代方案,那就是设置环境变量来更改这些目录。这种方式更容易根据舞台进行设置。 (测试、生产或开发)

export SYMFONY__KERNEL__CACHE_DIR "/your/directory/cache"
export SYMFONY__KERNEL__LOGS_DIR "/your/directory/logs"

环境变量也可以用SetEnv在虚拟主机中设置。 在读取内核参数时,symfony 会查找所有以 SYMFONY__ 开头的 $_SERVER 变量,去掉第一部分并将所有双下划线转换为 .

Source code

见第 568 至 608 行

【讨论】:

这是deprecated,自 3.3 版起【参考方案5】:

在 symfony 中,您可以通过扩展 AppKernel 中的方法来覆盖缓存(和日志)目录。

// 应用程序/appKernel.php 类 AppKernel 扩展内核 // ... 公共函数 getCacheDir() return $this->rootDir.'/'.$this->environment.'/cache';

查看http://symfony.com/doc/current/cookbook/configuration/override_dir_structure.html#override-cache-dir

【讨论】:

【参考方案6】:

我使用了configuration solution from Dragnic,但我将路径放在了parameters.yml 文件中,因为这个文件被git忽略了。换句话说,它没有从我的 PC 同步到 git 存储库,因此对 prod 环境没有影响。

# app/config/parameters.yml
parameters:
    database_driver: pdo_mysql
    [...]
    kernel.cache_dir: "T:/project/cache"
    kernel.logs_dir: "T:/project/logs"

配置:Windows7、WAMP 2.4 和 Symfony 2.3.20。

但你必须知道:

从您的配置文件中覆盖kernel.cache_dir 参数是一个非常糟糕的主意,并且不支持在 Symfony 中更改缓存文件夹的方式。

这会破坏事情,因为您现在将为内核 Kernel::getCacheDir() 和参数拥有不同的缓存文件夹。

来源:https://github.com/symfony/AsseticBundle/issues/370

所以你应该只在dev环境中使用它,如果你不想更改app/AppKernel.php文件的内容,否则请参阅其他答案。

【讨论】:

警告 => 坏主意!!!特别是如果您使用 Assetic:github.com/symfony/AsseticBundle/issues/370 @Oliboy50:谢谢,我更新了答案以警告用户。【参考方案7】:

没有接受的答案,而且是一个非常老的问题,但我在 google 上找到了它,所以我在这里发布了一种更新缓存目录和日志目录的方法,(source here)

remember, short syntax for arrays require php 5.4

您可以选择要修改的环境,并根据需要管理不同的缓存和日志目录

public function getCacheDir()

    if (in_array($this->environment, ['prod', 'test'])) 
    return '/tmp/cache/' .  $this->environment;


return parent::getCacheDir();


public function getLogDir()

    if (in_array($this->environment, ['prod', 'test'])) 
    return '/var/log/symfony/logs';


return parent::getLogDir();

【讨论】:

以上是关于使用 Symfony2 更改 cache_dir 和 log_dir的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:使用 ajax 和验证更改选择

通过验证更改用户密码( symfony2 )

Symfony2 在每个循环上更改元素样式

Payum Bundle:如何在 symfony2 中更改捕获操作的视图

如何刷新 Heroku buildpack CACHE_DIR?

getForm() symfony2.8 后更改表单对象默认参数的最佳实践