PHP5.3与不同请求之间的FastCGI缓存问题

时间:2010-06-30 04:03:11

标签: caching fastcgi php-5.3

我设计了一个样式表/ javascript文件bundler和minifier,它使用一个简单的缓存机制。它只是将每个捆绑文件的时间戳写入文件,并比较这些时间戳以防止再次重写“主文件”。这样,在应用程序更新(这里是我的网站)之后,修改了CSS或JS文件,单个请求只会再次触发缓存一次。然后,所有其他请求将看到一个已编译的文件,例如master.css?v = 1234567。

问题是,在我的开发环境中,每个测试都通过,集成工作很好,一切都按预期工作。但是,在我的暂存环境中,在使用FastCGI编译的PHP5.3的服务器上,我的缓存文件似乎被无效数据重写,但仅在未从同一浏览器请求时才会被重写。

用例:

  • 我在Linux下在Firefox上发出了第一个请求。对于该浏览器上的所有其他请求,一切都按预期工作。
  • 一旦我在Windows / Linux(IE7,IE8,Chrome等)上发出请求,我的缓存文件就会获得无效数据,但只能在FastCGI下运行的登台服务器上,而不是在开发中!
  • 在Firefox上运行另一个请求会正确地重新传输文件。

我当时想知道,FastCGI与它有什么关系吗?我认为浏览器的客户端甚至操作系统与服务器端代码没有任何关系。

我知道这个问题是抽象地描述的,但粘贴任何具体的代码都会过于沉重,但如果可以解决我的问题,我会这样做。

我尝试远程调试我的代码,发现一切仍然按预期工作,即使缓存的文件也能正确编写。我看到当bug发生时,文件会被预期的数据写入,但是在php完成执行后两秒钟之后会被无效数据重写! -

有没有办法通过PHP函数禁用特定请求的FastCGI缓存?

1 个答案:

答案 0 :(得分:1)

根据您的环境,您可以在Apache中使用.htaccess查看工作,以常规cgi模式提供这些请求。这可能只需要一个简单的AddHandler和直接指向cgi的Action就可以完成。这种假设您正在部署到某种共享托管环境,在该环境中您无法直接访问Apache的配置。

由于fastcgi会持续一段时间,因此可能会在初始执行后的某个时间内破坏文件,尽管特定的错误可能超出了我的范围。

我知道,没什么帮助,但可能会给你一些想法......

编辑: 以下是我在下面的评论中的.htaccess代码

Options -Indexes +FollowSymLinks +ExecCGI
AddHandler php-cgi .php
Action php-cgi /cgi-bin/php5.cgi