user->pass('contributor'); /** 忽略超时 */ ignore_user_abort(true); /** 获取post */ $post = $this->widget('Widget_Archive', "type=post", "cid={$this->request->cid}"); if ($post->have() && preg_match_all("|]*href=[\"'](.*?)[\"'][^>]*>(.*?)|", $post->text, $matches)) { $links = array_unique($matches[1]); $permalinkPart = parse_url($post->permalink); /** 发送pingback */ foreach ($links as $url) { $urlPart = parse_url($url); if (isset($urlPart['scheme'])) { if ('http' != $urlPart['scheme'] || 'https' != $urlPart['scheme']) { continue; } } else { $urlPart['scheme'] = 'http'; $url = Typecho_Common::buildUrl($urlPart); } if ($permalinkPart['host'] == $urlPart['host'] && $permalinkPart['path'] == $urlPart['path']) { continue; } $spider = Typecho_Http_Client::get(); if ($spider) { $spider->setTimeout(10) ->send($url); if (!($xmlrpcUrl = $spider->getResponseHeader('x-pingback'))) { if (preg_match("/]*rel=[\"']pingback[\"'][^>]*href=[\"']([^\"']+)[\"'][^>]*>/i", $spider->getResponseBody(), $out)) { $xmlrpcUrl = $out[1]; } } if (!empty($xmlrpcUrl)) { try { $xmlrpc = new IXR_Client($xmlrpcUrl); $xmlrpc->pingback->ping($post->permalink, $url); unset($xmlrpc); } catch (Exception $e) { continue; } } } unset($spider); } } /** 发送trackback */ if ($post->have() && !empty($this->request->trackback)) { $links = $this->request->trackback; foreach ($links as $url) { $client = Typecho_Http_Client::get(); if ($client) { try { $client->setTimeout(5) ->setData(array( 'blog_name' => $this->options->title . ' » ' . $post->title, 'url' => $post->permalink, 'excerpt' => $post->excerpt )) ->send($url); unset($client); } catch (Typecho_Http_Client_Exception $e) { continue; } } } } } /** * 发送pingback * * $this->sendPingbacks(365); * * * @access public * @param integer $cid 内容id * @param array $trackback trackback的url * @return void */ public function sendPing($cid, array $trackback = NULL) { $this->user->pass('contributor'); if ($client = Typecho_Http_Client::get()) { try { $input = array('do' => 'ping', 'cid' => $cid); if (!empty($trackback)) { $input['trackback'] = $trackback; } $client->setCookie('__typecho_uid', Typecho_Cookie::get('__typecho_uid')) ->setCookie('__typecho_authCode', Typecho_Cookie::get('__typecho_authCode')) ->setHeader('User-Agent', $this->options->generator) ->setTimeout(3) ->setData($input) ->setIp('127.0.0.1') ->send(Typecho_Common::url('/action/service', $this->options->index)); } catch (Typecho_Http_Client_Exception $e) { return; } } } /** * 异步请求入口 * * @access public * @return void */ public function action() { $this->on($this->request->is('do=ping'))->sendPingHandle(); } }