Versio

Runescape id/name koppelen

Overzicht Reageren

Daniel Voogsgerd

Daniel Voogsgerd

02/10/2009 20:10:00
Quote Anchor link
Hoi allemaal,
Ik ben bezig met een script dat alle runescape item id's zoekt en koppelt met hun naam om later opgeslagen te kunnen worden.

cURL normaal:
Snelheid 0.5 per item.

cURL_multi met 5 items tegelijk:
Snelheid 0.2 per item.

cURL_multi met 10 items tegelijk:
Snelheid 0.14 per item.

Weet iemand of die sneller/effectiever kan, zoja hoe?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
echo 'Started at '.date("H:i:s").'<br />';
flush();
function
name_id($data){
$begin = '<div class="brown_box main_ge_page vertically_spaced">'."\n".'<div class="subsectionHeader">';
$eind = '</div>';
if (preg_match("/Error/i",$data)){
        $result = "Bestaat niet";
    }
else{
        $exploded = explode($begin,$data);
        $exploded = explode($eind,$exploded[1]);
        $result = str_replace('<br />','',nl2br($exploded[0]));
    }

    return trim($result);
}

$getallen = range(0, 100);
$cURL_done = 0;
$last = 0;
// Urls to download
$urls = array();
foreach ($getallen as $value){
    $urls[] = 'http://itemdb-rs.runescape.com/viewitem.ws?obj='.$value;
}

    $threads = 10;
    $timeout = 30;

    $mcurl = curl_multi_init();
    $threadsRunning = 0;
    $urls_id = 0;
for(;;) {
        //de vrije ruimtes vullen
        while ($threadsRunning < $threads && $urls_id < count($urls)) {
            //echo 'Adding download link: '.$urls[$urls_id].'<br>';
            //flush();

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_URL, $urls[$urls_id++]);
            curl_multi_add_handle($mcurl, $ch);
            $threadsRunning++;
        }

        //Als hij klaar is
        if ($threadsRunning == 0 && $urls_id >= count($urls))
        break;
        
        //cURL
        curl_multi_select($mcurl);
        while(($mcRes = curl_multi_exec($mcurl, $mcActive)) == CURLM_CALL_MULTI_PERFORM) usleep(100000);
        if($mcRes != CURLM_OK) break;
        while($done = curl_multi_info_read($mcurl)) {
            $ch = $done['handle'];
            $done_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
            $done_content = curl_multi_getcontent($ch);
            
            if(curl_errno($ch) == 0) {
                //output als er geen errors zijn
                $id = array_search($done_url, $urls);
                $id_name[$id]= name_id($done_content);
                $cURL_done++;
                $cURL_perCent = round($cURL_done / count($urls) * 100);
                $cURL_perDecem = floor($cURL_perCent / 10) * 10;
                if($last != $cURL_perDecem){
                    echo $cURL_perDecem.'% at '.date("H:i:s").'<br />';
                    $last = $cURL_perDecem;
                }

                flush();
                }
else {
                    //output als er een error is
                    echo "Link <a href='$done_url'>$done_url</a> failed: ".curl_error($ch)."<br>\n";
                    flush();
                }

                    curl_multi_remove_handle($mcurl, $ch);
                    curl_close($ch);
                    $threadsRunning--;
        }
    }

curl_multi_close($mcurl);
ksort($id_name);
echo 'Completed. at '.date("H:i:s");

echo '<pre>';
print_r($id_name);
echo '</pre>';
?>
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd
 
PHP hulp

PHP hulp

25/05/2012 15:09:46
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Gerard M

Gerard M

02/10/2009 21:43:00
Quote Anchor link
Je kan curl_multi_init gebruiken om veel requests tegelijk uit te voeren.

http://uk3.php.net/manual/en/function.curl-multi-init.php

Je moet wel opletten dat je d'r geen DOS attack van maakt trouwens ;)
Gewijzigd op 01/01/1970 01:00:00 door Gerard M
 
Daniel Voogsgerd

Daniel Voogsgerd

02/10/2009 22:06:00
Quote Anchor link
Lol je eigen/runescapes server ruïneren ;) Heb het script geupdate. Zie bovenaan.
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd
 
Gerard M

Gerard M

03/10/2009 14:31:00
Quote Anchor link
Ik weet niet hoe runscape in elkaar zit (ik heb het nooit gespeeld). Maar als ik zo kijk lijkt het er op dat niet elk ID nummer bestaat - dus die nummers kan je overslaan. Daarnaast denk ik niet dat het veel sneller kan gaan met php.

Je kan proberen met nog meer threads te werken? En als runescape maar N connecties toestaat een proxy gebruiken? Draai je het script op een goede internet connectie trouwens?

Als ik wget gebruik zit ik ook rond de 0.3 seconde per item (1 connectie per keer). Dus 0.3 seconde lijkt het minimum per request.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
#!/bin/bash

for (( i=1; i<=100; i++ ))
do
    wget http://itemdb-rs.runescape.com/viewitem.ws?obj=${i};
done
?>



Btw, ik neem aan dat je het script niet 'per request' draait maar als een cronjob, en de output in een database steekt?
Gewijzigd op 01/01/1970 01:00:00 door Gerard M
 
Daniel Voogsgerd

Daniel Voogsgerd

03/10/2009 17:55:00
Quote Anchor link
Het nadeel is dat runescape nog al is wil wisselen van id's vanwege robots. Ik laat het script voorlopig nog even op mijn localhost draaien mbv xxamp zit nu op 0.2 seconde en idd het is een cronjob kijk ff of het allemaal lukt en dan breng ik jullie op de hoogte.

Edit: hij is nu aan het scannen. ongeveer 60%
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd
 



Overzicht Reageren

Get Adobe Flash player