cakephp彗星usleep阻止一切

时间:2012-12-18 13:03:27

标签: php mysql cakephp comet

以下是我最终使用成功的彗星实现的代码。

$lastmodif = isset($this->params['form']['timestamp']) ? $this->params['form']['timestamp'] : 0;
$currentmodif = $already_updated[0]['Update']['lastmodified'];

while ($currentmodif <= $lastmodif)
{
    usleep(5000000);
    clearstatcache();
    $already_updated_new = $this->Update->find('all',array
    (
        'conditions' => array
        ( 
            'Update.receiver_id' =>  $this->Auth->user('id'),
            'Update.table_name' =>  "request_responses"
        )
    ));
    $currentmodif = $already_updated_new[0]['Update']['lastmodified'];
}

$already_updated[0]['Update']['lastmodified']是获取表的上次更新时间戳的查询结果。

在上面的代码中,$ lastmodif和$ currentmodif是每次成功的彗星响应后传递的时间戳。

但现在的问题是,当我点击同一页面上的其他链接时,没有任何反应,但是等待了很长时间才重定向。

我认为usleep阻止了其他HTTP请求。

我正在使用mysql和cakephp请大家指导我该怎么办才能解决这个问题。

我试图在调用页面时刷新,但是当输出已经发送时,它显示无法修改标题错误。

感谢。

4 个答案:

答案 0 :(得分:5)

我几次遇到过类似的情况。看起来Session被您的睡眠脚本阻止了。

如何在CakePHP中解决它:
在脚本开头调用session_write_close(); 没有办法通过Cake的Session Component或Helper来做到这一点 注意:如果脚本中的某些内容使用了session - Cake将重新打开会话并挂起再次使用同一会话的所有请求。在这种情况下,您需要在睡眠前或任何需要花费大量时间才能完成的操作之前关闭会话

答案 1 :(得分:1)

如果您的脚本使用会话,那么您可能会注意到这种行为。 PHP会锁定会话文件,直到脚本完成。

这意味着一旦脚本启动会话,任何其他尝试使用相同会话ID启动会话的脚本都将被阻止,直到前一个脚本释放锁(或终止)。

解决方法是在任何漫长的过程之前解锁会话:

  • 致电session_start()
  • 读/写任何会话变量
  • 致电session_write_close()
  • 做冗长的处理

答案 2 :(得分:0)

是的,usleep阻止了进一步的请求。根据您的托管环境,您可能拥有有限数量的进程。我假设您的聊天中有多个用户 - &gt;除非没有,否则它们都会发出阻止进程,这就是你的其他“链接”超时的原因。

我建议在客户端 - 浏览器端实现等待,例如

setTimeout(function() {
    fetchAndPrintTheNewChats();
}, 50000000);

在PHP代码中执行此操作的任何方法都会导致同样的问题。

答案 3 :(得分:0)

你可以分享你正在使用的cakephp版本,以防其他人出现可能有解决方案吗?

Cake有一个会话组件:http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html

和会话助手:http://book.cakephp.org/2.0/en/core-libraries/helpers/session.html