请问我长期的问题......
我必须将一个数据库记录添加到一个主表中,例如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记录来打扰用户的体验.
addtotest"AJAX"调用添加记录后重新加载页面.AJAX呼叫success的addtotest.在打电话之后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条记录)进入数据库.
这很简单!
单次插入后,您可以调用单独的后台进程:
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 运行此任务。
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |