【问题标题】:cakephp comet usleep blocks everythingcakephp彗星睡眠阻止一切
【发布时间】:2012-12-05 16:49:05
【问题描述】:

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

$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 正在阻止其他 <strong>HTTP</strong> 请求。

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

我尝试在调用页面时刷新,但显示无法修改标题错误,因为输出已发送。

谢谢。

【问题讨论】:

  • 您找到解决方案了吗?如果你这样做了,请写一个答案,如果你没有,如果你提供视图代码会很有用。我也许能帮上忙。

标签: php mysql cakephp comet


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你能分享一下你使用的是什么版本的 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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 正确我知道这一点,但我不知道如何以 cakephp 的方式做到这一点。
      • 我查看了文档,但没有找到任何“关闭”方法。您可以自己拨打session_write_close 看看是否有帮助。
      【解决方案4】:

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

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

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

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

      【讨论】:

      • 感谢您的回答,但我不想要建议,我想使用彗星,因为如果这个问题解决了,那么它会自动解决我的很多问题,因为其他问题依赖于这个问题..谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      相关资源
      最近更新 更多