😯
其实蛮早就有关注这个程序,只不过是关注加星而已,最近稍微研究了下,其实是研究了下PT,仔细想想,PT对比BT,更加符合”P2P”的概念.毕竟早些年国内的宽带上行都是小的不要不要的,大部分人用完BT就关闭了上传,生怕抢了上行宽带.至于现在嘛,我也不清楚为嘛上传宽带宽裕了,大家还是不乐意分享.废多了.

下面我用的Nexusphp是基于itzmx的二次修改版,具体他修改了些什么,你们自己去看,内容也有部分收集于itzmx,我还是给出网址.https://bbs.itzmx.com/thread-4271-1-1.html


安装教程

搭建NexusPHP需要memcache组件的支持,现在绝大数空间都不支持memcache主机,所以如果要搭建NexusPHP的话,你只好选择价格不菲的VPS主机了。

配置环境可以选用apache+php+Mysql+memcache,推荐linux环境,代码执行效率更高。作者代码所提供的安装介绍也是在linux环境下的,而且全是英文介绍,这让我这六级不过的情何以堪啊,小小的鄙视下。。。

Windows下推荐win2003,如果你对PHP有一定了解,可以自己动手搭建IIS或apache+PHP+MysqL+memcache的环境,具体教程可以google。不过这种方法很繁琐,经常会出莫名其妙的错误,你要有心理的准备。

最好的方式是选用环境集成包,比如Apmserv5.2.6功能很全,支持apache+php+mysql+memcache,还有一个集成包,nginx+php+mysql+memcache,这个集成包相当简陋,只是各种包的聚合,没有控制界面和控制面板,使用起来很不方便。这应该是众多集成包里唯一两个支持memcache的集成包了。

好了,环境搭建完毕,解压程序包,然后导入数据库文件,(根目录_db下的dbstructure.sql文件)导入完毕后修改配置文件,在config文件下下面有一个allconfig.php的文件,修改下面的内容:

‘SITENAME’=>‘站点名称’

‘baseURL’=>‘网站URL’

‘announce_url’=>‘localhost/announce.php’(announce的url地址)

‘mysql_host’=>‘MySQL主机’

‘mysql_user’=>‘数据库用户名’

‘mysql_pass’=>‘数据库密码’

‘mysql_db’=>‘数据库名’

以上无误的话应该就可以登陆NexusPHP的界面了,赶紧注册管理员账号吧。

好了,注册好用户名后,接着进入数据库管理(phpMyAdmin),在users表里面找到你注册的用户,编辑它的class属性为16,便是主管权限了。

还可以通过下面的方法设置:

1.使用正常方式在网站注册一个新用户,假设用户名为admin。

2.输入以下命令进入MySQL命令行管理工具:mysql-uroot-pnexusrocks-hlocalhost注意:将’root’,’nexusrocks’,’localhost’分别替换成你的MySQL用户名、密码、主机地址。

2.在MySQL命令行管理工具输入以下命令:USEnexus;UPDATEusersSETclass=’16′WHEREusername=’admin’;注意:将以上命令中的’nexus’替换成你的数据库名,将’admin’替换成你注册的用户名。

3.退出MySQL命令行管理工具:

到这里PT基本上就架设完毕了,现在只需要利用主管帐号对站点进行设置和调整就可以了

NexusPHP pt站点memcache中清除页面缓存的方法

地址栏输入

域名/index.php?clearcache=1

或者?forceall=1也可以试试

例如修改了news规则sql语句没有立即生效。

index.php替换成你要清除的PHP文件

NexusPHP设置站点不在线后管理员无法登录的问题

搜索配置文件找到解决方法

在allconfig.php文件里面,找到

‘site_online’=>’no’修改为’yes’

保存即可。

nexusphp使用文件缓存,支持未安装memcache的服务器

编辑classes/class_cache.php 在其第2行插入

class Memcache{   
    private $lifetime = 3600;
    private $path = 'cache';
      
    function set($name,$value,$time=0){
            if($time) $this->lifetime = $time;
        $filename = $this->path.'/'.md5($name).'.php';
        @unlink($filename);
        $valuecache['cache'] = $value;
                $valuecache['cachetimeuntil']=time()+$this->lifetime;
        $array = "<?php\n\$filecache['".$name."']=".var_export($valuecache, true).";\n?>";
        $strlen = file_put_contents($filename, $array);
        @chmod($filename, 0777);
        return $strlen;
    } 

    function get($name){
                        $filename = $this->path.'/'.md5($name).'.php';
            include_once $filename;
                        if($filecache[$name]['cachetimeuntil']>time())
            return $filecache[$name]['cache'];
                        else
                        return false;
   } 
      
    function delete($name){
        $filename = $this->path.'/'.md5($name).'.php';
        @unlink($filename);
        } 
       
