php异步发送邮件,php通过fsockopen异步发送邮件

不考虑pthreads拓展的话,原生php是不支持多线程的。如果想要在web项目中异步发送邮件或者执行其他php脚本,就可以考虑使用fsockopen的方法:发送一个socket连接请求目标脚本,不需要等待目标脚本执行结果直接关闭socket连接,接着执行后续任务,同时目标脚本由于收到请求,开始响应并执行。这就实现了php的“伪异步”。$url = YOUR_WEB_PATH . "/send_email";  // 异步执行的目标脚本

$post_data = array();

/**

* 构造$post_data

*/

trigger_async_request($url, $post_data); // 触发异步请求

/**

* 后续任务

*/

function trigger_async_request($url, $post_data = array())

{

$method = empty($post_data) ? "GET" : "POST";

$url_array = parse_url($url);

$port = isset($url_array['port']) ? $url_array['port'] : 80;

$fp = fsockopen($url_array['host'], $port, $errno, $errstr, 30);

if (!$fp) {

return false; // 无法打开socket连接

}

$getPath = isset($url_array['query']) ? $url_array['path'] . "?" . $url_array['query'] : $url_array['path'];

$header = $method . " " . $getPath . " HTTP/1.1\r\n";

$header .= "Host: " . $url_array['host'] . "\r\n";

if (!empty($post_data)) {

$post_data = http_build_query($post_data);

$header .= "Content-Type: application/x-www-form-urlencoded\r\n";

$header .= "Content-Length: " . strlen($post_data) . " \r\n";

}

$header .= "Connection: Close\r\n\r\n";

if (!empty($post_data)) {

$header .= $post_data . "\r\n\r\n"; //传递POST数据

}

fwrite($fp, $header);

// 等待30ms,这对于nginx服务器很重要,让nginx有足够的时间将请求转交给php-fpm。

// 否则,如果在nginx转交请求前识别到用户断开连接,那么就不会继续转交请求了。

usleep(30000);

fclose($fp);

return true;

}

function send_email() {

set_time_limit(0);

ignore_user_abort(true);

/**

* 发送邮件。。。

*/

}

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值