UCenter 1.6 源码分析记录之同步发送通知 load('note')
UCenter 1.6 服务端操作后,会通过以下语句记录日志并发送同步通知,以修改密码为例:
$this->load('note');//实例化日志模型'note',主要是记录日志跟发送通知,使用 /model/base.php 中类 base 的方法 load(),并返回 return $_ENV[$model]; $_ENV['note']->add('updatepw', 'username='.urlencode($username).'&password='); $_ENV['note']->send();//send()方法
/model/base.php 中类 base 的方法 load() 源码如下:
function load($model, $base = NULL, $release = '') { $base = $base ? $base : $this; if(empty($_ENV[$model])) { $release = !$release ? RELEASE_ROOT : $release; if(file_exists(UC_ROOT.$release."model/$model.php")) { require_once UC_ROOT.$release."model/$model.php"; } else { require_once UC_ROOT."model/$model.php"; } eval('$_ENV[$model] = new '.$model.'model($base);'); } return $_ENV[$model]; }
接着看 /model/base.php 中类 base 的方法 send() 源码
function send() { register_shutdown_function(array($this, '_send'));//register_shutdown_function 在窗口结束后,又异步调用_send() } function _send() { $note = $this->_get_note();//获取要发送的消息 if(empty($note)) { $this->db->query("REPLACE INTO ".UC_DBTABLEPRE."vars SET name='noteexists', value='0'"); return NULL; } $closenote = TRUE; //循环通知各应用 foreach((array)$this->apps as $appid => $app) { $appnotes = $note['app'.$appid]; //是否接受通知 && 通知未成功过 && 失败的次数 if($app['recvnote'] && $appnotes != 1 && $appnotes > -UC_NOTE_REPEAT) { $this->sendone($appid, 0, $note);//转到下面的 sendone() 方法,发送一条通知 $closenote = FALSE; break; } } //通知结束 if($closenote) { $this->db->query("UPDATE ".UC_DBTABLEPRE."notelist SET closed='1' WHERE noteid='$note[noteid]'"); } $this->_gc();//MS是清理未发送的数据 }
接着看 /model/base.php 中类 base 的方法 sendone() 源码
function sendone($appid, $noteid = 0, $note = '') { require_once UC_ROOT.'./lib/xml.class.php'; $return = FALSE; $app = $this->apps[$appid]; if($noteid) { $note = $this->_get_note_by_id($noteid); } 。。。。。。此处省去N多代码。。。。。。 unset($uc_note); } else { //生成接口,把 'getdata' 加到 $_GET 里,也即是接口设置的参数 $url = $this->get_url_code($note['operation'], $note['getdata'], $appid); $note['postdata'] = str_replace(array("\n", "\r"), '', $note['postdata']);//postdata字段是空的,不用理 $response = trim($_ENV['misc']->dfopen2($url, 0, $note['postdata'], '', 1, $app['ip'], UC_NOTE_TIMEOUT, TRUE));//开始调用接口,传递积分兑换设置 } $returnsucceed = $response != '' && ($response == 1 || is_array(xml_unserialize($response))); 。。。。。。此处省去N多代码。。。。。。 return $return; }