Multidesk.be » Forums » PHP » [PHP] Lange laadtijd

  • Pagina
  • [1]
  • 2
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Timmay op maandag 14 september 2009 om 16:35:45.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Hallo,

Ik zit met een probleem en hoop dat iemand mij hier verder mee kan helpen.
Ik heb een webpagina (in PHP) die een nogal zware bewerking uitvoerd (directory structuur aanmaken en ca. 100 PDF's genereren). Het laden van deze pagina duurt dan ook lang.

Zo lang, dat ik op het gegeven moment een foutmelding in de browser krijg:
Internet Explorer
CODE
  1. Internet Explorer cannot display the webpage


FireFox
CODE
  1. De verbinding werd geherinitialiseerd
  2. De verbinding met de server werd geherinitialiseerd tijdens het laden van de pagina.


Ik heb de time_limit van php al verhoogd, maar het probleem blijft.
Ik begrijp eigenlijk niet waar deze melding vandaan komt.
^ Reactie #1 geschreven door Martijn op maandag 14 september 2009 om 17:07:13.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Wat doet dat script net? Blijft het op één en dezelfde pagina? Gaat het andere URL's inladen en parsen?

Hoe lang duurt het script als je het laat lopen zonder tijdslimiet (heel hoge waarde)?

Wat is de huidige waarde van het PHP script?

Wat gebeurt er als je het script command line aanroept?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #2 geschreven door Timmay op maandag 14 september 2009 om 17:30:05.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Het script genereerd ca. 100 PDF bestanden aan de hand van data uit de database.
Het script blijft op 1 pagina, en het duurt ong. 1 a 2 minuten voordat het script klaar is met verwerken.

Ik heb de php time_limit nu voor de zekerheid op 360 gezet, zou genoeg moeten zijn lijkt me. En als de php_time limiet zou verlopen zou ik een php warning moeten krijgen lijkt me.

Het script runt op een externe webserver, dus ik kan er niet bij met command line.

^ Reactie #3 geschreven door Martijn op maandag 14 september 2009 om 17:55:19.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
De queries zelf, zijn die zwaar?
Wat gebeurt er indien je 1 bestand laat genereren in plaats van 100, lukt dat wel?

Kan je eventueel via SSH inloggen om zo aan de php executable te geraken?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #4 geschreven door Timmay op maandag 14 september 2009 om 20:14:36.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
De db-query's zelf zijn niet zo zwaar, maar het genereren van de PDF's wel.
Er zitten afbeeldingen in op hoge resolutie (drukkwaliteit).

1 bestand genereren gaat prima.
Ik heb het ondertussen al zo gemaakt dat het script kijkt welke bestanden al zijn aangemaakt, om vervolgens verder te gaan waar hij gebleven was.

Als ik nu dus de foutmelding krijg, druk ik op refresh en gaat hij weer verder.
De foutmelding komt echter op onregelmatige tijden. Soms krijg ik de foutmelding maar 1 keer tijdens genereren van de PDF's. Maar soms krijg ik de foutmelding wel 10 keer...

^ Reactie #5 geschreven door Martijn op maandag 14 september 2009 om 20:35:13.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Als het inderdaad ligt aan het genereren van de PDF's zelf, zou ik het proces om de zaken aan te maken veranderen. Ofwel gebruik je een batch proces dat onbeperkt kan draaien, ofwel splits je het generatieproces op.

Als 1 PDF genereren steeds lukt, kan je bijhouden welke PDF gemaakt moet worden en telkens 1 PDF laten genereren; quasi zoals je het nu doet in feite. Ga er ook niet van uit dat als 99% van de tijd 20 PDF's aanmaken mogelijk is, dat je met 15 PDF's per "run" er zal geraken, want je hebt waarschijnlijk geen garantie dat de performantie (load) van je systeem hetzelfde zal blijven in de toekomst.

De beste manier lijkt mij hier dus het genereren van de PDF's loskoppelen van de webapplicatie zelf.

Moest je toch willen verderwerken op deze manier, kan de functie register_shutdown_function() je misschien wel verder helpen. Wanneer er een error optreedt vanwege een timeout, zal de functie die je via register_shutdown_function() opgeeft sowieso nog uitgevoerd worden.

Hou er tevens rekening mee dat set_time_limit() enkel de tijd opneemt die je script effectief bezig is, dus niet de tijd dat eventuele systeemprocessen bezig zijn. De tijd is geen tijd in seconden, maar de CPU tijd. Probeer ook eens om set_time_limit(0) te gebruiken om geen tijdslimiet te hebben.

Hou er wel rekening mee dat je webserver (IIS, Apache et cetera) eveneens een timeout kan veroorzaken.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #6 geschreven door Timmay op vrijdag 18 september 2009 om 14:42:20.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Ik blijf problemen hebben met het exporteren van de pdf's (zie screenshot).

http://i31.tinypic.com/289c2kw.jpg


Dit keer heb ik besloten om het heel anders aan te pakken. Ik heb een script(export.php). Dit script maakt 1 PDF aan. Hij haalt de info uit de db, en kijkt of de pdf al bestaat. zo ja, dan pakt hij de volgende record uit de db, zo nee dan maakt hij de pdf aan. Vervolgens zorgt javascript dat de pagina opnieuw geladen wordt, net zolang totdat alle pdf's zijn aangemaakt.

Hier blijf ik hetzelfde probleem houden.

Ik heb ook de shutdown_function geprobeerd:

PHP
  1.  
  2. function shutdown(){
  3. echo 'Script executed with success', PHP_EOL;
  4. }
  5.  
  6.  


Maar zoals je in de screen kunt zien wordt die niet aangeroepen als het fout gaat.

^ Reactie #7 geschreven door Martijn op vrijdag 18 september 2009 om 15:27:55.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Bij veel refreshen geeft Internet Explorer (de nieuwere versies) het ook op, wegens te veel redirects. Dat kan even goed het probleem bij je zijn. Firefox geeft een iets gedetailleerdere melding.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #8 geschreven door Timmay op vrijdag 18 september 2009 om 16:58:11.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Hier is een screenshot van de foutmelding in FF:

http://i25.tinypic.com/wk4ade.jpg
^ Reactie #9 geschreven door Martijn op zaterdag 19 september 2009 om 14:04:42.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Probeer de javascript functie eens te vervangen door header(). Dit gaat in Firefox wel een probleem geven (een melding dat je script oneindig zou redirecten), maar wanneer je je script zo opbouwt dat deze kan verder gaan vanaf de laatste pagina en vervolgens die laatste pagina opnieuw aanroept, zal het gewoon kunnen doorgaan.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #10 geschreven door Timmay op maandag 21 september 2009 om 10:27:54.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Ik heb de javascript vervangen door header.
In IE krijg ik dezelfde foutmelding als eerst.
In FF krijg ik inderdaad de melding dat het script oneindig redirect.

Het lijkt me dat de foutmelding niet zozeer door PHP wordt gegeven, maar dat de browser zelf problemen geeft. Misschien dat ik iets met de HTTP header moet doen ofzo?

Of zou ik misschien via de exec het script door de server kunnen laten uitvoeren?
^ Reactie #11 geschreven door Martijn op maandag 21 september 2009 om 11:36:47.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
In Firefox kan je nu gewoon in de adresbalk gaan staan en op enter duwen tot het script afgelopen is.

Ik geloof dat IE6 deze "beperking" niet heeft.

Je kan ook altijd eens proberen dit script te schedulen via cron.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #12 geschreven door thekid op maandag 21 september 2009 om 12:56:58.
thekid's avatar
Multiviteit: 5273
Moderator
gewoon een parameter toevoegen en deze per "jump" wijzigen lost het probleem in firefox op, heb ik zo ook opgelost met asp pagina's, je parameters kunnen de huidige index zijn waar je zit met je pdf's en welke de volgende zou moeten zijn ;)

