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);
}
}
很明显,重命名和复制都失败了。
我继承了一个旧的 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);
}
}
很明显,重命名和复制都失败了。