    function connect(){
        return true;
    }
}

然后在网站根目录创建一个文件夹,名为“cache”用于保存缓存文件

编辑include/cleanup.php 搜索

//5.delete old login attempts

在其前插入

//4.delete cache files
$dp = @opendir('cache');

                while (($file = readdir($dp)) !== false) {
if(time() - filemtime('cache/'.$file) > 24*3600)@unlink('cache/'.$file);
                }
                closedir($dp);
if ($printProgress) {
                printProgress("delete cache file");
        }

每24小时自动清空一次缓存

NexusPHP用户组名字修改,NexusPHP用户组汉化

在\lang\chs\lang_functions.php中修改257-266行即可,如下图.

NexusPHP汉化“管理组面板”位置

在adminpanel表、modpanel表、sysoppanel表里面修改

Ps.这个我没去仔细看,居然写到数据库里面去了???

修改pt程序nexusphp代码支持compact=1参数返回二进制文件的 ipv6 peers列表用于客户端互相连接下载的方法

问题所在:

d8:intervali3600e12:min intervali30e8:completei67e10:incompletei0e5:peers354:q"…uZ…G…=5.J.(<.,T#’{x…e.jT.w.p.z%F7.y.zk…r.6.1W:.0T…qM.-…*.P.=…7…8…S…_.J…z.K

.S…vp… <…!..4…1D:…s…Su…=…ps.]A.y…qo\e…A…M.1.}MY…q…]…3…xi.r.H…1.n.v…]…e…Fo…]…3…0k…=3/…=.gVn.z…#'w!..-…9.WM.:7B…H .~U…

…uQ.=#&qQ.4…x.+.r.f…}u…p…eA.s…A…j…e

“peers”后面的354字节二进制数据都是ipv4 peer,每个ipv4 peer含4字节ip和2字节port共6字节,所以peer个数是354/6=59。ipv6 peers二进制数据按照协议是在“peers6”节点返回,从抓包看没有。

现在的pt程序,客户端收不到ipv6地址的,只能连接ipv4

这是修改过的,可以直接让客户端拿到ipv6

如果两边都是内网ipv4,那么,就会可能导致无法连接

如果连接成功,客户端才会互相汇报本地ipv6到对方客户端进行连接

直接服务器下发列表,客户端拿到了可以直接请求,不需要先ipv4建立

修改:

announce.php文件

114行搜索

$peer_list = "";

下方增加

$peer6_list = "";

130行搜索

$peer_list .= pack("Nn", sprintf("%d",$longip), $row['port']);

下方增加

else
                {
                        $ipv6_packed = inet_pton($row['ip']);
                        if ($ipv6_packed)
                                $peer6_list .= $ipv6_packed . pack("n", $row['port']);
                }

147行搜索

$resp .= "l".$peer_list."e";

下方增加

if ($compact == 1 && strlen($peer6_list) > 0)
{
        $resp .= benc_str("peers6").benc_str($peer6_list);
}

修改pt程序nexusphp代码支持download.php强制返回rss的https地址

在67行,把下发的http改成https就行了,这样输出也就是https了

if ($_COOKIE["c_secure_tracker_ssl"] == base64("yeah"))
$tracker_ssl = true;
else
$tracker_ssl = false;
if ($tracker_ssl == true){
        $ssl_torrent = "https://";
        if ($https_announce_urls[0] != "")
                $base_announce_url = $https_announce_urls[0];
        else
                $base_announce_url = $announce_urls[0];
}
else{
        $ssl_torrent = "https://";
        $base_announce_url = $announce_urls[0];
}

pt做种tracker不能返回全部peer list用户数据,可连接否检测

这个问题仅针对使用ITZMX修改版的用户.

发现全站的可连接全是“否”状态,但是在其它站点可以正常连接和上传

所以分析tracker所用到的文件也就是announce.php文件

直接修改356行代码

$connectable = "no";

变为

$connectable = "yes";

然后在分号后面回车新建一行插入代码

@fclose($sockres);

这时候从353行代码到363行代码将显示为如下所示

$sockres = @pfsockopen($ip, $port, $errno, $errstr, 5);
        if (!$sockres)
        {
                $connectable = "yes";
                @fclose($sockres);
        }
        else
        {
                $connectable = "yes";
                @fclose($sockres);
        }

然后保存文件。

这时候再测试发现可连接全都变成“是”了

做种后需要3-30秒时间才会有数据,然后其它人已经可以获取到tracker服务器返回的用户数了

NexusPHP程序同一个服务器上的多个PT共用memcache

这个问题,换到13年的我肯定不知道,当然现在一看就知道是缓存标识符重复了.解决办法如下.

1.下载解压附件得到class_cache.php文件,打开,

