Witam, mam problem ze skryptem, który pobiera listę serwerów z mastera gry, lecz niestety wyskakuje mi błąd:
Z wygenerowanej tabeli, można wywnioskować, iż skrypt pobrał całą listę serwerów w czasie krótszym od maksymalnego, lecz zatrzymał się na linii 14 przy ostatnim pakiecie czyli nadal próbuje pobrać dane. Co zrobić aby skrypt nie generował tego błędu?
<?php
set_time_limit(1);
$time_start = microtime(TRUE);
$ip='etmaster.idsoftware.com';
$port=27950;
$prot=84;
$fp = fsockopen('udp://'.$ip, $port, $errno);
if (!$fp) {RETURN FALSE;}
fwrite($fp, chr(255).chr(255).chr(255).chr(255).'getservers '.$prot);
function master_buf($fp){
fwrite($fp, chr(255).chr(255).chr(255).chr(255).'getserversResponse');
$buf=stream_get_line($fp,0,'EO');
$buf=substr($buf,0,-3);
$n = explode('\\',$buf);
$servers=array();
$i=0;
foreach($n as $server) {
$len=strlen($server);
if($len!=6){continue;}
$i++;
$ip='';
for ($j=0;$j<$len-2;$j++) {
$ip.=ord($server[$j]).'.';
}
$ip=substr($ip,0,-1);
$port=(ord($server[$len-2])<<8)+ord($server[$len-1]);
array_push($servers,array($ip,$port));
}
RETURN array($servers,$i);
}
$i=0;
echo "
#
IP
Port
Time
$i
$server[0]
$server[1]
$time
"; fclose($fp); ?>[/code]
Na początku skryptu dopisz:
set_time_limit(10);[/code]
“10” - oznacza ilość sekund dozwoloną na wykonywanie skryptu.
Wpisanie “0” (słownie: “zero”) oznacza brak limitu czasowego.
Chyba się nie zrozumieliśmy. Specjalnie zmieniłem limit czasu, gdyż skrypt wykonuje się krócej niż jedna sekunda. Zmiana limitu nic nie pomoże, gdyż skrypt się po prostu zawiesza.
ra-v
(ra-v)
5 Luty 2011 22:11
#4
Jesteś pewien? Zmierz czas funkcją time(), oblicz upływające milisekundy od początku całego skryptu (strony) do końca.
Poza tym tutaj może się coś zapętlić na dłużej - jeden niewinny kiks i katastrofa gotowa.
for ($j=0;$j<$len-2;$j++) {
$ip.=ord($server[$j]).'.';
}
Czas 1 sekundy może dotyczyć czasu wykonywania skryptu na wszystkich procesorach, co może oznaczać że sekunda trwa w rzeczywistości np. 0.4 sekundy.
Podany fragment kodu, działa poprawnie, a mierzenie czasu przecież jest już dodane za pomocą microtime()
ra-v
(ra-v)
6 Luty 2011 17:03
#6
$microtime dłuższy niż 1 sekunda…? Widocznie Twój serwer ma odgórne ograniczenie na czas wykonywania skryptu lub gdzieś przekłamany jest czas.
# IP Port Time
1 88.159.160.153 27960 1.4370310306549
2 83.167.43.6 47739 1.4370589256287
3 84.167.178.194 27317 1.437066078186
4 173.181.35.160 50703 1.4370720386505
5 109.70.221.6 28500 1.4370770454407
6 217.163.25.221 27960 1.4370830059052
7 78.143.58.142 28020 1.4370949268341
8 208.43.15.6 27960 1.4371008872986
9 94.46.15.200 27970 1.4371058940887
10 94.254.49.146 27960 1.4371120929718
11 195.28.69.133 27961 1.4371168613434
12 188.106.255.15 27960 1.4371218681335
13 88.191.78.160 27960 1.4371280670166
14 122.25.218.178 27964 1.4371330738068
15 203.173.40.74 27960 1.4371390342712
16 85.236.100.205 28260 1.4371440410614
17 88.80.222.19 27960 1.4371490478516
18 193.42.218.20 27960 1.4371540546417
19 62.28.50.165 53111 1.4371600151062
20 95.215.240.52 27066 1.4371650218964
21 85.10.200.9 27966 1.4371700286865
22 213.52.36.115 27960 1.4371750354767
23 85.195.123.211 27962 1.4371809959412
24 188.165.50.108 28100 1.4371860027313
25 66.55.137.163 27960 1.4371910095215
26 68.232.181.89 27960 1.4371960163116
27 84.43.191.34 27960 1.4372019767761
28 77.43.51.151 27960 1.4372069835663
29 217.159.236.173 27960 1.4372119903564
30 193.33.34.11 27965 1.4372179508209
(.....)
1587 213.108.31.33 27015 1.5402569770813
1588 213.108.29.162 27035 1.5402619838715
1589 46.4.23.87 27565 1.5402669906616
1590 91.121.207.61 27961 1.5402729511261
1591 188.165.209.117 29500 1.5402779579163
1592 213.108.29.130 27965 1.5402829647064
1593 188.40.127.132 27095 1.5402889251709
1594 213.108.29.161 27075 1.5402939319611
1595 213.108.31.91 27015 1.5402989387512
1596 213.108.31.61 27965 1.5403048992157
1597 213.108.29.198 27015 1.5403099060059
1598 46.4.226.111 27700 1.540314912796
1599 213.108.29.146 27085 1.5403208732605
1600 83.169.60.84 27800 1.5403258800507
1601 85.131.176.215 27960 1.5403308868408
1602 213.239.202.61 27965 1.5403370857239
1603 46.4.226.111 27900 1.540342092514
1604 62.113.218.104 27900 1.5403468608856
1605 188.165.209.117 31500 1.5403530597687
1606 78.46.59.14 27971 1.5403580665588
1607 213.108.29.165 27045 1.540363073349
1608 213.108.31.64 27045 1.5403690338135
1609 46.4.23.87 27035 1.5403740406036
1610 188.138.32.179 27960 1.5403790473938
1611 78.46.102.175 32100 1.5403850078583
1612 188.138.84.165 27920 1.5403900146484
1613 85.131.176.215 27963 1.5403950214386
1614 85.131.176.215 27961 1.5404009819031
1615 213.108.31.119 27025 1.5404288768768
1616 78.46.59.14 27900 1.5404350757599
1617 91.203.223.87 27900 1.5404410362244
1618 213.108.29.133 27035 1.5404460430145
1619 91.203.223.87 27200 1.540452003479
1620 78.46.102.175 30100 1.5404570102692
1621 213.108.29.141 27105 1.5404620170593
1622 173.192.216.109 27800 1.5404670238495
1623 178.33.12.233 1040 1.5406038761139
1624 213.108.29.119 27015 1.5406129360199
1625 94.23.219.198 1960 1.5406179428101
u mnie ostatni czas wynosi jedynie 0.24718189239502, a mimo to pojawia się ten błąd… :?
ra-v
(ra-v)
6 Luty 2011 21:45
#8
To pisz do Admina, bo dalsze prace z tym serwerem to jak mówienie ślepego do głuchego czy dziś świeci słońce…
Dziękuje za szczere chęci pomocy ale nic z tego, gdyż błąd był czysto logistyczny (takie chyba są najgorsze)
while($buf=master_buf($fp) and $buf[1]>100)
i problem rozwiązany