【问题标题】:Temp-Files in Symfony-Cache folderSymfony-Cache 文件夹中的临时文件
【发布时间】:2010-07-25 15:08:01
【问题描述】:

我在一些生产机器上使用 Windows(带有 FastCGI-PHP 的 IIS)。自从将一个 SF-Project 更新到 1.3.x 后,我注意到了一些奇怪的问题。服务器正在应用程序的 config-cache 文件夹中“收集”临时文件。它们被命名为 con1718.tmp 并且总是包含 autoload-config-cache。不会为每个请求生成 tmp 文件,但我每半小时左右就有 1 或 2 个新文件。如果应用程序运行了几天/几个月,就会有很多这样的临时文件(兆字节)。

机器详细信息:- Windows Server 2008 - IIS 7 - ZendServer?使用 PHP 5.2.11

SF 1.3.3 项目

任何想法可能是什么问题?

【问题讨论】:

  • 您知道吗,在 Windows 上,删除文件实际上需要单独的权限?检查相应的用户是否确实拥有临时目录的删除权限。
  • 是的,我知道这一点。我什至给了用户有关目录(Symfony 的缓存文件夹和所有子文件夹)的所有权限。有趣的部分是这个问题只发生在有时(不可重现),而不是每个请求:-(

标签: php windows iis symfony1


【解决方案1】:

我检查了 symfony 1.4 并在代码中看到了这一点:

     // Hack from Agavi (http://trac.agavi.org/changeset/3979)
     // With php < 5.2.6 on win32, renaming to an already existing file doesn't work, but copy does,
     // so we simply assume that when rename() fails that we are on win32 and try to use copy()
     if (!@rename($tmpFile, $cache))
     {
       if (copy($tmpFile, $cache))
       {
         unlink($tmpFile);
       }

     }

这段代码应该在 sfConfigCache.php 的第 354 行,你能检查一下你有这几行吗?如果没有,请考虑更新或修补,如果是,您可以在取消链接之前记录 $tmpFile,看看是否有人尝试取消链接这些文件。 要添加更多信息日志,您应该尝试以下代码:

 if (!@rename($tmpFile, $cache))
 {
   sfContext::getInstance()->getLogger()->info('attempt to renaming ' . $tmpFile . ' failed, trying copy');
   if (copy($tmpFile, $cache))
   {
     sfContext::getInstance()->getLogger()->info('copy successful, now unlinking ' . $tmpFile);
     unlink($tmpFile);
   }
   else
   {
     sfContext::getInstance()->getLogger()->err('probem with copy for file '.$tmpFile);
   }

 }

【讨论】:

  • 好的,所以可能是复制的问题。您可以尝试用我刚刚在答案中输入的代码替换这段代码,然后检查您的日志文件以了解发生了什么。
【解决方案2】:

'con1718.tmp' 看起来像是用tempnam PHP 函数生成的临时文件名:

tempnam('c:/tmp', 'con'); // produces something like c:\\tmp\con1234.tmp

我在 symfony 源上使用 grep 来查找此类调用,但没有找到任何带有 'con' 的 tempnam() 用法。也许它是您正在使用的插件之一?

【讨论】:

  • tempnam 未在我使用的任何插件中使用。但我在 sfConfigCache.php 中找到了它。但为什么它有时会失败本身就是一个奇迹......
【解决方案3】:

您可能正在运行 Windows Cache Extension for PHPWindows Cache Extension 1.1 for PHP 5.2Web Platform Installer 2.0 中) ?我注意到虽然这个包试图模仿广泛使用的 APC PHP 加速器的行为,但它确实消耗了大量资源并做了一些奇怪的事情,尤其是在奇怪的地方写入文件。我还没有将 symfony 和它混合在一起,但会在接下来的几周内完成。否则,我的规格与您的非常接近。

也许不是一个完整的答案,但如果它已安装,那么禁用它并重试怎么样?

【讨论】:

  • 我正在使用 APC。未安装 Windows 缓存扩展。我已经禁用 APC 一段时间了,但这并没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2012-06-08
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多