找到195行,将WinCache改为Memcache。(如果不是memcahce自己灵活更改);

2.找到210行,将ANTSOUL_改为与服务器上现存PT代码中对应设置不同的任意字符。(只要不傻乎乎地改为中文或特殊字符就不会有问题)

3.将class_cache,php文件上传到/classes/下,替换原有文件。

4.大功告成!!

缓存支持WinCache_Memcache_APCCache_XCache_eAccelerator

nexusphp程序默认邮件通知提示勾选收到短讯的时候提醒我,设置显示包括断种,数据库结构修改

users表单

notifs默认值

[pm][email][incldead=0]

pm字段是收到短讯的时候提醒我。

email字段是当默认分类中有新种子的时候通知我。

incldead=0字段是搜索默认显示全部种子

新用户注册默认勾选了,老用户怎么办呢?

直接sql语句升级一下

update users set notifs='[pm][email][incldead=0]';

修改pt程序nexusphp代码支持details.php种子链接让BT客户端直接下载的办法

106行,搜索

$download = "<a title="".$lang_details['title_download_torrent']."" href="download.php?id=".$id.""><img class="dt_download" src="pic/trans.gif" alt="download" /> <b><font class="small">".$lang_details['text_download_torrent']."</font></b></a> | ";

替换如下,加入&passkey=$CURUSER[passkey]参数即可

$download = "<a title="".$lang_details['title_download_torrent']."" href="download.php?id=".$id."&passkey=$CURUSER[passkey]"><img class="dt_download" src="pic/trans.gif" alt="download" /> <b><font class="small">".$lang_details['text_download_torrent']."</font></b></a> | ";

让NexusPHP支持@功能

[download id=”720″]
先下载文件包,将里面的三个文件上传至文件夹根目录(当然,js和css样式文件可以传到其它目录,确保路径正确就行了),这里为了省事,我上传的是根文件夹下面

1、修改include文件夹下面的functions.php文件

funtion.php搜索:

print("<td align=\"left\"><textarea class=\"bbcode\" cols=\"100\" style=\"width: 650px;\" name=\"".$text."\" id=\"".$text."\" rows=\"20\" onkeydown=\"ctrlenter(event,'compose','qr')\">".$content."</textarea>");

在下面添加

?>
<link rel="stylesheet" href="userAutoTips.css" type="text/css">
<script type="text/javascript" src="userAutoTips.js"></script>
<script type="text/javascript">userAutoTips({id:'<?php  echo $text?>'});$(window).bind('scroll resize', function(e){userAutoTips({id:'<?php  echo $text?>'})})</script>

继续搜索function quickreply($formname, $taname,$submit){

在该方法的最后一行添加

<link rel="stylesheet" href="userAutoTips.css" type="text/css">
<script type="text/javascript" src="userAutoTips.js"></script>
<script type="text/javascript">userAutoTips({id:'qrbody'});$(window).bind('scroll resize', function(e){userAutoTips({id:'qrbody'})})</script>

该方法中textarea 添加ID参数

print("<textarea id=\"qrbody\" name='".$taname."' cols=\"100\" rows=\"8\" style=\"width: 450px\" onkeydown=\"ctrlenter(event,'compose','qr')\"></textarea>");

2、种子回复评论页面为comment.php,论坛帖子回复页面为:forums.php

*下面以修改forums.php页面为例,(comment.php回复的话系统会自动发送消息的,只不过由于改了functions.php,@还是会显示用户名的,不过不发送系统定义消息)

在// ————- start: functions ——————//下面添加如下方法

function at_user_message($topicid,$body,$postid){
global $Cache;
            $subject="You may be @";
           $url=$BASEURL."/forums.php?action=viewtopic&topicid=".$topicid."&page=p".$postid."#pid".($postid);
           $address="[url=$url]"."Click here to view the detail"."[/url]";
                        preg_match_all( "/\[@([0-9]+?)\]/ei",$body,$useridget);
                        $useridget[1] = array_unique($useridget[1]);
                        for($i = 0;$i < min(10,count($useridget[1])); $i++){
                        sql_query("INSERT INTO messages (sender, receiver, subject, msg, added) VALUES(0, " . $useridget[1][$i] . ",'$subject','$address', ".sqlesc(date("Y-m-d H:i:s")).")");
                        $Cache->delete_value('user_'.$useridget[1][$i].'_unread_message_count');
                        $Cache->delete_value('user_'.$useridget[1][$i].'_inbox_count');
                        }
}

搜索$postid = mysql_insert_id()

在这一行下面添加如下部分(调用上面的函数语句)

at_user_message($topicid,$body,$postid);

然后就可以使用功能了,@某一位后,系统会发送短消息的。(comment.php可以根据需求修改at_user_message函数)