5

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

$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

4 回答 4

5

I've met similar situation several times. It looks like Session is blocked by your sleeping script.

How to solve it in CakePHP:
call session_write_close(); at the start of your script.
There is no way to do that via Cake's Session Component or Helper
Note: If something inside script uses session - Cake will reopen session and hang all requests that use same session again. In this case you will need to close session before sleep or before any operations that take a lot of time to be finished

于 2013-02-20T17:02:14.563 回答
1

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

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

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

  • 称呼session_start()
  • 读/写任何会话变量
  • 称呼session_write_close()
  • 做冗长的处理
于 2013-02-17T10:36:53.133 回答
0

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

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

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

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

于 2013-02-17T10:10:28.960 回答
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

于 2013-02-20T19:41:08.920 回答