为DiscuzX2 X2.5添加PING功能 加速百度蜘蛛索引

Discuz一直以来都是国内站长使用最多的论坛程序,发展到X系列之后,更是变得非常强大了。现在最新版本为X2.5,金华也搞了个论坛,也一直在抽时间研究Discuz,以前写过一篇关于Discuz X2.5的优化小记,是对Discuz优化的一点记录,现在给大家汇报下,里面提到的屏蔽重复URL规则,从目前的测试情况来看,一切正常,大家可以放心使用。

言归正传,看看如何为DiscuzX2 X2.5添加PING功能

什么是Ping服务

百度Ping是基于XML_RPC标准协议的更新通告服务,一般广泛用于博客中把内容更新快速通知给百度,像Wordpress、Zblog都有Ping功能,以便百度及时进行抓取和更新。其它搜索引擎也有其PING服务,原理一样,这里只用百度为例。

Ping服务一般分为两种,一种是自动Ping,一种是手动Ping,百度ping服务的地址为:http://ping.baidu.com/ping/RPC2 了解更多Ping功能的知识请点击:http://zhanzhang.baidu.com/tools/ping

Discuz本身是不支持Ping功能的,我们现在就来实现这样一个功能,让你论坛每产生一个新帖后,都自动的通知百度有新内容了,让其过来抓取,这样可以达到最快的速度收录论坛的内容。

添加PING功能

首先新建一个PHP文件,文件名自定义,如:ping.php  最好用Dreamweaver之类的工具,不会有编码问题。

然后视论坛情况而定,分为两种情况,一种是开启了伪静态,一种是没开伪静态

开启了伪静态就把以下代码加到你创建的PHP文件当中:

<?php
 if(isset($_GET['action']))
 {
 $canshu=$_GET['action'];
 }

function postUrl($url, $postvar)
 {
 $ch = curl_init();
 $headers = array(
 "POST ".$url." HTTP/1.0",
 "Content-type: text/xml; charset=\"utf-8\"",
 "Accept: text/xml",
 "Content-length: ".strlen($postvar)
 );
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postvar);
 $res = curl_exec ($ch);
 curl_close ($ch);
 return $res;
 }

$baiduXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
 <methodCall>
 <methodName>weblogUpdates.extendedPing</methodName>
 <params>
 <param><value><string>你的站名</string></value></param>
 <param><value><string>http://你的网址/</string></value></param>
 <param><value><string>http://你的网址/thread-$canshu-1-1.html</string></value></param>
 <param><value><string>http://你的网址/forum.php?mod=rss</string></value></param>
 </params>
 </methodCall>";
 $res = postUrl('http://ping.baidu.com/ping/RPC2', $baiduXML);

if ( strpos($res, "<int>0</int>") )
 {
 header ("Location:http://你的网址/thread-$canshu-1-1.html");
 }
 else
 {
 header ("Location:http://你的网址/thread-$canshu-1-1.html#");
 }
 ?>

PS:注意标红的地方换成你自己的网址,另外-1-1这个是要根据后台伪静态规则的改变,如是默认则无须更改,如果像金华一样改过了,则后面去掉一个-1即可,如何知道:http://www.domain.com/thread-123-1.html 这种就是改过的,没改过就是http://www.domain.com/thread-123-1-1.html这种格式,.html前多了一个-1而已。添加好代码后保存,将文件上传到论坛根目录下即可。

如果没开启伪静态,则在新建的PHP文件中添加以下代码:

<?php
 if(isset($_GET['action']))
 {
 $canshu=$_GET['action'];
 }

function postUrl($url, $postvar)
 {
 $ch = curl_init();
 $headers = array(
 "POST ".$url." HTTP/1.0",
 "Content-type: text/xml; charset=\"utf-8\"",
 "Accept: text/xml",
 "Content-length: ".strlen($postvar)
 );
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postvar);
 $res = curl_exec ($ch);
 curl_close ($ch);
 return $res;
 }

$baiduXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
 <methodCall>
 <methodName>weblogUpdates.extendedPing</methodName>
 <params>
 <param><value><string>你的站名</string></value></param>
 <param><value><string>http://你的网址/</string></value></param>
 <param><value><string>http://你的网址/forum.php?mod=viewthread&tid=$canshu</string></value></param>
 <param><value><string>http://你的网址/forum.php?mod=rss</string></value></param>
 </params>
 </methodCall>";
 $res = postUrl('http://ping.baidu.com/ping/RPC2', $baiduXML);

if ( strpos($res, "<int>0</int>") )
 {
 header ("Location:http://你的网址/forum.php?mod=viewthread&tid=$canshu");
 }
 else
 {
 header ("Location:http://你的网址/forum.php?mod=viewthread&tid=$canshu#");
 }
 ?>

原理同上,就不再解释了。

接下来还要修改一个文件,登陆FTP,找到source\include\post\post_newthread.php 这个文件:

如果是Discuz X2,则搜索代码:

showmessage('post_newthread_succeed', "forum.php?mod=viewthread&tid=$tid&extra=$extra", $param);

替换为:

showmessage('post_newthread_succeed', "ping文件的名称.php?action=$tid", $param);

红色地方改为你自定义的PHP文件名即可。

如果是Discuz X2.5,则搜索代码:

showmessage('post_newthread_succeed', $returnurl, $values, $param);

替换为:

showmessage('post_newthread_succeed', "ping文件的名称.php?action=$tid", $values, $param);

修改同上,保存后,覆盖source\include\post\post_newthread.php文件即可。

Ping功能验证

文件都修改添加好之后,需要验证一下我们的功能是否添加成功,一种简单的验证方法就是发布一个新帖,然后看看发布后该帖子的URL链接最后有没有个#号,如果没有,则表示成功了,如果有#号,则表示出错了,需要再检查一下自己的操作。

另外还可以通过访问http://你的网址/ping文件的名称.php?action=任意新帖子ID,这样的链接格式,不成功的话,网址后面同样会有#号。

经金华测试成功,共享给大家。

Ping功能的好处在于可以实时的通知搜索引擎进行爬行,如果帖子符合搜索引擎的要求,则会第一时间收录。Ping功能也不再是博客专享了,有兴趣的不妨自己试一下,一段时间后,会更新测试的结果,看看收录是否增加了。