【问题标题】:Yii framework async requestYii 框架异步请求
【发布时间】:2012-04-17 20:26:21
【问题描述】:

我有执行 3 个任务的 ajax 请求:

  • 保存模型(DB)
  • 发送电子邮件
  • 给出成功或失败消息。

因为这个任务太费时间了。用户最多可以等待 20 秒的响应(成功或失败消息)。如果用户关闭浏览器,它会停止用户当前进程的操作之一。

这是糟糕的用户体验。

我希望用户将他的数据提交给我的控制器,之后他将收到“成功或失败消息”。并且该进程将完全在服务器端,它应该支持多会话。

我该怎么做?

【问题讨论】:

  • 我在这里有点困惑。它如何在其中一个进程上停止?因为一旦发送了用户请求,第一两个步骤将在服务器上完成。第三步将在客户端,它只是一个通知。基本上所有 3 个步骤都将运行。唯一的区别是,如果用户关闭浏览器,他可能看不到通知。还是我看错了?
  • 基本上,您需要更改顺序,以便用户无论发生什么都能收到消息。因为任务的其余部分将处理并且从其他任务中获得响应需要比用户需要更长的时间。用户不关心邮件发送成功与否,甚至保存到数据库。
  • 我发现这个函数有问题。它甚至发送客户端关闭客户端,但如果客户端没有关闭浏览器,它仍在处理中,即使在处理之前得到答案,它也需要时间直到用户得到答案

标签: php ajax asynchronous yii


【解决方案1】:

@hakre 你给的东西并没有减少用户等待响应的时间。

我找到了最好的解决方案: runactions extension for yii

这是让您从控制器后台操作运行的扩展程序。 有几种使用方法。最适合我的是这个

public function actionTimeConsumingProcess()
{
    if (ERunActions::runBackground())
    {
       //do all the stuff that should work in background
       mail->send()
    }
    else
    {
        //this code will be executed immediately
        //echo 'Time-consuming process has been started'
        //user->setFlash ...render ... redirect,
    }
  //User information
  echo "Submit Success!"
}

它的工作,但没有 ajax 请求,当我发出 ajax 请求时,它由于某种原因无法工作。 所以我用了:

                         ERunActions::httpPOST($this->createAbsoluteUrl('Form/Submit'), array('to'=>'mail@domain.com', 'subject'=>'This is the subject'));

它的工作很棒,但它不是解决这个问题的理想解决方案。

【讨论】:

  • 如何在 ajax 调用中调用 mail->send()
  • 这在我的数据库中保存数据后不起作用。有什么解决办法吗?
【解决方案2】:

runactions 扩展的问题是它只适用于未经身份验证的用户,您可以使用 yii backjob extension,但这需要使用某种非阻塞会话存储,例如 CHttpDbSession。 我仍在寻找正确的方法来做到这一点...... 我发现最好的选择之一是运行服务器后台作业:

/usr/bin/php -q longProcess.php > /dev/null 2>&1 &

但是,我仍然需要知道如何在 cmd 行中传递控制器和操作并允许 yii 实际使用它,例如

/usr/bin/php -q yii-index.php controller action > /dev/null 2>&1 &

更新:我发现最佳方法是使用 yii 控制台应用程序并将其作为后台作业运行。下面的链接很有帮助:

Yii cron jobs

我现在使用这段代码,它运行良好:

exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2011-08-21
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多