背景
这让我疯狂了几个星期。我使用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,但它不是一个规则。
请参阅以下屏幕截图:
我可以将服务器将其他文件放入队列并在第一个文件之后进行处理,但这不会花费一秒钟。 更多的事情:在这种情况下,没有执行像concatetion或gzipping这样的操作 ..脚本只执行现有pre-gzip文件的fpassthru()。它并不是一直都会发生..但它有点奇怪,如果我做了大量的连续页面加载,比如30或更多,它会回到"正常"当两个文件都在一个微不足道的时间处理。然后,当我检查一段时间后,它又回到了第二次挂起。 时间总是不到一秒。
我已尝试过的内容
if($_GET["g"]=="js") exit;
放在脚本的开头。多数民众赞成,没有任何帮助。该文件仍然延迟,没有输出任何内容。只是exit;
(对于这两个文件)然而有效......:)
两次运行报告其运行的最小时间(单位或数十毫秒),因此没有可以延迟它的功能。
没有帮助,3个不同的服务器和托管服务提供商。它不是托管相关的。
所以我制作了完整脚本目录的副本,以确保两个文件都是由不同的文件组成的 - 没有帮助。
到目前为止,我没有想出任何东西:(
这很有趣,修改文件以执行其他操作,例如做一个scandir并选择一个文件没有帮助。另一项分析显示,PHP脚本被分配给空闲的CPU线程每秒。所以如果有例如需要同时运行5个线程和6个脚本,前5个完成10个msecs,但是第6个必须等待整整一秒甚至开始被执行...为什么会发生这种情况?
非常感谢您为帮助我而做出的任何努力
答案 0 :(得分:3)
CBroe可能是对的。如果您正在使用会话(session_start()),PHP将一次只向一个客户端(session_id)提供一个请求。当一个请求被提供时,另一个请求排队,直到第一个请求写入会话。会话文件被锁定以防止多个请求写入同一会话,这可能导致意外结果。会话在脚本完成时或通过调用session_write_close()编写。这将为下次请求释放您的会话。
然而,我觉得有必要告诉你,你做错了。你不应该用PHP最小化JS和CSS。原因如下:
我建议您最好不要花时间编写缩小脚本,而是学习构建工具(Grunt或Gulp),这些工具将为您完成工作,而不仅仅是您希望/能够用PHP编写。
简而言之,整个过程如何运作
设置此功能的技巧对任何Web开发人员都非常方便。此外,这将为您自己构建Web应用程序腾出时间。
答案 1 :(得分:0)
问题尚未解决,但我找到了一个托管服务提供商,此问题根本不会出现。这是一个托管问题,它必须是如何将PHP线程分配给请求 - 似乎我的旧主机只用一秒钟的时间来做这个。那就是我现在所知道的。