Kom ihåg mig?
Home Menu

Menu


uppdatera databas med php och javascript

 
Ämnesverktyg Visningsalternativ
Oläst 2012-10-11, 04:40 #11
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Tack, Jonas!

Conny, hur menar du? Kom ihåg - jag är nybörjare.

Vad menar du med "lokal databas"? xampp på datorn? Hur ska det fungera när man kör live? :P Förstår att jag missförstår dig nu.

Helst skulle jag vilja göra såhär:

Köra allt med php, men efter ett visst antal rader som blivit insatta i databasen, så ska det skrivas ut något - laddar kanske?
Därefter så fortsätter den att ladda upp datan igen.

Men problemet är ju att servern läser filen uppifrån och ned, och utför inget förren allt har bearbetats. Så, om jag skriver echo någonstans i koden, och det finns mer kod nedanför, så uträttas inte det förren hela sidan är färdig, eftersom - vad jag förstår - så bearbetas all php kod i servern, och sen skickar servern en ren html sida till webbläsaren, som sedan visar upp den till mig.
Det vill säga - Allt som finns i koden måste bearbetas, utföras mm, innan servern skickar html koden till webbläsaren. har jag rätt?

Jag vill iaf komma bort från att sidan får error pga. långa laddningstider och mycket minne.
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 10:15 #12
Erik Stenman Erik Stenman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2007
Inlägg: 2 154
Erik Stenman Erik Stenman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2007
Inlägg: 2 154
Något du bör kunna göra är att ändra memory_limit i PHP.
Dessutom kan du ju fundera på att ladda upp filerna med ftp.
Erik Stenman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 11:09 #13
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
30-70 mb, hur många rader data?

Kolla alternativet med FTP som nämnts. Det går att ansluta till ftp servern från php script.
Hursomhelst är det inte lämpligt att använda webbformulär för så stora filer.

Men gör så att du delar upp detta i två delar
1, filuppladdning på något vis till servern, kolla om de t.ex kan ftp:a till en mapp på din server
2, ett php script som hanterar den uppladdade filen,
detta kan mest lämpligen göras så att ett cron jobb körs med jämna mellanrum.

För övrigt så använd transaktioner med databasfrågorna. Annars kan du få korrupt data.

Vad gäller databasfrågorna så misstänker jag de tar rätt lång tid.
Testa att ta tid på de olika frågorna.
Tabelltyp är den MyISAM eller InnoDB?

Ett eventuellt alternativ är att ta bort eventuella index på 'products' tabellen innan du kör alla inserts.
Och sen lägga tillbaka index efter inserts, men det tenderar att bli rätt avancerat.

Kolla om det finns index på dessa kolumner där "where" används:

SELECT id, advertiserProductUrl FROM products WHERE `new` = 1
DELETE FROM products WHERE fresh = 0
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 13:08 #14
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Erik: Tack, det vore ju ett alternativ kanske

Danjel: Filerna innehåller 10 000+ produkter - ca.15 rader per produkt.

Jag har inga problem hos Binero, där fungerar det både att hämta xml filen via url (ladda upp via ftp, och sen hämta xml adressen), det går även bra att ladda upp via en <input type="file" utan problem.

Men jag har inlett ett samarbete med en kille som har City Network, och där failar den hela tiden - 1) går inte att hämta filer via en url (oavsett om filen ligger på samma server eller inte. 2) tar det för lång tid så dör servern.

"För övrigt så använd transaktioner med databasfrågorna. Annars kan du få korrupt data." - vad menar du med det?

Det är av typen MyISAM.

Jag har 3 index typer i tabellen Products.
1) BTREE - ID (you know..)
2) BTREE - URL (för att förhindra dubletter vid input)
3) FULLTEXT - INFO (Fulltext sökningsförmåga)

"Kolla om det finns index på dessa kolumner där "where" används:" - ehm. say what what?
ooh! nej, inget index på varken new eller fresh. as you can se.

