2012-06-01 16 views
0

我正在研究我的一个小项目,并构建了一个使用套接字返回有关特定sha1散列的数据的UDP scraper。PHP UDP scraper的速度非常慢,如何提高?

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

代码如下;

// 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有关的事情,所以原谅我,如果它是一团糟!

谢谢...

回答

2

你必须要使用socket_select()和非阻塞套接字或forks并行的要求,因为你是在等待响应花费了大量的时间。此外,使用socket_read()等低级函数或更类似于控制连接和数据传输可能会更好。

+0

好的谢谢我不知道这些功能的存在。 – Griff