如何停止在其中加载iframe和php进程

如何停止在其中加载iframe和php进程,php,iframe,Php,Iframe,我有一个脚本,在我自己的网络邮件中检查邮件。我想添加取消按钮。所以,若用户发现检查所有邮件需要很长时间,他有100封新邮件,他可以取消这个过程,例如,在31封邮件上 我在iframe中运行此脚本: public function checkEmailAction() { set_time_limit(0); while (@ob_end_flush()) { } ob_implicit_flush(1); $strError = ''; echo

我有一个脚本,在我自己的网络邮件中检查邮件。我想添加取消按钮。所以,若用户发现检查所有邮件需要很长时间,他有100封新邮件,他可以取消这个过程,例如,在31封邮件上

我在iframe中运行此脚本:

public function checkEmailAction() {
    set_time_limit(0);
    while (@ob_end_flush()) {
    }
    ob_implicit_flush(1);

    $strError = '';
    echo "";

    $accountId = Zend_Json::decode($this->_getParam('account_id'));
    if (!$this->mail_account->hasAccessToAccount($accountId)) {
        $strError = 'Insufficient access rights';
    }

    if (empty($strError)) {
        try {
            $this->mail->sync($accountId);
        } catch (MailException $e) {
            Mail_LoaderDispatcher::change('Error. ', 100, null, true);
            if($e->getMessage() != "Can't connect to email account.") {
            Zend_Registry::get('log')->debugErrorToFile('Mail Error: ' . $e, '', 'mail');
        }
        }
    } else {
        Mail_LoaderDispatcher::change($strError, 100, null, true);
    }

    echo "";
    exit();
}
在cancel button click事件中,我添加了这样的代码,它会破坏iframe,但不会停止php进程:

但php脚本仍在运行,所有邮件都已下载:


也许,在“取消”按钮上有某种方法,单击“通过Cookie发送一些参数”或进入iframe并停止php脚本运行?

在服务器端没有手动干预的情况下,停止php脚本运行的唯一方法是从控制台终止脚本。但是,如果可以访问PHP脚本的源代码,则可以自己编写功能

编辑:

显然,你要做的是编写脚本,一次下载几封邮件,比如五封或十封。从iFrame调用一个脚本下载这些邮件,然后在完成后返回一些HTML和AJAX:

检查父帧中的隐藏字段,如果该隐藏字段设置为1, 重新加载自身以处理接下来的5-10封邮件。 然后更改“取消”按钮,使其将隐藏字段设置为0,脚本将终止,而不是在下一个循环中继续


您可以将一次处理的邮件数设置为一个较低的数字,例如2或1,这将使“取消”按钮在使用更多HTTP请求时响应更快。

我尝试了这种解决方案,但遇到了下一个问题:当我发送Ajax请求创建锁文件时,php会等待所有邮件的下载,然后才运行脚本,这将创建锁文件。这是没有用的。我还尝试从其他iframe运行创建锁文件过程,得到了相同的结果。您可以从Firebug Net选项卡查看屏幕截图:可能是一些php设置?Hrm。看来,使这项工作成功的唯一办法是进一步拆分工作。我正在更新我的答案来解释。最后我完成了这个任务。问题出在会话中!!当我在根目录中创建lock.php文件,并在没有Zend MVC模型(启动会话)的情况下直接访问它时,它成功了!所以,问题是:当我运行两个进程:检查邮件和创建锁文件时,php正在等待第一个进程完成,因为它不能同时从两个进程写入会话。希望,这将有助于解决同样的问题。我不确定这本身就是一个竞赛条件,因为可以预见,它正在等待第一个过程完成。我很高兴这最终成为一个Zend问题,我有点不安,因为我无法在自己的领域复制它 var ifr=$('#mail_iframe_check_email'); ifr.remove();