执行ajax状态检查

时间:2011-02-25 02:39:19

标签: php ajax symfony-1.4 race-condition

我正在与PHP中的race condition保护作斗争。

我的应用程序是用symfony 1.4编写的,PHP会锁定会话数据,直到页面完成处理。我有一个长时间运行(~10秒)的登录脚本,我想显示一个进度条,显示用户在等待时正在做什么。 (我想实际显示正在做的事情,而不是使用标准的[虚假]加载栏。)

每当脚本调用session_start()时,PHP都会锁定该用户的会话数据,直到该脚本完成为止。这可以防止我的状态检查ajax调用返回任何内容,直到更长的运行脚本完成。 (我的问题是为什么我的ajax调用不是异步的here。)

我已经设计了一种方法来做到这一点,但我想确保这种方式对于一般用途来说足够安全(即 - 这不是银行应用程序)。

我的想法是:

  1. 关于用户名和身份验证的身份验证密码(在长登录脚本启动之前),在客户端计算机上使用唯一标识符设置cookie。
  2. 将同一个唯一标识符与客户端IP地址一起写入服务器上的文件。
  3. 当长登录脚本运行时,它将使用登录过程的状态更新该文件。
  4. ajax状态检查将在不使用session_start()的特殊页面上ping服务器。此页面将获取cookie值和客户端IP,并检查服务器端文件是否有任何状态更新。
  5. 此解决方案是否存在明显的问题?

    同样,从安全角度来看,即使有人攻击了这一切,他们也会得到一个代表登录进度状态的数字。

2 个答案:

答案 0 :(得分:1)

我认为你提出的方法没有任何内在错误。

但如果您的计算机安装了APC,则可以使用apc_storeapc_fetch将您的状态存储在某种共享内存中,而不是写入磁盘。使用apc_store(SID, 'login not started')之类的内容初始化并更新内存中的请求状态,然后apc_fetch(SID)在后​​续请求中检索它。

还有其他共享内存系统,包括Apache,甚至数据库连接可能更简单。

答案 1 :(得分:0)

我遇到同样的问题,并认为诀窍是session_write_close()释放会话文件。

请参阅我的https://github.com/jlaso/MySession存储库,并检查这是否适用于您的特定问题。