我正在与PHP中的race condition保护作斗争。
我的应用程序是用symfony 1.4编写的,PHP会锁定会话数据,直到页面完成处理。我有一个长时间运行(~10秒)的登录脚本,我想显示一个进度条,显示用户在等待时正在做什么。 (我想实际显示正在做的事情,而不是使用标准的[虚假]加载栏。)
每当脚本调用session_start()
时,PHP都会锁定该用户的会话数据,直到该脚本完成为止。这可以防止我的状态检查ajax调用返回任何内容,直到更长的运行脚本完成。 (我的问题是为什么我的ajax调用不是异步的here。)
我已经设计了一种方法来做到这一点,但我想确保这种方式对于一般用途来说足够安全(即 - 这不是银行应用程序)。
我的想法是:
session_start()
的特殊页面上ping服务器。此页面将获取cookie值和客户端IP,并检查服务器端文件是否有任何状态更新。此解决方案是否存在明显的问题?
同样,从安全角度来看,即使有人攻击了这一切,他们也会得到一个代表登录进度状态的数字。
答案 0 :(得分:1)
我认为你提出的方法没有任何内在错误。
但如果您的计算机安装了APC,则可以使用apc_store
和apc_fetch
将您的状态存储在某种共享内存中,而不是写入磁盘。使用apc_store(SID, 'login not started')
之类的内容初始化并更新内存中的请求状态,然后apc_fetch(SID)
在后续请求中检索它。
还有其他共享内存系统,包括Apache,甚至数据库连接可能更简单。
答案 1 :(得分:0)
我遇到同样的问题,并认为诀窍是session_write_close()
释放会话文件。
请参阅我的https://github.com/jlaso/MySession存储库,并检查这是否适用于您的特定问题。