我需要在使用PHP执行部分代码之前发送响应。我在下面解释我的代码。
$name=$_POST['name'];
$email=$_POST['email'];
$mobile=$_POST['mobile'];
$description=mysqli_real_escape_string($connect,$_POST['description']);
$date=date('m/d/Y H:i:s A');
$sql=mysqli_query($connect,'INSERT INTO db_feedback (name,email,mobile,description,date_added) values ("'.$name.'","'.$email.'","'.$mobile.'","'.$description.'","'.$date.'")');
if ($sql) {
$result=array("msg"=>"Thank You !! Your feedback is sucessfully submitted.","status"=>1);
echo json_encode($result);
$email='info@thespesh.com';
$name='Admin';
$msgSub="User Feedback";
$message=$description;
$uname=$name;
$uphone=$mobile;
$uemail=$email;
ob_start();
include "feedbackTemplate.php";
$msg_body=ob_get_clean();
$is_send=sendMail($email,'noreply@thespesh.com',$msgSub,$msg_body);
}else{
$result=array("msg"=>"Failed","status"=>0);
echo json_encode($result);
}
这里我将用户数据插入数据库后发送电子邮件。我需要在执行电子邮件代码部分之前echo json_encode($result);
将响应发送给用户,并在电子邮件部分执行之后。
答案 0 :(得分:1)
如果您正在运行php-fpm
,那么您应该这样做,因为它是2018.并且所有流行的网络服务器都支持它,那么您可以使用fastcgi_finish_request功能
它对你有什么用?您进行数据库插入,向用户发送响应,调用fastcgi_finish_requets
,输出发送给用户,然后在该函数调用您的邮件代码之后。
用户收到响应后执行长时间运行的任务。
代码:
echo json_encode($result);
// Output is sent to user, but below code resumes execution
fastcgi_finish_request();
// This basically resumes in background
include "feedbackTemplate.php";
$msg_body=ob_get_clean();
$is_send=sendMail($email,'noreply@thespesh.com',$msgSub,$msg_body);
注意:仅当您使用 php-fpm
运行PHP时才可以使用此功能。
答案 1 :(得分:0)
最安全的方法是将任务发送给那个人"到数据库,然后从crontab激活脚本来处理这些任务。脚本可以安排为例如每5分钟运行一次。但请注意,处理任务不会超过5分钟,因此它不会同时运行多个任务。我通常会限制在一个脚本运行时处理的任务数,如果花费太多时间,则使用timeout
shell命令终止脚本。
现在我使用Redis或RabbitMQ并分叉工人。查找" php后台任务"在Google中查看php-enqueue。