会话可能会导致PHP中的并发问题。
如果同一个客户端发送多个请求同时,和会话用于每个请求,PHP会话锁的存在会导致服务器的串行而非并行响应这些请求。这是因为,默认情况下,PHP使用文件来存储会话数据。每一个新的会话,PHP创建一个文件,将数据写入到它。所以,每一次你打电话给session_start()方法,你打开会话文件,获取文件的独占锁。这样,如果服务器脚本处理一个请求,和客户端发送另一个请求也需要使用会话,那么后者的要求将阻塞直到以前的请求处理完成,释放互斥锁的文件。不过,这是限制多来自同一客户端发请求,也就是说,从一个客户端请求不会阻止另一个客户端的请求。
如果脚本是短暂的,这通常是没有问题的。但是如果脚本运行时间更长,它可以是一个问题。在现代Web应用程序的发展,其中最常见的情况是使用Ajax技术来发送多个请求在同一页面上得到的数据。如果这些要求需要使用会话,然后第一个请求到达服务器后得到会话锁,和其他请求必须等待,所有的请求将被处理的串行,即使他们不是相互依赖。这将大大增加网页的响应时间。
为了避免这个问题的方法之一是调用session_write_close()方法立即关闭会话会话后使用。所以会话锁将被释放,即使当前的脚本还等待处理。重要的是要注意,当方法被调用时,当前脚本将无法会议进一步操作。
重要的是指出问题和观点的论述只适用于PHP默认的会话管理模式下使用session_start()方法。例如,有用户指出,如果应用程序托管在AWS EC2和DynamoDB是正确配置会话锁定的问题将不会出现。
以上是本文的全部内容,希望大家能喜欢。