Runescape id/name koppelen
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)
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
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>';
?>
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 John Doe
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
Gewijzigd op 01/01/1970 01:00:00 door John Doe
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)
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