【PHP】PHP实现简单的setTimeOut来完成异步延时

本文介绍了一种在微信公众号被关注时回复多条不同类型消息的方法。通过使用客服发送接口及异步回调机制,实现了在关注事件触发时首先发送一条消息,随后延时发送另一条消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求来源。

  1. 开发微信公众号时,当用户关注我们的微信号,我们需要发送两条不同类型的消息给关注用户。注意是不同类型。这么说吧,要发送Type1,Type2两种消息回复给关注者。
  2. 其中关注这个事件,处理这个事件的流程如果发送了其中1个类型的消息,就无法发送另外一种了。意思就是无法同时发送两种。类似于http请求,回复一次就OK了,收到第一次的response,就结束了。
  3. 而且需求是另外的一种回复消息(Type2),必须要在主流程的消息之后发送。好在微信提供了接口——客服发送接口,该接口可以主动给用户发送消息。

二、实现上面的需求,并规范化。

//关注事件
case "subscribe":
$result = $this->transmitNews($content);// 生成Type1的消息

// 格式化生成Type2的消息体
$result_other = sprintf("***?先注册<a href='%s'>(点击注册)</a>吧", $url);
$_arr = array(
    'openid' => sprintf('%s', $this->fromUserName),// 格式化微信openid
    'content' => $result_other,
    );
$url = sprintf('%s/%s/%s', APP_URL, APP, PubCCCCConf::DDDDDDDDDDD_URL);
// 利用nginx生成另外一个请求
LibUtil::makeRequest($url,
    array('key' => PubCCCCConf::KKKKKKKKKK_KEY, 'cd_time' => 1, 'user_func' => 'ddddddddddMsg', 'json_str' => json_encode($_arr)), 1, 'POST');
break;
// 开始发送Type1主体消息
// 延时回调
public function postAAAAAAAsync() {
    $this->setOutType('json');
    $key = $this->R('key');
    $cd_time = $this->R('cd_time', 0, 'int');// 单位s
    $user_func = $this->R('user_func', '', 'string');// 这个函数必须是这个类里的函数
    $json_str = $this->R('json_str', '', 'string', true, NULL);// 参数
    // 防刷机制
    if ( $key != PubCCCCConf::KKKKKKKKKK_KEY ) {
        $this->out = array('code' => 3, 'data' => array(), 'msg' => '没有权限');
        return;
    }
    // 最长时间300s
    if ( empty($user_func) || $cd_time >= 300 || !PubValidate::isJson($json_str)) {
        $this->out = array('code' => 2, 'data' => array(), 'msg' => '参数错误');
        return;
    }

    $args = json_decode($json_str, true);
    $args['cd_time'] = $cd_time;
    call_user_func(array('Ctl*****',$user_func), $args);
    $this->out = array('code' => 1, 'data' => array(), 'msg' => 'SUCCESS');
}
// 这个最好是命名为私有函数
private function ddddddddddMsg($param) {
    // 具体的处理逻辑
    sleep($param['cd_time']);// 延时
    ...
}

1、我们看上面的代码,第1片代码中逻辑是,在正式发送Type1类消息时,先利用nginx生成另外一个请求,在另外一个请求中,延时cd_time时间,处理。
2、注意$key (防刷)、call_user_func的使用。
3、部分函数名、变量名丑陋是为了模糊处理。

参考:PHP实现类似javascript的setTimeout异步回调
微信公众号被关注后如何回复多条消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值