Ajax kald php fil i loop

Tags:    ajax

Hej

Sagen er den at jeg skal behandle en kæmpe xml fil. Kan ikke gøre det i ren php, pga timeouts etc (disse kan ikke ændres i dette tilfælde)

Så jeg tænker at jeg skal bruge noget ajax til loope igennem den bid for bid.
Eventuelt have et loop på en php side der kalder en anden php side med et given variabel der udfører en bid af xmlen, og loopet på den første side går så videre med at kalde php siden med en ny variabel?

Er der nogle der ligger inde med et link til en artikel eller code snippet der kan hjælpe ville jeg blive utrolig glad.

php delen er ingen problem, det er det med at få php til at sende en variabel til noget javascript/ajax halløj og få dette til at loade php siden der udfører sin bid af xml'en?

Alt hjælp modtages med kyshånd:)



7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Okay. Men kan du ikke lade PHP-delen returnere (echo'e) hvor langt den er / om der mangler mere?

Så kan du lave en JavaScript-funktion, der kalder PHP-delen og kalder sig selv igen, indtil den er færdig med at behandle XML-filen.

Jeg har lavet et mockup af, hvordan det evt. kan laves med brug af jQuery. Jeg har ikke testet det.

Fold kodeboks ind/udJScript kode 


PHP-delen skal så tage en lille bid af XML-filen hver gang. Skal benytte $_POST['progress'] til at vurdere, hvorfra den skal starte/fortsætte i XML-filen.

---- edit

Jeg kan af dit redigerede indlæg se, at vi har taget to forskellige indgangsvinkler.

I mit tilfælde vil jeg have en side til at køre en JavaScript-funktion, der kalder en anden side (en PHP-side), som klarer hele processeringen (indlæsning af filen og finder det punkt, hvor den skal behandle fra).

I dit tilfælde har du en side, som indlæser filen og splitter den op, og sender en del af XML-filen til en anden PHP side, som kun behandler denne lille del. Din PHP-side (dataproc.php) bliver altså udsat for et noget mindre workload, som i stedet lægges på den side, hvor JavaScripten er.

For at kommentere på din kode:
Du kan ikke indhente en JavaScript variabel til et stykke PHP-kode på samme side. Som jeg ser det, har du 2 muligheder.

1) Udskrive din $xmlfilearray i dit JavaScript som et JavaScript-array (med PHP-funktionen json_encode()). Dette er nok en dårlig løsning, da man ikke ønsker en kæmpe XML-fil liggende i sit JavaScript (siden kan blive for stor at hente).

2) Du undlader at sende en XML-streng til dataproc.php og sender i stedet information omkring, hvilken del af XML-filen der skal behandles (som i mit eksempel).

Min indgangsvinkel har nogle andre udfordringer, fx omkring at workloaded ikke må blive for stort. Det plejer dog ikke være det at indlæse filen, der er krævende, men mere den behandling du foretager af hver sektion (fx indsættelse i database el.lign.). Hvis du benytter nogle af PHP's XML-biblioteker i stedet for at manuelt splitte filen, så tror jeg, at du har større chance for at komme i land uden at støde på memory eller timeout begrænsninger.




Indlæg senest redigeret d. 14.11.2014 23:31 af Bruger #4879
Prøv at kald .Append() i stedet for at overskrive indholdet ved brug af .Text()



Hej Tommy

Jeg har umiddelbart to løsningsforslag

1) Et cronjob, som tager en bid af gangen - fx med kald til en URL igennem eksempelvis wget (ingen grund til at blande en browser og javascript ind i det synes jeg)

2) Et script til PHP CLI som kører fra en server, som du har fuld råderet over (hvis du har sådan en). Problemet med timeouts opstår jo som følge af, at mange webhoteller har begrænsninger på denne del. Med egen PHP installation styrer du jo selv de variable også. Med din egen PHP installation kan du som sådan også bare køre scriptet igennem en webserver, men det vil være unødvendigt. Hvis du ikke har egen server går denne løsning selvfølgelig ikke.

Glæder mig til at høre, hvordan andre håndterer disse problemer med store kørsler.



Begge dele dur desværre ikke - da det er en del af et wordpress plugin jeg er ved at lave - så skal køres i browseren og skal kunne fungere på forskellige webhoteller osv da andre også skal have mulighed for at bruge det plugin, uden at konfiguere indstillinger og cronjobs på serveren.

Edit:
Det jeg er kommet frem til indtil videre er dette:

Fold kodeboks ind/udJScript kode 


Det virker som sådan fint nok, hvis jeg sætter javascript variablen xmlstr til en almindelig streng, men den skulle jo gerne indeholde nedenstående, hvor jeg kan lave en $str[tælleren], den for loop der er jo i javascript, så javascript tæller variablen "i" kan ikke indsættes i [] i phpen

(som php koden øverst der exploder den xmlfilen vil den selvfølgelig ikke kunne sendes via get, det data vil blive rengjort hvis jeg finder en løsning på det tæller så den kan sende de forskellige data)

Fold kodeboks ind/udJScript kode 


Så hvordan kan jeg få "i" ind istedetfor "1" i den ovenstående kode?




Indlæg senest redigeret d. 14.11.2014 22:41 af Bruger #16445
Hey igen - sorry for den lange svar tid, men har nu faktisk fået det til at virke.

Fold kodeboks ind/udHTML kode 


Nu er mit problem så at jeg gerne vil have den til at tælle hvor mange kald den har lavet mens den kører, i den ovenstående kode, der vil den blot udskrive slutresultatet i content div'en - jeg ville jo gerne have at den var "rullende", så der først stod 1 så 2 så 3 osv.?



Er det 'clicked' du gerne vil have skrevet i div'en?



Hvor stor er den XML fil?



t