php 抓取网页ajax数据(内容什么是PHP?具体问题的解决方法总结什么?)
优采云 发布时间: 2022-04-02 20:25php 抓取网页ajax数据(内容什么是PHP?具体问题的解决方法总结什么?)
现在我们开发了很多依赖 Ajax 请求的应用程序,在某些情况下,甚至整个页面都依赖于 Ajax。有时我们会注意到,当一个网页发送两个或多个 Ajax 请求时,PHP 的响应时间会很长,并且会同时返回响应内容。
这个问题很可能是由您处理 PHP 会话的方式引起的,请按照本文了解问题并采取措施避免它。
内容 什么是 PHP 会话?什么是阿贾克斯?具体问题的原因和解决方法总结
什么是 PHP 会话?
为了理解这个问题,有必要首先了解 PHP 会话和 Ajax,以及它们是如何干扰的。
假设您正在开发一个 Web 应用程序并想要识别不同的用户。您想记住谁在没有登录的情况下每次访问了所有页面。在这种情况下,您可以使用 cookie 或会话。
正如您已经意识到的那样,会话是一种存储用户信息的方式,可以从任何页面检索。与 Cookie 不同,Session 存储在服务器上,所有用户都无法直接更改此信息。
默认情况下,会话一直有效,直到用户关闭浏览器,或者用户在 PHP 配置文件中指定的一段时间内处于非活动状态。
在 PHP 页面中,无论何时要存储或检索用户数据,都必须在页面的开头调用 session_start(),因此您有权使用 $_SESSION 来检索会话数据。
什么是阿贾克斯?
Ajax 代表异步 JavaScript 和 XML,它是一种无需重新加载整个页面即可向服务器发送和接收数据的方式。
我们使用这种方法以更快的速度从服务器发送数据和检索数据。我们不必获取整个页面并将其呈现在浏览器中,因为这很慢。
因此,我们可以更新页面的一部分并且用户可以看到更改,就像用户向下滚动 Facebook 时间轴页面以查看他们想要看到的内容一样,添加新内容而无需重新加载整个页面。
具体问题
开发几乎 100% 基于 Ajax 的 Web 应用程序并不是什么新鲜事,但是当一个网页同时发送两个或多个 Ajax 请求时,您会注意到请求需要很长时间并且几乎同时完成。
原因
当您希望服务器发送 Ajax 请求时,PHP 脚本也会启动 session_start(),它的调用将锁定 PHP 会话文件。
您可能已经知道,PHP 默认将会话数据存储在服务器上的文件中。由于只有一个 PHP 请求可以更改同一个会话文件,因此两个同时发生的 PHP 请求会导致典型的文件锁定情况,因此 PHP 调用的同一用户的任何其他 session_start() 请求都必须等到第一个请求结束。
现在,大多数 PHP 框架将首先在主文件中使用 session_start()。因此,如果您使用调用 session_start() 的框架或库,则会导致会话文件锁定,这将延迟使用同一浏览器的同一用户的并发 Ajax 请求。
问题的解决方案
调用 session_write_close() 函数会导致 PHP 写入会话文件并关闭它,因此释放会话文件后,另一个请求具有写入权限。
调用 session_write_close() 后,当前脚本会继续正常运行,但请注意,在调用 session_write_close() 后,不允许更改任何会话变量;在同一个脚本中,对 PHP 的其他并发请求可以锁定会话文件并更改会话变量。
为了向您展示此类问题,我创建了测试代码并将其上传到 github。你可以在这里找到测试脚本。在本地,您需要一个实例来使用测试代码,然后打开浏览器控制台以查看请求和响应时间。
正如我们在这个文件的示例代码中看到的那样,如果我们创建多个请求,如下面的代码......
session_start();
sleep(5);
来自同一用户的每个请求将等到前一个请求完成后再完成。这将需要 5 秒,因为在脚本完成之前不会释放会话文件。因此,第一次调用 session_start() 时,新的请求会被阻塞。那会扼杀异步请求的想法,即同时发送和执行多个请求。
如果将文件中的代码更改为:
session_start();
// do something useful here
session_write_close();
sleep(5);
第三行代码将释放会话文件锁,因此另一个并发请求可以运行而无需等待,因为它可以毫无问题地调用 session_start()。
总结
PHP 有点微妙,会让你担心为什么会发生奇怪的事情。但是一旦你理解了事情是如何运作的,这一切都是有意义的,你可以更好地思考解决问题。
翻译来源:
本文根据@Eslam Mahmoud 的“Fix the AJAX Requests that Make PHP Take Too Long to Respond”翻译。整个翻译收录了我自己的理解和想法。如果翻译的不好或者有什么不对的地方,请各位同仁指点。如需转载此译文,请注明英文出处: