[PHP]Jak pozbyć się błędu ,,maximum execution time"

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.

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()

$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… :?

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) :smiley:

while($buf=master_buf($fp) and $buf[1]>100)

i problem rozwiązany