gpt4 book ai didi

php - 对同一 PHP 脚本的并行请求导致第二次长时间延迟

转载 作者:可可西里 更新时间:2023-11-01 12:57:33 25 4
gpt4 key购买 nike

背景

这让我疯狂了好几个星期。我使用 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 (如果他们不改变,显然)。到目前为止一切正常。

问题

经常(遗憾的是并非总是如此),当我的浏览器请求这 2 个文件(同时完成)时,其中一个文件需要一秒钟才能返回。它始终是其请求较晚到达服务器的那个,因此它通常在 HTML 中靠后的那个,但这不是规则。

查看这些屏幕截图:

taken from my Firefox

test report by Pingdom

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

我已经尝试过的

  1. if($_GET["g"]=="js") exit; 放在脚本的开头。

没错,那是没用的。该文件仍然延迟,没有输出任何内容。只是 exit; (对于两个文件)但是有效...... :)

  1. 为脚本计时

两次运行都报告了它们运行的​​最短时间(单位或数十毫秒),因此没有任何函数会延迟它。

  1. 不同的服务器/主机

没有帮助,3 个不同的服务器和托管服务提供商。它与托管无关。

  1. 制作脚本的完整副本

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

  1. 禁用文件锁定和对脚本配置或脚本本身的其他调整。

到目前为止我还没有想出任何办法:(

  1. 不同的脚本 - 做其他事情。

这很有趣,修改文件来做其他事情,例如做一个 scandir 并选择一个文件也没有帮助。另一项分析表明,PHP 脚本每秒 都被分配给空闲 CPU 线程。所以如果有例如5 个线程和 6 个脚本需要同时运行,前 5 个在大约 10 毫秒内完成,但第 6 个必须等待整整一秒才能开始处理...为什么会这样?

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

最佳答案

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

但是,我觉得有必要告诉您,您做错了。您不应该使用 PHP 来最小化 JS 和 CSS。原因如下:

  1. 为此使用 PHP 会对服务器造成不必要的负载
  2. 浏览器仍在请求文件以获得 304 响应 - 再次对服务器造成不必要的负载并降低用户体验(这些请求仍然需要时间)
  3. 很难构建一个好的缩小工具,也没有必要重新发明轮子。更好的随时可用。
  4. 还有更多原因...

我建议您最好不要将时间花在编写缩小脚本上,而是花时间学习构建工具(Grunt 或 Gulp),它们将为您完成这项工作,而且比您希望/能够用 PHP 编写的功能多得多。

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

  1. 您将服务器设置为发送 Expires header 。这将阻止客户端甚至请求更改文件。 Google 了解如何使用 Apache 完成此操作:https://www.google.com/search?q=apache+expires+htaccess&ie=utf-8&oe=utf-8&gws_rd=cr&ei=y12dVrqKG8KvsAHFiKjYDA
  2. 设置上述工具以“构建”您的精简资源 - 连接多个文件、“编译”样式表、缩小等。因此您将这些构建的文件保存在磁盘上并由网络服务器直接提供。
  3. 您仅将网站设置为在生产中使用精简资源。 (您希望能够调试开发中的完整源代码)。
  4. 当您对网站进行任何更改时。

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

关于php - 对同一 PHP 脚本的并行请求导致第二次长时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34829444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com