Symfony 应用程序将配置文件写入 tmp 目录

Symfony app writing config files to tmp directory

我继承了一个旧的 Symfony 应用程序 (Symfony 1.4),不得不将其迁移到新服务器。我没有使用 Symfony 的经验,但是迁移进行得很顺利,除了一件事之外一切正常;新服务器的管理员抱怨应用程序每分钟将文件写入 /tmp 目录:

管理员的部分示例输出:

-rw-------  1 www-data  www-data      17133 Dec 18 14:45 config_routing.yml.php4VSPbj
-rw-------  1 www-data  www-data      17133 Dec 18 14:47 config_routing.yml.php8ZZlxn
-rw-------  1 www-data  www-data      17133 Dec 18 14:38 config_routing.yml.php9NH03d
-rw-------  1 www-data  www-data      17133 Dec 18 14:38 config_routing.yml.phpGA9YrM
-rw-------  1 www-data  www-data      17133 Dec 18 14:45 config_routing.yml.phpO9fYz5
-rw-------  1 www-data  www-data      17133 Dec 18 14:47 config_routing.yml.phpOiXAYC
-rw-------  1 www-data  www-data      17133 Dec 18 14:43 config_routing.yml.phpptNyFw

还有这些文件:

config_settings.yml.php, config_databases.yml.php, config_autoload.yml.php.

我已经确保在生产环境中禁用了调试,但仍然会发生这种情况。有谁知道可能导致此问题的原因吗?

Symfony 创建了 yml 配置文件的缓存版本,因此它不必在每次请求时都重新解析它们。这在开发和生产中都会发生。

防止这些错误的最简单方法是为 Apache www-data 用户(或 Apache 运行 下的任何用户)启用写权限。例如:

sudo chmod 775 /tmp

或者,您可以通过 adding/modifying 以下行在 settings.yml 文件中禁用缓存:

prod: .settings: cache: false

如果您的应用覆盖了系统默认设置,则可能还需要在您的应用的配置文件中完成此操作。例如在文件 apps/frontend/config/settings.yml

似乎应用程序缓存目录不存在,tempnam() sfConfigCache 使用的功能 class 然后默认使用系统临时目录。

默认位置是 ./cache,创建它并使其可被 apache 写入。

要了解发生了什么,摘自 sfConfigCache class:

第 344 行:$tmpFile = tempnam(dirname($cache), basename($cache)); 此处创建了 /tmp/config_routing.yml.php* 个文件,稍后将重命名或复制几行:

if (!@rename($tmpFile, $cache))
{
  if (copy($tmpFile, $cache))
  {
    unlink($tmpFile);
  }
}

很明显,重命名和复制都失败了。