Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xml / geocode reverse] Skrypt działa zbyt wolno
Forum PHP.pl > Forum > XML, AJAX
yarpo
Witam.

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]
}


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>


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
)


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;
}


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];
}


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ć smile.gif
NoiseMc
Funkcja dziala wolno bo musi otworzyc zdalne polaczenie z serwerem zeby odczytac plik XML z danymi. Przeskoczyc sie tego nie da. Mozesz ewentualnie keszowac otrzymane pliki i nastepny raz jak ktos zapyta o te same koordynaty to nie bedziesz odpytywal zdalnego serwera tylko zaczytywal dane z lokalnego pliku, a to na pewno zwiekszy szybkosc.
yarpo
Dzięki za info...

Chyba jednak zrobię to inaczej. W przypadku większej niż 10 liczby rekordów zrobię to za pomocą AJAXA. [czas się go nauczyć tongue.gif ]
Skrypt stworzy mi tablicę z posX i posY i już po wczytaniu strony będę kolejno zamieniał x,y na miejscowość.

Myślę, że to będzie najrozsądniejse rozwiązanie.

Dzięki za uwagę i pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.