Iforbindelse med en webshop har jeg et script der eksportere data til diverse prissøgninger på nettet, men problemet er at det indtil nu har virket fint. Men efter at have tilføjet flere produkter så den nu skal hente +6000 produkter ligger den serveren ned eller får timeout. Timeout kan ikke sætte længere op.. Er det muligt at optimere scriptet...
Ja. Du kan minimere antallet af funktion kald til at begynde med:
function my_number_format($t) { return number_format($t, 2, ',', '.'); }
du kunne så bare skrive: number_format($t, 2, ',', '.'); hvor du har: my_number_format($t);
du har to if sætninger: if ($product ['quantity']==0) $product['lagerstatus'] = 'Nej'; else $product['lagerstatus'] = 'Ja'; $product['lager'] = $product['quantity']; if ($product ['quantity']==0) $product['leveringstid'] = ($product['available_later']); else $product['leveringstid'] = '1 - 3 dage'; Såvidt jeg kan se tester de præcis det samme, så de kan slås sammen til: if ($product ['quantity']==0){ $product['lagerstatus'] = 'Nej'; $product['leveringstid'] = ($product['available_later']); }else{ $product['lagerstatus'] = 'Ja'; $product['leveringstid'] = '1 - 3 dage'; } $product['lager'] = $product['quantity'];
du har: 1 + ($carrierTax / 100);
Det er såvidt jeg kan se konstant i forløkken så kan udregnes før løkken. (Fortolkeren laver muligvis selv denne forbedring.)
Du stripper tags. Jeg ville foreslå at du gjorde når du indsatte beskrivelsen, bare have 2 kolonner i databasen et med og et uden tags. (Antager at beskrivelserne er storset konstante efter de er blevet skrevet.)
De her kan skrives som en ting: $shipping_cost *= 1 + ($carrierTax / 100); $shipping_cost += floatval($configuration['PS_SHIPPING_HANDLING']); $product['shipping_cost'] = $shipping_cost;
Det her er det samme: $product['shipping_cost'] = $shipping_cost * (1 + ($carrierTax / 100)) + floatval($configuration['PS_SHIPPING_HANDLING']);
Din nederste med printning af kategorier ser en anelse mystisk ud, medmindre $catlist faktisk er en liste af lister af kategorier, så er den inderste while løkke vel næppe relevant, er bare en if sætning.
I stedet for at opbygge dit associative product array, kunne du bare bruge direkte variabler og have flere print_field linier. (Ved ikke om det er en forbedring, men kunne forestille mig at det ikke er helt gratis at opbygge og slå op i sådan et.)
At skrive til dokumentet er noget, der tager tid. Derfor bør du tilstræbe at udskrive én gang - f.eks. ved at implodere et array. Og du bør ikke være bange for at bruge arrays - de er generelt lynhurtige at arbejde med.
Hvis du ændrede din funktion print_field, så den ikke skriver ud, men nøjes med at formatere de enkelte tags og fylde dem i et array. Derefter kan du så skrive hele array'et ud i ét hug:
Det vil forbedre scriptets performance en hel del - og du vil sikkert selv kunne ændre til samme fremgangsmåde flere steder.
I funktionen my_strip_tags bruger du preg_replace, som fungerer forholdsvis langsomt. Kik i stedet på strtrher. Den er beregnet til at oversætte ord/tegn i en streng. Brug den med to arrays.
Jeg har ikke kikket koden efter i enkeltheder, men disse to ting sprang i hvertfald i øjnene =)
Læg i øvrigt mærke til, at jeg bevidst begrænser brugen af globale variabler mest muligt. I stedet sender jeg dem med til funktionen som argumenter - og returnerer dem igen.
Tak for svarene indtil videre prøver at kigge lidt på det.
Det som script laver er en prisfil der bla hentes af pricerunner,og udtrækket ser/skal altid se således ud.:
<product place="4418"> <databaseid>7371</databaseid> <ean13>7611990190607</ean13> <interntvarenummer>344117320</interntvarenummer> <produktID>21.18.1753</produktID> <produktbeskrivelse> IEEE 802.11n, IEEE 802.11g, IEEE 802.11b Frekvens: 2,4 - 2,4835 GHz Plug & Play Support WPS (Wifi beskyttet setup) Support QoS-WMM,WMM-PS </produktbeskrivelse> <produktnavn>Trådløst netværk - USB2.0 antenne - 150 Mbit/s -</produktnavn> <link>http://www.mbmdata.dk/netvarksprodukter-netkort/7371-trdlst-netvrk---usb20-antenne---150-mbits----7611990190607.html</link> <billedeUrl>http://www.mbmdata.dk/7371-7369-large/trdlst-netvrk---usb20-antenne---150-mbits---.jpg</billedeUrl> <fragt>39</fragt> <pris>230,16</pris> <producent>ROLINE</producent> <PaaLager>Ja</PaaLager> <leveringstid>1 - 3 dage</leveringstid> <LagerNiveau>6</LagerNiveau> <category>Netværksprodukter | Netkort</category> </product> Der hentes lige p.t omkring 6100 produkter så det tager lidt tid, der ville jeg gerne optimere scriptet for at forkorte tiden og forbedre performance.
Så lyder det som en komplet håbløs tilgang. Hentes der 6.100 poster, skal der formateres små 100.000 XML-tags - og deres data formateres endvidere på alle mulige måder on-the-fly. Det er ikke en hensigtsmæssig fremgangsmåde.
Lav en tabel med data, som PriceRunner umiddelbart kan bruge uden yderligere manipulation. Den tabel opdaterer du så, hvergang du opretter, redigerer og/eller sletter en vare.
Kik derefter på PHP's indbyggede XML-API'er og brug et af dem til at formatere XML-filen med - f.eks. SimpleXML eller XML-DOM
Jeg har nu prøvet lidt med de rettelser i har skrevet og filen kører uden at få timeout på serveren... tager dog lidt tid at hente den ca 2 min, men pricerunner har indtil videre ikke problemer med at hente den....
Et eller andet sted i din kode har du et kald til funktionen my_number_format, dette sted kan du i stedet for skrive number_format (med samme parameter som du kalder den med i my_number_format). Dette ville såvidt jeg kan se spare dig for 5000 funktionskald (medmindre fortolkeren optimerer disse ud).
function my_number_format($t) { return number_format($t, 2, ',', '.'); }
og længere nede har jeg $product['price_exc'] = my_number_format($prodObj->getPrice(false)); $product['price_inc'] = my_number_format($prodObj->getPrice(true)); Hvilket af disse steder skal jeg skrive number_format istedet?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.