FAQ |
Kalender |
|
![]() |
#1 | ||
|
|||
Mycket flitig postare
|
Hejsan, försöker skriva om lite kod på reaplagg.se, bland annat uppladdningen av xml filer (produktlista).
Jag kan verkligen ingenting om javascript, och jag är nybörjare när det gäller php. Får det hela inte att fungera. Inget händer lixom. Databasen uppdateras inte, men inga felmeddelanden syns heller. Fälten i databasen blir tomma, om man anger vissa kolumner manuellt vill säga.. Såhär har jag skrivit i ena filen (där man väljer att ladda upp xml fil mm). PHP-kod:
PHP-kod:
Jag har suttit och fulskrivit js koden för att få fram den riktiga adressen till filen, som jag sedan (tror jag?) skickar med i en POST till test.php och hämtar sedan upp den där. Dock så är det i en ren string, kanske det som ställer till det? Någon som ser något fel, eller vet en lösning? eller kanske en annan version av en lösning? ![]() Tack på förhand! Senast redigerad av jonssondesign den 2012-10-10 klockan 04:12 |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Mycket flitig postare
|
Nu har jag inte testat koden så jag kan inte kolla om JavaScript-koden fungerar, men din test.php gör ingenting, egentligen.
Den hämtar en xml-fil och lagrar den i en variabel. Därefter händer ingenting. Inget som skriver till någon databas någonstans (eller ens några funktioner för detta). Det enda simplexml_load_file gör är att läsa in en xml-fil och lagra in den i en variabel. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Klarade millennium-buggen
|
Du kan inte ladda upp filer med AJAX.
Dock så skulle ditt ajax anrop inte göra något unikt utan snarare göra något "simpelt" mer komplicerat genom att det du kan göra inom IF-satsen gör du i en extern fil med ajax. 1) Dessutom skickar du inte med sökvägen via ajax-anropet. Skulle du mot all förmodan göra det så skulle jag ställa mig med den röda flaggan och skrika säkerhetshål och blåsa i visselpipan. 2) Du kan inte hämta ut sökvägen i en <input type="file"> eftersom den pekar lokalt på datorn, om du kunde detta skulle du då skicka en lokalsökväg som inte finns åtkomlig till serversidan. Bättre och trevligare lösning: PHP-kod:
|
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Tack för era bådas kommentarer!
Såhär ligger det till: Gregoff: Jag har för mycket kod i test.php för att vilja skriva ut allt. Men jag vet att detta fungerar, eftersom att jag har gjort precis som Jonas skrev. Jonas: Jag har gjort precis som du skrev tidigare, så jag vet att det är mycket enklare. ![]() Problemet och skälet varför jag vill använda mig av ajax är för att det tar för lång tid att ladda upp produkterna, vilket gör att, på vissa webbhotell (city network), så får jag en 505 error. (jag får inte det på binero). Jag kan visa hur jag har gjort tidigare: PHP-kod:
PHP-kod:
Ibland så tar det för lång tid, så att man får 505 error (händer bara på city network). Så det jag strävade efter egentligen, var att hitta ett sätt där uppladdningen (xml_upload_nelly.php) sköts bakom stängda dörrar, så att webbläsaren slipper jobba medans koden körs. Förstod ni? ![]() PS. test.php innehöll samma kod som xml_upload_nelly.php innehåller, förutom att $xml_file = $_FILES["file"]["tmp_name"]; byttes ut mot $path = $_POST['path']; |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Medlem
|
Undvik Ajax för detta som nämnts.
Även om du får det att funka, tänk på att då körs det asynkrona requesten i bakgrunden och kanske timar ut, vilket ju verkar hända i detta fall ibland, utan att man får reda på att den "failat" eller man kanske stänger ner webbläsaren under tiden. Men kolla på jquery plugins som har progress indikatorer m.m..om du ändå vill köra ajax |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
jo precis. Tänkte det jag med.
Men frågan är, hur får jag iväg filen man laddar upp till test.php? Någon som vet? Jag vill inte ladda upp själva filen och spara i någon mapp, utan jag använda den webbläsarbaserade versionen av filen helst, så slipper man vänta i typ 5 minuter bara på att den ska laddas upp lixom, och sen läsas av. |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Klarade millennium-buggen
|
Uppenbarligen så är XML filen stor, du sparar både den och dess objekt i minnet.
Så beroende på hur servern är konfigurerad (memory_limit) så kommer detta att resultera i fel. Likaså timeout på scriptet. Jag skulle råda dig i att stycka upp filen. Kan vara allt från att du lagrar informationen i omgångar till att köra xx antal rader åt gången. Testa till exempel att skriva ut data emellanåt samt att se till att variabler återanvänds/NULL:as när dom inte längre används. Har du tex det så här: PHP-kod:
Titta även på att köra MySQL frågorna med multiple inserts istället en fråga per iteration. Tex. PHP-kod:
|
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
|||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Mycket flitig postare
|
Grundproblemet är att du verkar har en lösning som nått sin gräns i sin nuvarande miljö.
Antagligen tar minnet slut när du läser in Xml-filen. Vet inte exakt hur det är i PHP men i andra programmeringsspråk kan det handla om filens storlek * 3 eller 4 för att läsa in hela Xml:ns DOM i minnet. Även om det funkar ibland är det inte hållbart i längden. Vem vill använda ett system där det funkar att ladda upp filer ibland? Vad händer om leverantören börjar leverera en lite större fil? Det du säkerligen behöver kika på är att streama filen. När man gör det läser Xml-parsern in filen en bit i taget och det kräver inte i närheten av samma minnesmängd. Tänk att en stream har en fast minnesförbrukning medan att läsa in hela DOM korrelerar med filens storlek, antalet noder samt innehållet i dessa. Man kan hantera filer filer från några få hundra kilobytes till gigabytes med en stream. Det är med andra ord mer skalbart vad gäller minnesförbrukningen. Det är säkert lite bökigare även i PHP men är det givet om man vill få ett väl fungerande system och inte kan styra över filerna som man läser in. Timeouterna borde du undersöka vad de beror på. Ett tips är att börja logga dina funktionsanrop när det sker fel (läs exceptions). Finns det stacktrace i PHP är de himla användbara att få med i loggarna eftersom de mer eller mindre berättar vad som gått fel. I dokumentationen för anropen borde du se vilka metoder som kan kasta exceptions och vilka typer det kan handla om. |
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Administratör
|
Citat:
Den typen av XML parser som brukar användas för streaming i de flesta språk kallas SAX parser. Den är lite jobbigare att komma igång med just pga dess event-baserade modell. Men som vanligt finns det på php.net exempel och ordentligt med dokumentation: se http://www.php.net/manual/en/book.xml.php Är du säker på att dina XML-filer inte växer och du har en server som klarar av det är det ingen fara att köra ett enklare API som laddar in hela filen. Men annars bör du verkligen titta på att streama parsingen. Jonas exempel med 50->150mb är inte ens så illa som det kan gå, det beror på datamängd vs attribut och nästling hur mycket minne som behövs. Sedan bara en amärkning på det om en "riktig relationsdatabas" är ju svårt att ta på. Antagligen så menas en relationsdatabas med tabelltyp som stödjer foreign key constraints, då det kan anses vara "riktiga" relationer. Tipset du fått här är dock att använda en transaktion och rollback om den inte gått igenom. Jag skulle vilja varna lite för att använda det på en delad webhost. För det allra mesta får du på dessa mycket bättre och pålitligare prestanda med MyISAM (båda pga att du med innodb "tävlar" med andra kunder om RAM-cachen men även att de ofta brukar vara så dåligt eller sparsamt konfigurerade för innodb) medans det på dedikerade servers/VPS ofta är precis tvärtom. Ett alternativ är att du skriver till en temporär tabell först, kör samma kontroll och sedan rensar tabellen istället för rollback och ersätter den riktiga tabellen istället för commit. Inte fullt lika säkert, men mer konsekvent resultat.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
Svara |
|
|