PHP UDP抓取器的速度慢得令人难以置信,如何提高


Speed of PHP UDP scraper is incredibly slow, how to improve?

我正在做我的一个小项目,并构建了一个UDP抓取器,它使用套接字返回有关特定sha1哈希的数据。

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

代码如下;

// 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有关的任何内容,所以如果一团糟,请原谅我!

谢谢。。。

您必须使用 socket_select() 和非阻塞套接字或分叉发出并行请求,因为您需要花费大量时间等待响应。此外,最好使用socket_read()等低级函数或类似的功能来更好地控制连接和数据传输。