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

来源:互联网 发布:域名排名 编辑:程序博客网 时间:2024/06/06 02:44

一、需求来源。

  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异步回调
微信公众号被关注后如何回复多条消息

0 0
原创粉丝点击