Ajax电话面临尴尬局面

Nul*_*ter 7 php mysql ajax

请问我长期的问题......

我必须将一个数据库记录添加到一个主表中,例如test表.在向该表添加记录后,我想要它last inserted id,然后想要在事务表中添加大约1000个条目(也将EMAILS发送到这1000条记录)test_transaction.

但是这第二个操作,将记录添加到事务表中,需要更多的时间来向数据库添加记录.我正在使用客户MVC,我的代码看起来像......

public function addtotest()
{
    $strSql = "INSERT INTO test ...";
    $intId = $this->db->execute($strSql);

    foreach($arrTransaction $transact)
    {
        $strSql = "INSERT INTO test_transaction ...";
        $this->db->execute($strSql);
    }

    echo $intId;
}
Run Code Online (Sandbox Code Playgroud)

所以我想把test_transaction表的条目放到另一个action如下

public function testtrancation()
{
    $id = $_REQUEST['id']; //It's understood that I am doing proper validation here
    foreach($arrTransaction $transact)
    {
        $strSql = "INSERT INTO test_transaction ...";
        $this->db->execute($strSql);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,主要的问题,我打电话addtotest从一个动作AJAX,当它会给id响应我想打电话给另一个AJAX,这将增加大约1000记录到数据库.

但我不想让他们等待另外几分钟的1000记录来打扰用户的体验.

  1. 所以我正在通过addtotest"AJAX"调用添加记录后重新加载页面.
  2. 调用另一个AJAX呼叫successaddtotest.
  3. 在打电话之后testtransaction AJAX,我正在重新加载我的页面.

    $.ajax(
    {
        url: SERVER_PATH + 'addtotest',
        type: 'post',
        async: true,
        data: { required_data: required_date },
        success:function(data)
        {
            alert('Record added successfully.');
    
            //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL
            $.ajax(
            {
                url: SERVER_PATH + 'testtransaction',
                type: 'post',
                async: true,
                data: { intId: data.id },
                success:function(data)
                {
                //DO NOTHING
            },
            });
            //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL
    
            location.reload();
        },
    });    
    
    Run Code Online (Sandbox Code Playgroud)

但是当页面重新加载时,我的AJAX呼叫也会在没有完成AJAX请求的情况下消失.

在这种情况下可以做到吗?我想了解更多细节,请告诉我.

我不希望用户等待另外的1000条目(加上发送EMAILS到这1000条记录)进入数据库.

Dee*_*eep 1

这很简单!

单次插入后,您可以调用单独的后台进程:

public function addtotest()
{
    $strSql = "INSERT INTO test ...";
    $intId = $this->db->execute($strSql);
    exec('php /your/php/cli/script.php param1 param2 paramN 1>> /dev/null 2>> /dev/null &');
    echo $intId;
}
Run Code Online (Sandbox Code Playgroud)

使用“&”进程在后台启动,因此您可以继续而不必等到脚本完成。

或者您可以将此作业添加到“延迟任务”中并使用 cron 运行此任务。