首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP UDP刮板的速度非常慢,该如何改进呢?

PHP UDP刮板的速度非常慢,该如何改进呢?
EN

Stack Overflow用户
提问于 2012-06-01 19:41:12
回答 1查看 655关注 0票数 0

我正在做我的一个小项目,并且已经构建了一个使用套接字来返回关于特定sha1散列的数据的UDP刮板。

它可以工作,但速度非常慢,我想知道是否有人知道如何加快速度或改进现有代码。

代码如下;

代码语言:javascript
复制
// SCRAPE UDP
private function scrapeUDP($tracker, $hash) {
    // GET TRACKER DETAILS
    preg_match('%udp://([^:/]*)(?::([0-9]*))?(?:/)?%i', $tracker, $info);
    // GENERATE TRANSACTION ID
    $transID = mt_rand(0, 65535);
    // PACKED TRANSACTION ID
    $packedTransID = pack('N', $transID);
    // ATTEMPT TO CREATE A SOCKET
    if(!$socket = @fsockopen('udp://' . $info[1], $info[2], $errno, $errstr, 2)) {
        return;
    }
    // SET STREAM TIMEOUT
    stream_set_timeout($socket, 2);
    // CONNECTION ID
    $connID = "\x00\x00\x04\x17\x27\x10\x19\x80";
    // BUILD CONNECTION REQUEST PACKET
    $packet = $connID . pack('N', 0) . $packedTransID;
    // SEND PACKET
    fwrite($socket, $packet);
    // CONNECTION RESPONSE
    $response = fread($socket, 16);
    // CHECK CONNECTION RESPONSE LENGTH
    if(strlen($response) < 16) {
        return;
    }
    // UNPACK CONNECTION RESPONSE
    $returnData = unpack('Naction/NtransID', $response);
    // CHECK CONNECTION RESPONSE DATA
    if($returnData['action'] != 0 || $returnData['transID'] != $transID) {
        return;
    }
    // GET CONNECTION ID
    $connID = substr($response, 8, 8);
    // BUILD SCRAPE PACKET
    $packet = $connID . pack('N', 2) . $packedTransID . $hash;
    // SEND SCRAPE PACKET
    fwrite($socket, $packet);
    // SCRAPE RESPONSE
    $response = fread($socket, 20);
    // CHECK SCRAPE RESPONSE LENGTH
    if(strlen($response) < 20) {
        return;
    }
    // UNPACK SCRAPE RESPONSE
    $returnData = unpack('Naction/NtransID', $response);
    // CHECK SCRAPE RESPONSE DATA
    if($returnData['action'] != 2 || $returnData['transID'] != $transID) {
        return;
    }
    // UNPACK SCRAPE INFORMATION
    $returnData = unpack('Nseeders/Ncompleted/Nleechers', substr($response, 8, 12));
    // RETURN TRACKER INFORMATION
    return array('seeders' => $returnData['seeders'], 'leechers' => $returnData['leechers'],);
}

这是我第一次创建任何与套接字或UDP有关的东西,所以请原谅我把它弄得一团糟!

谢谢..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-01 19:46:18

您必须使用socket_select()和非阻塞套接字或forks进行并行请求,因为您会花费大量时间等待响应。此外,最好使用低级函数,如socket_read()或类似函数,以便更好地控制连接和数据传输。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10849587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档