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

相同PHP脚本上的并行请求会导致第二次长延迟,php,apache,request,concatenation,minify,Php,Apache,Request,Concatenation,Minify,背景 这件事让我疯狂了好几个星期。我使用MrClay的PHP缩小脚本来缩小和连接我的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年的缓存,因此

背景

这件事让我疯狂了好几个星期。我使用MrClay的PHP缩小脚本来缩小和连接我的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中的时间较晚的一个,但这不是一个规则

请参见以下屏幕截图:

我可以让服务器将另一个文件放入队列,在第一个文件之后再处理它,但这并不需要一整秒钟。 还有几件事:在这种情况下,没有执行像concatation或gzip这样的操作。。该脚本仅对现有预gzip文件执行fpassthru()。然而,这并不是一直都会发生。。这有点奇怪,如果我连续加载大量页面,比如30个或更多,当两个文件都在很短的时间内处理时,它会回到“正常”状态。过了一段时间,当我检查时,它又回到了第二个挂起状态时间总是一秒多一点

我已经尝试过的

  • 如果($_GET[“g”]=“js”)退出,则放入
    位于脚本开头的右侧
  • 没错,那没用。文件仍然延迟,没有输出任何内容。只要
    退出(对于这两个文件)但都有效…:)

  • 为脚本计时
  • 两次运行都报告其运行的最短时间(单位或数十毫秒),因此没有函数会延迟运行

  • 不同的服务器/主机
  • 没有帮助,3个不同的服务器和主机提供商。它与主机无关

  • 制作脚本的完整副本
  • 因此,我制作了完整脚本目录的副本,以确保两次运行都是由不同的文件集进行的-没有帮助

  • 禁用文件锁定并对脚本配置或脚本本身进行其他调整
  • 到目前为止,我什么都没想到:(

  • 不同的脚本-做其他事情
  • 这很有趣,修改文件以执行其他操作(例如,进行扫描并选择一个文件)也没有帮助。。另一项分析显示,PHP脚本每秒都被分配给空闲CPU线程。因此,如果有5个线程,并且需要同时运行6个脚本,那么前5个脚本将在l中完成ike 10毫秒,但第6个必须等待整整一秒钟才能开始处理…为什么会发生这种情况


    非常感谢您为帮助我所做的一切努力

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

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

  • 为此使用PHP会在服务器上造成不必要的负载
  • 浏览器仍在请求文件以获得304响应-服务器上再次出现不必要的负载并减少用户体验(这些请求仍然需要时间)
  • 很难建立一个好的缩小工具,也不需要重新发明轮子。更好的工具随时可用
  • 还有更多的原因
  • 我建议您最好不要把时间花在编写缩小脚本上,而是花在学习构建工具(Grunt或Gulp)上,这些工具将为您完成任务,并且远远超过您希望/能够用PHP编写的内容

    简而言之,整个过程的工作原理是

  • 您已将服务器设置为发送Expires标头。这将阻止客户端甚至请求更改文件。有关如何使用Apache执行此操作的谷歌信息:
  • 设置上面的工具来“构建”您的小型化资源—连接多个文件、“编译”样式表、小型化等。这样,您就可以将这些构建的文件存储在磁盘上,并直接由Web服务器提供服务
  • 您仅将网站设置为在生产中使用小型资源。(您希望能够在开发中调试完整的源代码)
  • 当您将任何更改部署到网站时

  • 设置此功能的技巧对于任何web开发人员来说都非常方便。此外,这将为您腾出时间来构建web应用程序本身。

    问题没有解决,但是我发现一个托管提供商根本没有出现此问题。这是一个托管问题,它必须与如何分配PHP线程有关对于请求-我的旧主机似乎只在一秒钟内完成了此操作。我现在只知道这些。

    您是否在脚本中使用会话?如果是,在一个脚本实例中打开的会话将阻止其他实例尝试访问同一会话。(通常的解决方案是在启动长时间运行的东西之前调用
    会话\u write\u close
    )。谢谢,但事实并非如此。您能否共享代码以供审阅和调试您编写的“3个不同的服务器和托管提供商。它与托管无关”,请列出