mam stronę, na której muszę odczytać n razy dane zawarte w pliku xml na innym serwerze. Ma dwie wersje skryptu, obie mojego autorstwa, jednak obie zbyt wolne dla liczby danych większej niż 20...
Oto jak wygląda funkcja [wersja "na debila"]:
Kod
function getAddress($xpos, $ypos) {
// adres serwera, który zwraca plik xml [zamieszczony niżej 1]
$url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1';
$file = fopen($url, 'r'); // otwieram go
$content = fread($file, 1024); // zczytuję zawartość
fclose($file); // zamykam
return explode("\n", trim(strip_tags($content))); // tworzę sobie tablicę [2]
}
// adres serwera, który zwraca plik xml [zamieszczony niżej 1]
$url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1';
$file = fopen($url, 'r'); // otwieram go
$content = fread($file, 1024); // zczytuję zawartość
fclose($file); // zamykam
return explode("\n", trim(strip_tags($content))); // tworzę sobie tablicę [2]
}
Oto kod xml [1] (dla x=-8.22, y=54.46) http://ws.geonames.org/findNearbyPlaceName...2&maxRows=1 :
Kod
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<geonames>
<geoname>
<name>Rathglass</name>
<lat>54.4733333</lat>
<lng>-8.2341667</lng>
<geonameId>3307846</geonameId>
<countryCode>IE</countryCode>
<countryName>Ireland</countryName>
<fcl>P</fcl>
<fcode>PPLL</fcode>
<distance>1.7423977508579884</distance>
</geoname>
</geonames>
<geonames>
<geoname>
<name>Rathglass</name>
<lat>54.4733333</lat>
<lng>-8.2341667</lng>
<geonameId>3307846</geonameId>
<countryCode>IE</countryCode>
<countryName>Ireland</countryName>
<fcl>P</fcl>
<fcode>PPLL</fcode>
<distance>1.7423977508579884</distance>
</geoname>
</geonames>
W wyniku działania wcześniejszej funkcji otrzymuję:
Kod
Array
(
[0] => Rathglass
[1] => 54.4733333
[2] => -8.2341667
[3] => 3307846
[4] => IE
[5] => Ireland
[6] => P
[7] => PPLL
[8] =>1.7423977508579884
)
(
[0] => Rathglass
[1] => 54.4733333
[2] => -8.2341667
[3] => 3307846
[4] => IE
[5] => Ireland
[6] => P
[7] => PPLL
[8] =>1.7423977508579884
)
Z czego tak naprawdę potrzebowałem tylko 0. Sposób ten był wystarczająco dobry dla nieiwelkich danych.
Dla większej liczby danych się okazał zbyt wolny.
Przeszukaem forum i znalazłem:
Kod
function getAddress($xpos, $ypos) {
$url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1';
$file = fopen($url, 'r'); // LINIA 1
$content = fread($file, 1024); // LINIA 2
$xml = new SimpleXMLElement($content);
return $xml->geoname->name;
}
$url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1';
$file = fopen($url, 'r'); // LINIA 1
$content = fread($file, 1024); // LINIA 2
$xml = new SimpleXMLElement($content);
return $xml->geoname->name;
}
Jednak to też jest za wolne. BTW czy to w ogóle jest szybsze?
Czy można to jakoś przyspieszyć? Bo mi się wydaje, że zmiany w liniach 1 i 2 mogłyby przyspieszyć. Jednak jaka funkcja jest szybsza ? A może ja sie do tego jakoś źle zabieram?
Z góry dziękuję za odpowiedź
EDIT.
Spróbowałem jeszcze:
Kod
function getAddress($xpos, $ypos) {
$ar = file($url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1');
return $ar[3];
}
$ar = file($url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$ypos.'&lng='.$xpos.'&maxRows=1');
return $ar[3];
}
Skorzystam z http://webmade.org/porady/czas-generowania-strony-php.php i spróbuję dojśc która jest najliżej tego, czego szukam.
jakby ktoś chciał sie podzielić własnymi spostrzeżeniami. to się proszę nie krępować