ik gebruik iets gelijkaardigs om cache / temp files op te ruimen op onze website, die per jump bvb 500 bestanden wist, en een progressbar toont met de voortgang...
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #13 geschreven door Martijn op maandag 21 september 2009 om 18:36:39.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Vreemd, ik heb net het omgekeerde opgemerkt... Zelfs een volledig andere URL, leidt uiteindelijk tot die melding (in Firefox toch).
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #14 geschreven door thekid op dinsdag 22 september 2009 om 01:21:50.
thekid's avatar
Multiviteit: 5273
Moderator
ahja, vergeten te melden, ik liet de jump verdergaan via een timeout in javascript :D die timeout bevatte ook de currentindex en het maximale aantal te verwijderen zodat ik mijn progressbar kon weergeven :D
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #15 geschreven door Martijn op dinsdag 22 september 2009 om 07:30:47.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Misschien dat het zo inderdaad wel eens kan lukken, nog niet getest op die manier. Hoeveel seconden bedroeg je timeout als ik vragen mag?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #16 geschreven door thekid op dinsdag 22 september 2009 om 12:44:13.
thekid's avatar
Multiviteit: 5273
Moderator
250 ms, 't moet een beetje vooruit gaan, hé :D
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #17 geschreven door Martijn op dinsdag 22 september 2009 om 20:26:55.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Dat ga'k eens uittesten zie als'k ergens tijd vind!

Timmay, helpt dit jou verder?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #18 geschreven door Timmay op dinsdag 22 september 2009 om 21:06:29.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Ik ga het morgen ook nog maar eens proberen. Als ik me goed herinner heb ik al eens iets dergelijks geprobeerd, dat werkte toen niet. Maar het kan nooit kwaad om het nog eens te proberen. Laat nog wel weten wat het resultaat was.
^ Reactie #19 geschreven door Timmay op vrijdag 25 september 2009 om 08:53:29.
Timmay heeft nog geen avatar toegevoegd
Multiviteit: 10
Helaas, ook dit werkt niet.
Krijg het oorspronkelijke probleem.

Misschien doe ik iets fout met het script?
Dit script staat in de body van de pagina.

CODE
  1.  
  2. <script type="text/javascript">
  3. <!--
  4. setTimeout(\'delayer()\', 250)
  5. //-->
  6. </script>
  7.  


functie delayer is gewoon een window.location met de currentindex + 1
  • Pagina
  • [1]
  • 2

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen