为什么while循环或其他长循环会阻止PHP中的后续请求?

时间:2012-05-07 23:13:50

标签: php ajax

会话ID是否会阻止同一会话同时拥有多个请求/线程?它是如何运作的?

我的应用程序的某个控制器类的方法中有一个循环,它循环等待某些操作(检查数据库)。

我需要查看代码,以下是方法内部代码的摘录:

// Times in hundredths of seconds.
$timestamp = number_format(microtime(TRUE), 2, '', '');
$closing_time = $timestamp + ($auditorium_lot_timeout * 100);

// Loop until time's up.
do
{
  usleep(250000); // Sleep 250ms to unload the CPU.
  if (Model_Event::count_new_bids())
  {
    // Etc, etc, etc...
    // Change closing time to wait 10 seconds more.
  }
} while (number_format(microtime(true), 2, '', '') < $closing_time);

// After time's up, continue with closing the bids definitely.
// Perform some more actions.

AJAX请求此摘录所属的方法。它的目的是关闭拍卖竞标,但在结束前等待几秒钟,以便为最后一次竞标提供机会。为此,它循环一个预先配置的时间(如30秒),当它循环时,整个应用程序无法接收来自同一用户的任何其他请求。这是为什么?它非常困难,因为这个用户是现场拍卖的运营商/拍卖者,必须向没有在线参与的用户发送“出价”请求(但在真正的礼堂中是必要的),同时他触发了这个循环。

更新: JS请求代码由CanJS models抽象。

1 个答案:

答案 0 :(得分:1)

这是因为如果某些请求仍然使用会话文件,内置会话机制会锁定会话文件。

因此,您可能的解决方案是通过session_write_close()

在长期生活代码中发布会话

<子> PS:哦,还没有看到来自@chris的评论。作为一个理由,我把这个链接作为一个偷窃的答案,这证明我之前回答了类似的问题:https://stackoverflow.com/a/6405685/251311