Avatar billede Aggerholm2620 Nybegynder
08. august 2010 - 13:04 Der er 5 kommentarer og
1 løsning

Chaining Pages

Hejsa..

Jeg har et lidt usædvanligt problem.

Jeg skal høste nogle xml.data og lægge værdier ind i en MySql database.

Problemet er at hvert varenummer i db skal høstes hver for sig, ved og kalde en xml side på et 3. site., dvs at inden jeg når igennem 18-20 varenumre, så er min host gået timeout for den oprindelige scriptfil.

Tanken er så at lade scriptet kalde sig selv for hver 15 varenumre, og på den måde resette timeout på serveren.

Jeg har pt 800 varenumre(more come in every day), hvilket kan tvinge de fleste servere i timeout  ;o)

Men jeg har ikke kunne finde nogen kommando som kæder/kalder næste side i rækken uden og lave en "<a href=..."... ;o(

Er der nogen som har en ide til hvordan det kan gøres ?

Mvh, Michael..
Avatar billede intenz Novice
08. august 2010 - 14:11 #1
Først og fremmest; Har du prøvet at sætte 'set_time_limit' til enten 0 eller et højt nok niveau? Hvis dit webhotel tillader det.
http://php.net/manual/en/function.set-time-limit.php

Så er der cronjob muligheden, hvor du kører filen hver xx minut/sekund og forsætter hvor derfra hvor sidste kørsel nåede til. Brug en MySQL data til at gemme hvor lang du er, hver gang en kørsel er gennemført.

En mulighed kunne også være starte child processer med pcntl_fork:
http://php.net/manual/en/function.pcntl-fork.php

En gennemgang af princippet kan læses her:
http://www.electrictoolbox.com/article/php/process-forking/

Der er sikkert også andre muligheder, men for mig er det nævnte de mest oplagte. Cronjobbet kan være nemmere at udføre i praksis en forking. Men prøv først at sætte time_limit på filen til så lang tid du har adgang til, og se så hvad der herefter er behov for.
Avatar billede Aggerholm2620 Nybegynder
11. august 2010 - 21:38 #2
har nu forsøgt flere forskellige ting.

timelimit ændrer ikke noget, jeg møder webserverens idle timelimit på 120 sec i form af en fejl 500 ;o(

forking syntes jeg ikke virker, måske udbyderen har lukket for den option.

det simple spørgsmål er :

Findes der en metode hvor jeg i html/php automatisk kan kalde en ny html/php fil ?
Avatar billede intenz Novice
19. august 2010 - 18:55 #3
Ja, men det har du sandsynligvis ikke adgang til på dit webhotel, pga. sikkerhed.
System() er f.eks. en mulighed, men det ville overraske mig hvis du har adgang til at bruge den på et alm. webhotel.
http://php.net/manual/en/function.system.php

Hvis du ikke kan ændre time_limit er den almindelige løsning at dele scriptet op, så det tager mindre dele af gange og ikke overskrider time_limit. Så bruge et cronjob (f.eks. http://www.cronjob.de/) til at køre scriptet hver xx minut (hele dagen). Så tjekker scriptet selv hvor det er kommet til, og tager de næste xx elementer (hvad der giver mening i forhold til time_limit).
Avatar billede Aggerholm2620 Nybegynder
23. august 2010 - 10:46 #4
Syntes jeg løber ind i muren hver eneste gang jeg forsøger noget.  ;o(

ved godt jeg er noop til det her, for det cronjob ser bare ud til og starte en masse sideløbende tabs, og hovedjobbet går i timeout.  ;o(

som jeg ser det lige nu er løsningen at jeg kører eks.

test.php?id=x

inde i test køres en loop fra id til id+10

og i bunden af siden laver en manuel link til test.php?id=x+10

kunne man lavet et link/redirect som automatisk genstartede siden med det nye parameter, så ville man kunne starte siden, og når den nåede sidste id i databasen ville jobbet afsluttes...
Avatar billede intenz Novice
23. august 2010 - 11:12 #5
Hvis du mener, at du vil køre det i en browser manuelt, kan du bruge meta refresh tagget. Så vil du blive sendt videre til den næste.

<?php
$startId = $_GET['id']

// kør dit loop

$startIdNew = $startId+$x;
?>
<meta http-equiv="refresh" content="2; url=test.php?id=<?php echo $startIdNew;?>">
Avatar billede Aggerholm2620 Nybegynder
24. august 2010 - 02:04 #6
Hejsa Intenz.

Tak for løsningen, det kører bare nu..

du har fået point for opgaven.. 

nu skal jeg så bare lige ha den til og stoppe når der ikke er flere data i tabellen.  ;o)

Kører nu ét varenummer ad gangen, og genstarter siden med sidste varenummer, og siger så at den skal finde det næste varenummer i rækken..

Virker fint, tager bare et kvarter og køre alle varenumrene igennem..  ;o)

Tak for hjælpen.

Endeligt source herunder, hvis andre kan redde noget genialt jeg ikke selv viste jeg havde lavet.  ;o)

<?php
$startId = $_GET['id'] ;
$product_result = mysql_query("SELECT * FROM invTypes where typeID > $startId ORDER by typeID") or die(mysql_error());
$buyprice = array();
settype($total, "float");
$product = mysql_fetch_array($product_result); 
$min=$product['typeID'];
echo "<tr><td valign=top nowrap>";
// Harvest XML file
$b=1;
$xml = simplexml_load_file("http://api.eve-central.com/api/quicklook?typeid=".$min."&usesystem=30000142&sethours=96");
foreach($xml->children() as $a1)  {
  foreach($a1->children() as $a2)    {
    if($a2->getName()=="buy_orders")  {
      foreach($a2->children() as $a3)  {
        foreach ($a3->children() as $a4)  {
          if($a4->getName()=="price")  {
            $buyprice[$b]=(float)$a4;
            $b++;
          } 
        }
      } 
    }
  }
}
// XML Harvest end
$t=round($b*.1);
$total=0;
for ($w=1;$w<=$t;$w++)  {
(float) $total+=$buyprice[$w];
}
$minval = (($total/$t)*.95) ;
$update_data = mysql_query("UPDATE invTypes SET jitavalue = '".$minval."' WHERE typeID = '".$min."'") or die(mysql_error());
mysql_close($con);
$startIdNew = $min;
?>
<meta http-equiv="refresh" content="2; url=update.php?id=<?php echo $startIdNew;?>">
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester