如何在使用PHP执行代码之前发送更快的响应

时间:2018-03-20 10:14:13

标签: php

我需要在使用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);将响应发送给用户,并在电子邮件部分执行之后。

2 个答案:

答案 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