Vill tacka alla som försöker hjälpa en krokad person som mig!
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 14:48 #15
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Citat:
Ursprungligen postat av jonssondesign Visa inlägg
"För övrigt så använd transaktioner med databasfrågorna. Annars kan du få korrupt data." - vad menar du med det?
Ja alltså tänk om din kod smäller eller stoppar av någon anledning t.ex i detta stycke:

$query = "SELECT id, advertiserProductUrl FROM products WHERE `new` = 1";
$select = mysql_query($query) or die(mysql_error());

Då kommer inte dina updates efter det att köra, men dina första inserts har körts och uppdaterat databasen.

Med transaktioner körs allt eller inget , typ denna princip

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

$a1 = mysql_query("INSERT INTO bla (id) VALUES('1')");
$a2 = mysql_query("INSERT INTO blabla(id) VALUES('2')");

if ($a1 and $a2) {
mysql_query("COMMIT"); //allt grönt , skriver ner allt till db
} else {
mysql_query("ROLLBACK"); //backar tillbaks allt efter "START TRANSACTION"
}

Kan inte så mycket om dem i mySQL men du måste nog köra InnoDB dessvärre för att använda transaktioner.
Det brukar rekommenderas att köra den tabelltypen generellt, kan inte alla detaljer men MyISAM är lämpligare för Selects för att den låser hela tabellen vid skrivningar till tabellen.


Citat:
Ursprungligen postat av jonssondesign Visa inlägg
"Kolla om det finns index på dessa kolumner där "where" används:" - ehm. say what what?
ooh! nej, inget index på varken new eller fresh. as you can se.
Index kan användas även vid Updates eller Deletes,
så om du har t.ex "update tbl where somecolumn = 99" och det inte finns ett index på den kolumnen då görs en scan på alla rader i hela tabellen. med ett index går det snabbare.
Men samtidigt om du lägger till fler index i tabellen kommer inserts gå segare för att den då måste uppdatera index..så detta är kanske ett gränsfall

I alla fall, om det funkar på Binero kanske du inte behöver göra så mycket pill i sql:en för att få det att funka vad gäller prestandabiten
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 15:17 #16
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
Citat:
Ursprungligen postat av jonssondesign Visa inlägg
Men problemet är ju att servern läser filen uppifrån och ned, och utför inget förren allt har bearbetats. Så, om jag skriver echo någonstans i koden, och det finns mer kod nedanför, så uträttas inte det förren hela sidan är färdig, eftersom - vad jag förstår - så bearbetas all php kod i servern, och sen skickar servern en ren html sida till webbläsaren, som sedan visar upp den till mig.
Det vill säga - Allt som finns i koden måste bearbetas, utföras mm, innan servern skickar html koden till webbläsaren. har jag rätt?
Efter echo:t kan du behöva flusha: http://se1.php.net/manual/en/function.flush.php
Funkar ok i Firefox, dock ej i vissa versioner av IE.
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 17:20 #17
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Citat:
Ursprungligen postat av Jonas Visa inlägg
Har du tex det så här:
PHP-kod:
$xml simplexml_load_file(...); // 50MB stor fil
$rows $data $xml
Så förbrukar du 150MB. Nu är det lite extremt men vill få fram en poäng.
Verkligen inte sant och alldeles för extremt.. Har du testat?
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-11, 21:11 #18
dAEks avatar
dAEk dAEk är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2006
Inlägg: 678
dAEk dAEk är inte uppkopplad
Mycket flitig postare
dAEks avatar
 
Reg.datum: Dec 2006
Inlägg: 678
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.
dAEk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-12, 13:55 #19
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av jonssondesign Visa inlägg
Conny, hur menar du? Kom ihåg - jag är nybörjare.

Vad menar du med "lokal databas"? xampp på datorn? Hur ska det fungera när man kör live? :P Förstår att jag missförstår dig nu.

Helst skulle jag vilja göra såhär:

