PHP UDP刮刀的速度非常慢,如何改进?

时间:2012-06-01 11:41:12

标签: php performance sockets

我正在开发一个我的小项目并构建了一个UDP scraper,它使用套接字返回有关特定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有关的内容,请原谅我,如果它是一团糟!

...谢谢

1 个答案:

答案 0 :(得分:2)

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