对同一PHP脚本的并行请求会导致第二次长延迟

时间:2016-01-16 16:44:32

标签: php apache request concatenation minify

背景

这让我疯狂了几个星期。我使用MrClay的PHP Minify脚本来缩小和连接我的JS和CSS。它工作得很好,我的所有文件都合并到common.css和common.js中,它们是虚拟文件,翻译成链接到这样的脚本:

RewriteRule ^common.js$ /tynamic/min/?g=js [L,QSA]
RewriteRule ^common.css$ /tynamic/min/?g=css [L,QSA]

还附加了一个查询字符串来表示这些文件的版本,并且它们有3年的缓存时间,因此访问我网站的人可能永远不会在以后访问该网站时下载任何CSS或JS (如果他们不改变,显然)。到目前为止一切正常。

问题

经常(可悲地不总是),当我的浏览器要求这两个文件(这是同时完成)时,其中一个文件需要一秒钟才能返回。它总是请求稍后到达服务器的那个,所以它的通常是后面的HTML,但它不是一个规则。

请参阅以下屏幕截图:

taken from my Firefox

test report by Pingdom

我可以将服务器将其他文件放入队列并在第一个文件之后进行处理,但这不会花费一秒钟。 更多的事情:在这种情况下,没有执行像concatetion或gzipping这样的操作 ..脚本只执行现有pre-gzip文件的fpassthru()。它并不是一直都会发生..但它有点奇怪,如果我做了大量的连续页面加载,比如30或更多,它会回到"正常"当两个文件都在一个微不足道的时间处理。然后,当我检查一段时间后,它又回到了第二次挂起。 时间总是不到一秒

我已尝试过的内容

  1. if($_GET["g"]=="js") exit;放在脚本的开头。
  2. 多数民众赞成,没有任何帮助。该文件仍然延迟,没有输出任何内容。只是exit;(对于这两个文件)然而有效......:)

    1. 定时脚本
    2. 两次运行报告其运行的最小时间(单位或数十毫秒),因此没有可以延迟它的功能。

      1. 不同的服务器/托管
      2. 没有帮助,3个不同的服务器和托管服务提供商。它不是托管相关的。

        1. 制作剧本的完整副本
        2. 所以我制作了完整脚本目录的副本,以确保两个文件都是由不同的文件组成的 - 没有帮助。

          1. 禁用文件锁定,并对脚本配置或脚本本身进行其他调整。
          2. 到目前为止,我没有想出任何东西:(

            1. 不同的脚本 - 做其他事情。
            2. 这很有趣,修改文件以执行其他操作,例如做一个scandir并选择一个文件没有帮助。另一项分析显示,PHP脚本被分配给空闲的CPU线程每秒。所以如果有例如需要同时运行5个线程和6个脚本,前5个完成10个msecs,但是第6个必须等待整整一秒甚至开始被执行...为什么会发生这种情况?

              非常感谢您为帮助我而做出的任何努力

2 个答案:

答案 0 :(得分:3)

CBroe可能是对的。如果您正在使用会话(session_start()),PHP将一次只向一个客户端(session_id)提供一个请求。当一个请求被提供时,另一个请求排队,直到第一个请求写入会话。会话文件被锁定以防止多个请求写入同一会话,这可能导致意外结果。会话在脚本完成时或通过调用session_write_close()编写。这将为下次请求释放您的会话。

然而,我觉得有必要告诉你,你做错了。你不应该用PHP最小化JS和CSS。原因如下:

  1. 使用PHP导致服务器上出现不必要的负载
  2. 浏览器仍在请求文件获得304响应 - 服务器上再次出现不必要的负载并降低用户体验(这些请求仍需要时间)
  3. 很难建立一个好的缩小工具,没有必要重新发明轮子。一个更好的一个很容易获得。
  4. 还有更多理由......
  5. 我建议您最好不要花时间编写缩小脚本,而是学习构建工具(Grunt或Gulp),这些工具将为您完成工作,而不仅仅是您希望/能够用PHP编写。

    简而言之,整个过程如何运作

    1. 您将服务器设置为发送过期标头。这将阻止客户端甚至请求更改文件。谷歌如何使用Apache完成此任务:https://www.google.com/search?q=apache+expires+htaccess&ie=utf-8&oe=utf-8&gws_rd=cr&ei=y12dVrqKG8KvsAHFiKjYDA
    2. 设置上面的工具来“构建”你的缩小资源 - 连接多个文件,“编译”样式表,缩小等等。所以你将这些构建的文件放在磁盘上并由网络服务器直接提供。
    3. 您只需设置网站即可在生产中使用缩小的资源。 (您希望能够在开发中调试完整的源代码。)
    4. 当您对网站进行任何更改时。
    5. 设置此功能的技巧对任何Web开发人员都非常方便。此外,这将为您自己构建Web应用程序腾出时间。

答案 1 :(得分:0)

问题尚未解决,但我找到了一个托管服务提供商,此问题根本不会出现。这是一个托管问题,它必须是如何将PHP线程分配给请求 - 似乎我的旧主机只用一秒钟的时间来做这个。那就是我现在所知道的。