308760841 发表于 2024/12/7 13:59

NexusPHP1.5 如PT客户端有V4V6地址或多ip,做种汇报数据问题的处理过程

本帖最后由 308760841 于 2024/12/8 17:12 编辑

本教程来自BTSCHOOL站网友的分享,感谢!!

停止网站访问!!!

1.清理snatched表重复数据。PHP命令脚本处理,脚本代码如下:
<?php

ini_set('memory_limit','4G');

echo 'start    '.date('Y-m-d H:i:s')."\r\n";
function connect_db_local(){
    // 数据库连接信息
    $host = "localhost";
    $username = "root";
    $password = "root";
    $database = "nexusphp";

    // 连接数据库
    $conn = mysql_connect($host, $username, $password);
    if (!$conn) {
      die("连接失败: " . mysql_error());
    }

    // 选择数据库
    mysql_select_db($database, $conn);


}
//连接数据库
connect_db_local();

//创建删除记录表
create_del_table();

//执行次数记录器
$handle_times = 0;
//一次执行,最大处理的重复数据数量
$max_times = 9999;
//每次查询30条有重复信息的数据
$sql_limit = 100;

//处理snateched表重复数据
handle_snatched();

echo 'end      '.date('Y-m-d H:i:s')."\r\n";
exit('finished');



