如何在php中发送邮件之前向用户发送响应

我正在开发一个项目,有两个过程。

  1. 发送邮件。

  2. 将响应发送回用户。

我需要做这一切,但这需要很多时间。所以现在我正在考虑使用多线程。任何人都可以帮助如何在 php 中实现这一目标吗?

我只需要尽快发送回复。这是我的代码,我创建了一个发送邮件的功能,成功完成邮件发送后,我将使用 JSON 编码向用户发送响应。

/删除预订功能/


public function deleteBooking($id){

     $where = array('id'=>$id); 

     $bookingData = $this->Cnc_model->getData('bookings', array('*'), array('id'=>$id)); 

     if(!empty($bookingData)){

        if(!empty($bookingData[0]['estimator_id']) && $bookingData[0]['estimator_id'] != 0){

                    $name = $this->Cnc_model->getData('users',array('username', 'email'), array('user_id'=> $bookingData[0]['estimator_id']));   

                    $estimator_name = $name[0]['username'];

                    $estimator_mail = $name[0]['email']; 

                    }


                if($bookingData[0]['customer_id'] != 0){

                    $cname = $this->Cnc_model->getData('customers',array('name', 'office_contact_email'), array('id'=> $bookingData[0]['customer_id']));   

                    $customer_name = $cname[0]['name'];

                    $customer_mail = $cname[0]['office_contact_email'];

                }

                $mailHeading = 'Booking Deleted';

                $smallHeading = 'Your Booking with '.$customer_name.' on '.$bookingData[0]['booking_date'].' has been deleted by admin.';

                $subject = 'Booking Deleted';

                $smallHeadingcustomer = 'Your Booking with '.$estimator_name.' on '.$bookingData[0]['booking_date'].' has been deleted by admin.';

                $status = 5;

/*这里我调用发送电子邮件功能*/


                $result = $this->emailSent($id, $mailHeading, $smallHeading, $subject, $smallHeadingcustomer,$status);


开满天机
浏览 236回答 2
2回答

阿波罗的战车

您可以使用 ignore_user_abort(true); 设置客户端断开连接是否应导致脚本中止。这将断开与您的当前连接,然后将响应发送到前端,但仍会执行其余代码。 ignore_user_abort(true);    ob_start();    echo "success";    $serverProtocole = filter_input(INPUT_SERVER, 'SERVER_PROTOCOL', FILTER_SANITIZE_STRING);    header($serverProtocole.' 200 OK');    header('Content-Encoding: none');    header('Content-Length: '.ob_get_length());    header('Connection: close');    ob_end_flush();    ob_flush();    flush();最初对您的 API 使用后端验证,然后使用上面的代码发送响应,然后您可以编写代码给您的用户发送电子邮件,这样前端将获得响应并执行脚本,直到遇到返回或死亡;这种方法的问题是,如果发送电子邮件时出现错误,您无法向前端发送响应。否则,您可以在代码中使用邮件队列稍后完成这项工作

BIG阳

这取决于你想走多深。理想的方法是运行 RabbitMQ 或 Gearman 服务器并设置“发送邮件”作业供它们处理。提交作业非常快,并且允许脚本完成并将响应发送回用户,但当然这将涉及设置更多基础设施、编写/维护更多代码来处理作业和处理重试/错误状态。可能问题最少的方法是运行将中继邮件的本地邮件服务器。传递应该非常快,会给出更好的“有效”响应(至少用户会知道邮件已传递到本地邮件服务器)并允许脚本继续。如果电子邮件失败,则本地邮件服务器会将其作为退回给管理员或“发件人”用户进行处理。概述一种方式在这里将意味着发送响应第一个,然后处理邮件-这意味着它不可能报告故障给用户。不理想,但这取决于您的情况 - 也许管理员处理失败的消息并可以重新发送?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go