Köra allt med php, men efter ett visst antal rader som blivit insatta i databasen, så ska det skrivas ut något - laddar kanske?
Därefter så fortsätter den att ladda upp datan igen.

Men problemet är ju att servern läser filen uppifrån och ned, och utför inget förren allt har bearbetats. Så, om jag skriver echo någonstans i koden, och det finns mer kod nedanför, så uträttas inte det förren hela sidan är färdig, eftersom - vad jag förstår - så bearbetas all php kod i servern, och sen skickar servern en ren html sida till webbläsaren, som sedan visar upp den till mig.
Det vill säga - Allt som finns i koden måste bearbetas, utföras mm, innan servern skickar html koden till webbläsaren. har jag rätt?

Jag vill iaf komma bort från att sidan får error pga. långa laddningstider och mycket minne.
Du har en systemlösning som behandlar större mängder data och då bör du först och främst ha en "riktig" relationsdatabas (som MS-SQL, Oracle, Sybase SQL-Anywhere, IBM DB2, Postgre SQL eller MySQL med InnoDB) lokalt på din egen dator.

Du använder XML-filer för överföring av gigantiska datamängder, men du borde först bearbeta ditt data lokalt och sedan bara skicka upp förändringar (inte hela databasen) varje gång du gör en överföring till din webbshop.

När du får datafilen från din leverantör (är det Nelly? och Ellos?) så bör du importera det i din lokala databas först.

Du hade i din PHP-kod en massa villkor för att filtrera bort data vid importen, och det borde du filtrera bort INNAN du skickar upp datatfilen till din webbshop, all data som du filtrerar bort tar ju tid att skicka upp och kostar bandbredd i onödan.

Du bör ha en databastabell för "gender" och en för "category" med en kolumn som innehåller de värden som du vill filtrera bort. Det var det jag visade exempel på i SQL-satsen hur man på ett enkelt sätt kan göra det.

Du bör undvika att använda PHP för databaslogiken, utan lös den logiken med SQL i stället. SQL är hundratals gånger snabbare och effektivare än att först ladda upp alla onödiga data över internet och sen filtrera i ett okompilerat script-språk som PHP.

Senast redigerad av Conny Westh den 2012-10-12 klockan 13:58
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-12, 14:22 #20
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
SQL-sats som borde föregå upload_nelly.php i inlägg 4 ovan.

Du bör mao fört importera hela XML-filen till din lokala datrabas (den tabellen kallar jag för "XML_ImportTabellen
") då du kan köra SQL-frågor för att göra urvalen istället för att loopa i PHP och göra samma sak där.

Du bör ha en tabell med de alternativ för "gender" som du vill EXKLUDERA, den tabellen kallar jag för ExcludeGenderTabellen.

Du bör ha en tabell med de alternativ för "category" som du vill EXKLUDERA, den tabellen kallar jag för ExcludeCategoryTabellen.


Kod:
INSERT INTO products (img, title, brand, store, price, url, category, gender, visible, info, advertiserProductUrl, fresh, new)  ON DUPLICATE KEY UPDATE fresh = 1
SELECT img, title, brand, store, price, url, category, gender, 1, info, advertiserProductUrl, 1, 1
FROM XML_ImportTabellen
WHERE gender NOT IN (select gender from ExcludeGenderTabellen)
AND category NOT IN (select category from ExcludeCategoryTabellen)
AND sale=true
När du sen ska ta fran de data som du ska använda för att skicka upp så hämtar du dem från Products-tabellen med en enkel selectsats:

Kod:
SELECT img, title, brand, store, price, url, category, gender, visible, info, advertiserProductUrl, fresh, new
FROM products
... Vilket blir kortare och tydligare i din kod än den gigantiska PHP-kod du har nu. Det blir betydligt tydligare att läsa och därmed enklare att felsöka.

Senast redigerad av Conny Westh den 2012-10-12 klockan 14:34
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:07.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017