function create_del_table(){
    $snatched = "CREATE TABLE IF NOT EXISTS `snatched_del` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `torrentid` mediumint(8) unsigned NOT NULL DEFAULT '0',
    `userid` mediumint(8) unsigned NOT NULL DEFAULT '0',
    `ip` varchar(64) NOT NULL DEFAULT '',
    `port` smallint(5) unsigned NOT NULL DEFAULT '0',
    `uploaded` bigint(20) unsigned NOT NULL DEFAULT '0',
    `downloaded` bigint(20) unsigned NOT NULL DEFAULT '0',
    `to_go` bigint(20) unsigned NOT NULL DEFAULT '0',
    `seedtime` int(10) unsigned NOT NULL DEFAULT '0',
    `leechtime` int(10) unsigned NOT NULL DEFAULT '0',
    `last_action` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
    `startdat` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
    `completedat` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
    `finished` enum('yes','no') NOT NULL DEFAULT 'no',
    `HR` enum('A','B','C','D') NOT NULL DEFAULT 'A',
    PRIMARY KEY (`id`),
    KEY `torrentid_userid` (`torrentid`,`userid`),
    KEY `userid` (`userid`),
    KEY `torrentid` (`torrentid`),
    KEY `id` (`id`,`torrentid`,`userid`,`finished`,`HR`),
    KEY `torrentid_2` (`torrentid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
    sql_query($snatched);
}

function sql_query($sql){
    return mysql_query($sql);
}




function handle_snatched(){
    global $handle_times,$max_times,$sql_limit;
   
    if($handle_times > $max_times){
      exit("run over {$handle_times} times exit");
    }
    $handle_times++;
   

    //查询snatched表有重复信息的数据
    $sql = 'SELECT torrentid, userid, COUNT(*) AS num_duplicates FROM snatched GROUP BY torrentid, userid HAVING COUNT(*) > 1 limit ' . $sql_limit . ';';

    $res = sql_query($sql);
    if (mysql_num_rows($res) > 0){
      while ($line = mysql_fetch_assoc($res)) {
            $torrentid = $line['torrentid'];
            $userid = $line['userid'];

            // 查询具体重复的数据
            $detail_sql = "SELECT * FROM snatched WHERE torrentid = $torrentid AND userid = $userid order by id asc;";

            $result = sql_query($detail_sql);

            // 删除重复的数据
            $i = 0;
            while ($row = mysql_fetch_assoc($result)) {
                $i++;
                if($i == 1){
                  continue;
                }
                $insert_sql = 'insert into snatched_del (id, torrentid, userid,ip,port,uploaded,downloaded,to_go,seedtime,leechtime,last_action,startdat,completedat,finished,HR) values ('.$row['id'].','.$row['torrentid'].','.$row['userid'].',"'.$row['ip'].'",'.$row['port'].','.$row['uploaded'].','.$row['downloaded'].','.$row['to_go'].','.$row['seedtime'].','.$row['leechtime'].',"'.$row['last_action'].'","'.$row['startdat'].'","'.$row['completedat'].'","'.$row['finished'].'","'.$row['HR'].'");';
               
                //var_dump($insert_sql);exit;
                sql_query($insert_sql);

                $delete_sql = 'DELETE FROM snatched where id = '.$row['id'];

                sql_query($delete_sql);
            }
      }
      mysql_free_result($result); // 释放结果集
      handle_snatched();
    }
}


上面表字段有差别,自行改!

执行完,都提示finish了,去数据库执行SELECT torrentid, userid, COUNT(*) AS num_duplicates FROM snatched GROUP BY torrentid, userid HAVING COUNT(*) > 1 limit 30;

看数据是否为0!

2.重启mysql,清理peer表。

3.给peers与snatched两张表加唯一约束的

ALTER TABLE peers ADD UNIQUE INDEX torrent_peer_id (torrent, peer_id);
ALTER TABLE snatched ADD UNIQUE INDEX torrentid_userid_unique (torrentid, userid);

4.改announce.php代码

详见如下
<?php
require_once('include/bittorrent_announce.php');
require_once('include/benc.php');
dbconn_announce();
//1. BLOCK ACCESS WITH WEB BROWSERS AND CHEATS!
$agent = $_SERVER["HTTP_USER_AGENT"];
block_browser();
//2. GET ANNOUNCE VARIABLES
// get string type passkey, info_hash, peer_id, event, ip from client
foreach (array("passkey","info_hash","peer_id","event") as $x)
{
        if(isset($_GET["$x"]))
        $GLOBALS[$x] = $_GET[$x];
}
// get integer type port, downloaded, uploaded, left from client
foreach (array("port","downloaded","uploaded","left","compact","no_peer_id") as $x)
{
        $GLOBALS[$x] = 0 + $_GET[$x];
}
//check info_hash, peer_id and passkey
foreach (array("passkey","info_hash","peer_id","port","downloaded","uploaded","left") as $x)
        if (!isset($x)) err("Missing key: $x");
foreach (array("info_hash","peer_id") as $x)
        if (strlen($GLOBALS[$x]) != 20) err("Invalid $x (" . strlen($GLOBALS[$x]) . " - " . rawurlencode($GLOBALS[$x]) . ")");
if (strlen($passkey) != 32) err("Invalid passkey (" . strlen($passkey) . " - $passkey)");

//4. GET IP AND CHECK PORT
$ip = getip();        // avoid to get the spoof ip from some agent
if (!$port || $port > 0xffff)
        err("invalid port");
if (!ip2long($ip)) //Disable compact announce with IPv6
        $compact = 0;

// check port and connectable
if (portblacklisted($port))
        err("Port $port is blacklisted.");

//5. GET PEER LIST
// Number of peers that the client would like to receive from the tracker.This value is permitted to be zero. If omitted, typically defaults to 50 peers.
$rsize = 50;
foreach(array("numwant", "num want", "num_want") as $k)
{
        if (isset($_GET[$k]))
        {
                $rsize = 0 + $_GET[$k];
                break;
        }
}

// set if seeder based on left field
$seeder = ($left == 0) ? "yes" : "no";

// check passkey
if (!$az = $Cache->get_value('user_passkey_'.$passkey.'_content')){
        $res = sql_query("SELECT id, downloadpos, enabled, uploaded, downloaded, class, parked, clientselect, showclienterror FROM users WHERE passkey=". sqlesc($passkey)." LIMIT 1");
        $az = mysql_fetch_array($res);
        $Cache->cache_value('user_passkey_'.$passkey.'_content', $az, 950);
}
if (!$az) err("Invalid passkey! Re-download the .torrent from $BASEURL");
$userid = 0+$az['id'];

//3. CHECK IF CLIENT IS ALLOWED
$clicheck_res = check_client($peer_id,$agent,$client_familyid);
if($clicheck_res){
        if ($az['showclienterror'] == 'no')
        {
                sql_query("UPDATE users SET showclienterror = 'yes' WHERE id = ".sqlesc($userid));
                $Cache->delete_value('user_passkey_'.$passkey.'_content');
        }
        err($clicheck_res);
}
elseif ($az['showclienterror'] == 'yes'){
        $USERUPDATESET[] = "showclienterror = 'no'";
        $Cache->delete_value('user_passkey_'.$passkey.'_content');
}

// check torrent based on info_hash
if (!$torrent = $Cache->get_value('torrent_hash_'.$info_hash.'_content')){
        $res = sql_query("SELECT id, owner, sp_state, seeders, leechers, UNIX_TIMESTAMP(added) AS ts, banned FROM torrents WHERE " . hash_where("info_hash", $info_hash));
        $torrent = mysql_fetch_array($res);
        $Cache->cache_value('torrent_hash_'.$info_hash.'_content', $torrent, 350);
}
if (!$torrent) err("torrent not registered with this tracker");
elseif ($torrent['banned'] == 'yes' && $az['class'] < $seebanned_class) err("torrent banned");
// select peers info from peers table for this torrent
$torrentid = $torrent["id"];
$numpeers = $torrent["seeders"]+$torrent["leechers"];

$re_announce = false;
//20秒内的请求视为重复请求
if($Cache->get_value('reannounce_time_'.$torrentid.'_'.$userid) == "yes"){
        $re_announce = true;
}else{
        //非重复请求根据userid和torrentid设置memcached 限制请求的最小间隔
        $Cache->cache_value('reannounce_time_'.$torrentid.'_'.$userid, "yes", 20);
}


if ($seeder == 'yes'){ //Don't report seeds to other seeders
        $only_leech_query = " AND seeder = 'no' ";
        $newnumpeers = $torrent["leechers"];
}
else{
        $only_leech_query = "";
        $newnumpeers = $numpeers;
}
if ($newnumpeers > $rsize)
        $limit = " ORDER BY RAND() LIMIT $rsize";
else $limit = "";
$announce_wait = 30;

$fields = "seeder, peer_id, ip, port, uploaded, downloaded, (".TIMENOW." - UNIX_TIMESTAMP(last_action)) AS announcetime, UNIX_TIMESTAMP(prev_action) AS prevts";
$peerlistsql = "SELECT ".$fields." FROM peers WHERE torrent = ".$torrentid." AND connectable = 'yes' ".$only_leech_query.$limit;
$res = sql_query($peerlistsql);

$real_annnounce_interval = $announce_interval;
if ($anninterthreeage && ($anninterthree > $announce_wait) && (TIMENOW - $torrent['ts']) >= ($anninterthreeage * 86400))
$real_annnounce_interval = $anninterthree;
elseif ($annintertwoage && ($annintertwo > $announce_wait) && (TIMENOW - $torrent['ts']) >= ($annintertwoage * 86400))
$real_annnounce_interval = $annintertwo;

$resp = "d" . benc_str("interval") . "i" . $real_annnounce_interval . "e" . benc_str("min interval") . "i" . $announce_wait . "e". benc_str("complete") . "i" . $torrent["seeders"] . "e" . benc_str("incomplete") . "i" . $torrent["leechers"] . "e" . benc_str("peers");

$peer_list = "";
unset($self);
// bencoding the peers info get for this announce
while ($row = mysql_fetch_assoc($res))
{
        $row["peer_id"] = hash_pad($row["peer_id"]);

        // $peer_id is the announcer's peer_id while $row["peer_id"] is randomly selected from the peers table
        if ($row["peer_id"] === $peer_id)
        {
                $self = $row;
                continue;
        }
if ($compact == 1){
        $longip = ip2long($row['ip']);
        if ($longip) //Ignore ipv6 address
                $peer_list .= pack("Nn", sprintf("%d",$longip), $row['port']);
}
elseif ($no_peer_id == 1)
        $peer_list .= "d" .
        benc_str("ip") . benc_str($row["ip"]) .
        benc_str("port") . "i" . $row["port"] . "e" .
        "e";
else
        $peer_list .= "d" .
        benc_str("ip") . benc_str($row["ip"]) .
        benc_str("peer id") . benc_str($row["peer_id"]) .
        benc_str("port") . "i" . $row["port"] . "e" .
        "e";
}
if ($compact == 1)
$resp .= benc_str($peer_list);
else
$resp .= "l".$peer_list."e";

$resp .= "e";

if($re_announce){
        goto end_output;
}

$selfwhere = "torrent = $torrentid AND " . hash_where("peer_id", $peer_id);

//no found in the above random selection
if (!isset($self))
{
        $res = sql_query("SELECT $fields FROM peers WHERE $selfwhere LIMIT 1");
        $row = mysql_fetch_assoc($res);
        if ($row)
        {
                $self = $row;
        }
}

// min announce time
if(isset($self) && $self['prevts'] > (TIMENOW - $announce_wait))
        err('There is a minimum announce time of ' . $announce_wait . ' seconds');

// current peer_id, or you could say session with tracker not found in table peers
if (!isset($self))
{
        //2024-12-07 防止客户端硬重启后同一用户同一ip同一种子出现两个peerid
        $sameIPRecord = mysql_fetch_assoc(sql_query("select id from peers where torrent = $torrentid and userid = $userid and ip = '$ip' limit 1"));
    if (!empty($sameIPRecord) && $seeder == 'yes') {
      err("You cannot seed the same torrent in the same location from more than 1 client.");
    }
        $valid = @mysql_fetch_row(@sql_query("SELECT COUNT(*) FROM peers WHERE torrent=$torrentid AND userid=" . sqlesc($userid)));
        if ($valid >= 1 && $seeder == 'no') err("You already are downloading the same torrent. You may only leech from one location at a time.");
        if ($valid >= 3 && $seeder == 'yes') err("You cannot seed the same torrent from more than 3 locations.");

        if ($az["enabled"] == "no")
        err("Your account is disabled!");
        elseif ($az["parked"] == "yes")
        err("Your account is parked! (Read the FAQ)");
        elseif ($az["downloadpos"] == "no")
        err("Your downloading priviledges have been disabled! (Read the rules)");

        if ($az["class"] < UC_VIP)
        {
                $ratio = (($az["downloaded"] > 0) ? ($az["uploaded"] / $az["downloaded"]) : 1);
                $gigs = $az["downloaded"] / (1024*1024*1024);
                if ($waitsystem == "yes")
                {
                        if($gigs > 10)
                        {
                                $elapsed = strtotime(date("Y-m-d H:i:s")) - $torrent["ts"];
                                if ($ratio < 0.4) $wait = 24;
                                elseif ($ratio < 0.5) $wait = 12;
                                elseif ($ratio < 0.6) $wait = 6;
                                elseif ($ratio < 0.8) $wait = 3;
                                else $wait = 0;

                                if ($elapsed < $wait)
                                err("Your ratio is too low! You need to wait " . mkprettytime($wait * 3600 - $elapsed) . " to start, please read $BASEURL/faq.php#id46 for details");
                        }
                }
                if ($maxdlsystem == "yes")
                {
                        if($gigs > 10)
                        if ($ratio < 0.5) $max = 1;
                        elseif ($ratio < 0.65) $max = 2;
                        elseif ($ratio < 0.8) $max = 3;
                        elseif ($ratio < 0.95) $max = 4;
                        else $max = 0;
                        if ($max > 0)
                        {
                                $res = sql_query("SELECT COUNT(*) AS num FROM peers WHERE userid='$userid' AND seeder='no'") or err("Tracker error 5");
                                $row = mysql_fetch_assoc($res);
                                if ($row['num'] >= $max) err("Your slot limit is reached! You may at most download $max torrents at the same time, please read $BASEURL/faq.php#id66 for details");
                        }
                }
        }
}
else // continue an existing session
{
        $upthis = $trueupthis = max(0, $uploaded - $self["uploaded"]);
        $downthis = $truedownthis = max(0, $downloaded - $self["downloaded"]);
        $announcetime = ($self["seeder"] == "yes" ? "seedtime = seedtime + $self" : "leechtime = leechtime + $self");
        $is_cheater = false;
       
        if ($cheaterdet_security){
                if ($az['class'] < $nodetect_security && $self['announcetime'] > 10)
                {
                        $is_cheater = check_cheater($userid, $torrent['id'], $upthis, $downthis, $self['announcetime'], $torrent['seeders'], $torrent['leechers']);
                }
        }

        if (!$is_cheater && ($trueupthis > 0 || $truedownthis > 0))
        {
                $global_promotion_state = get_global_sp_state();
                if($global_promotion_state == 1)// Normal, see individual torrent
                {
                        if($torrent['sp_state']==3) //2X
                        {
                                $USERUPDATESET[] = "uploaded = uploaded + 2*$trueupthis";
                                $USERUPDATESET[] = "downloaded = downloaded + $truedownthis";
                        }
                        elseif($torrent['sp_state']==4) //2X Free
                        {
                                $USERUPDATESET[] = "uploaded = uploaded + 2*$trueupthis";
                        }
                        elseif($torrent['sp_state']==6) //2X 50%
                        {
                                $USERUPDATESET[] = "uploaded = uploaded + 2*$trueupthis";
                                $USERUPDATESET[] = "downloaded = downloaded + $truedownthis/2";
                        }
                        else{
                                if ($torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                        $upthis = $trueupthis * $uploaderdouble_torrent;

                                if($torrent['sp_state']==2) //Free
                                {
                                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                                }
                                elseif($torrent['sp_state']==5) //50%
                                {
                                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis/2";
                                }
                                elseif($torrent['sp_state']==7) //30%
                                {
                                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis*3/10";
                                }
                                elseif($torrent['sp_state']==1) //Normal
                                {
                                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis";
                                }
                        }
                }
                elseif($global_promotion_state == 2) //Free
                {
                        if ($torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                }
                elseif($global_promotion_state == 3) //2X
                {
                        if ($uploaderdouble_torrent > 2 && $torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        else $upthis = 2*$trueupthis;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis";
                }
                elseif($global_promotion_state == 4) //2X Free
                {
                        if ($uploaderdouble_torrent > 2 && $torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        else $upthis = 2*$trueupthis;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                }
                elseif($global_promotion_state == 5){ // 50%
                        if ($torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis/2";
                }
                elseif($global_promotion_state == 6){ //2X 50%
                        if ($uploaderdouble_torrent > 2 && $torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        else $upthis = 2*$trueupthis;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis/2";
                }
                elseif($global_promotion_state == 7){ //30%
                        if ($torrent['owner'] == $userid && $uploaderdouble_torrent > 0)
                                $upthis = $trueupthis * $uploaderdouble_torrent;
                        $USERUPDATESET[] = "uploaded = uploaded + $upthis";
                        $USERUPDATESET[] = "downloaded = downloaded + $truedownthis*3/10";
                }
        }
}

$dt = sqlesc(date("Y-m-d H:i:s"));
$updateset = array();
// set non-type event
if (!isset($event))
        $event = "";
if (isset($self) && $event == "stopped")
{
        sql_query("DELETE FROM peers WHERE $selfwhere") or err("D Err");
        if (mysql_affected_rows())
        {
                $updateset[] = ($self["seeder"] == "yes" ? "seeders = seeders - 1" : "leechers = leechers - 1");
                sql_query("UPDATE snatched SET uploaded = uploaded + $trueupthis, downloaded = downloaded + $truedownthis, to_go = $left, $announcetime, last_action = ".$dt." WHERE torrentid = $torrentid AND userid = $userid") or err("SL Err 1");
        }
}
elseif(isset($self))
{
        if ($event == "completed")
        {
                //sql_query("UPDATE snatched SETfinished= 'yes', completedat = $dt WHERE torrentid = $torrentid AND userid = $userid");
                $finished = ", finishedat = ".TIMENOW;
                $finished_snatched = ", completedat = ".$dt . ", finished= 'yes'";
                $updateset[] = "times_completed = times_completed + 1";
        }

        sql_query("UPDATE peers SET ip = ".sqlesc($ip).", port = $port, uploaded = $uploaded, downloaded = $downloaded, to_go = $left, prev_action = last_action, last_action = $dt, seeder = '$seeder', agent = ".sqlesc($agent)." $finished WHERE $selfwhere") or err("PL Err 1");

        if (mysql_affected_rows())
        {
                if ($seeder <> $self["seeder"])
                $updateset[] = ($seeder == "yes" ? "seeders = seeders + 1, leechers = leechers - 1" : "seeders = seeders - 1, leechers = leechers + 1");
                sql_query("UPDATE snatched SET uploaded = uploaded + $trueupthis, downloaded = downloaded + $truedownthis, to_go = $left, $announcetime, last_action = ".$dt." $finished_snatched WHERE torrentid = $torrentid AND userid = $userid") or err("SL Err 2");
        }
}
else
{
        $sockres = @pfsockopen($ip, $port, $errno, $errstr, 5);
        if (!$sockres)
        {
                $connectable = "no";
        }
        else
        {
                $connectable = "yes";
                @fclose($sockres);
        }
        //查询peer 20241207
        $check_peers_exist = sql_query("select id from peers where $selfwhere limit 1");
    if (mysql_num_rows($check_peers_exist) == 0) {
                try{
                        //sql_query("INSERT INTO peers (torrent, userid, peer_id, ip, port, connectable, uploaded, downloaded, to_go, started, last_action, seeder, agent, downloadoffset, uploadoffset, passkey) VALUES ($torrentid, $userid, ".sqlesc($peer_id).", ".sqlesc($ip).", $port, '$connectable', $uploaded, $downloaded, $left, $dt, $dt, '$seeder', ".sqlesc($agent).", $downloaded, $uploaded, ".sqlesc($passkey).")") or err("PL Err 2");
                        if(!sql_query("INSERT INTO peers (torrent, userid, peer_id, ip, port, connectable, uploaded, downloaded, to_go, started, last_action, seeder, agent, downloadoffset, uploadoffset, passkey) VALUES ($torrentid, $userid, ".sqlesc($peer_id).", ".sqlesc($ip).", $port, '$connectable', $uploaded, $downloaded, $left, $dt, $dt, '$seeder', ".sqlesc($agent).", $downloaded, $uploaded, ".sqlesc($passkey).")")){
                                goto end_output;
                        }
                        if (mysql_affected_rows())
                        {
                                $updateset[] = ($seeder == "yes" ? "seeders = seeders + 1" : "leechers = leechers + 1");
                               
                                //$check = @mysql_fetch_row(@sql_query("SELECT COUNT(*) FROM snatched WHERE torrentid = $torrentid AND userid = $userid"));
                                $check = mysql_fetch_assoc(sql_query("SELECT id FROM snatched WHERE torrentid = $torrentid AND userid = $userid limit 1"));
                                if (!isset($check['id']) || !$check['id'])
                                        sql_query("INSERT INTO snatched (torrentid, userid, ip, port, uploaded, downloaded, to_go, startdat, last_action) VALUES ($torrentid, $userid, ".sqlesc($ip).", $port, $uploaded, $downloaded, $left, $dt, $dt)") or err("SL Err 4");
                                else
                                        sql_query("UPDATE snatched SET to_go = $left, last_action = ".$dt ." WHERE torrentid = $torrentid AND userid = $userid") or err("SL Err 3.1");
                        }
                }catch(\Exception $e){

                }
               
        }
}

if (count($updateset)) // Update only when there is change in peer counts
{
        $updateset[] = "visible = 'yes'";
        $updateset[] = "last_action = $dt";
        sql_query("UPDATE torrents SET " . join(",", $updateset) . " WHERE id = $torrentid");
}

if($client_familyid != 0 && $client_familyid != $az['clientselect'])
        $USERUPDATESET[] = "clientselect = ".sqlesc($client_familyid);

if(count($USERUPDATESET) && $userid)
{
        sql_query("UPDATE users SET " . join(",", $USERUPDATESET) . " WHERE id = ".$userid);
}
end_output:
benc_resp_raw($resp);
?>

其代码,替换前做好备份

最后删除数据表snatched_del

308760841 发表于 2024/12/7 14:00

本帖最后由 308760841 于 2024/12/7 14:10 编辑

小樱,来些樱币{:130:}

小樱 发表于 2024/12/7 18:12

感谢分享,目前看起来就是可能会触发用户列表有多个ip,流量汇报数据是正确的,不过本地测试并没复现多个ip的现象,能修复显示肯定是更好的啦
页: [1]
查看完整版本: NexusPHP1.5 如PT客户端有V4V6地址或多ip,做种汇报数据问题的处理过程