[PHP] Wordt uitvoer onderbroken door STOP?

Pagina: 1
Acties:

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Ik ben bezig met een PHP applicatie. Nu zou ik eigenlijk willen weten of de uitvoer van een PHP bestand gestopt kan worden door de knop STOP te gebruiken op je browser. Ik heb namelijk een aantal opdrachten in 1 PHP file die persee uitgevoerd moeten worden als tenminste 1 opdracht begint met de uitvoer. Deze opdrachten mogen dus niet onderbroken worden tijdens de uitvoer.

Mijn eerste idee om dit te omzeilen was eigenlijk om een PHP bestand een soort van Remote Procedure call te laten uitvoeren naar een applicatie die standalone draait naast de webserver en dan deze applicatie ongestoord de opdrachten te laten uitvoeren. Maar dan weet ik natuurlijk weer niet of die applicatie klaar is met het uitvoeren van die opdrachten.

Hoe kan ik dit het beste aanpakken?

ps. Als een PHP bestand niet onderbroken kan worden, dan is er natuurlijk geen probleem, maar ik moet het echt zeker weten.

edit:

Kan een MOD misschien de titel van deze topic aanpassen? Hij dekt niet echt meer de lading. Iets van: "[PHP] PHP bestand gegarandeerd compleeet laten uitvoeren" (of iets in die geest). Bedankt

Signature van nature


Verwijderd

in principe stopt je browser met downloaden van files en neerzetten van wat ie gedownload heeft op het scherm. Of het executen van een phpfile dan ook stopt weet ik nie, maar dat kun je proberen door een loopje te maken dat 500 keer iets in een textdocument schrijft ofzo (zodat het lang genoeg duurt dat jij op stop kunt drukken) en naderhand kijken of die 500 regels ook daadwerkelijk in het bestand staan..

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 03-02 15:29
Wat ik wel eens heb gehad bij een file die in een oneindige loop kwam, dat ik gewoon met een paar seconden Esc vastgehouden de php uitvoer kon stoppen. Mijns inziens kan het dus wel!

Ook Knor is aangestoken met het ligfietsvirus!


  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Waarom kunnen sommige mensen niet gewoon een php handleiding doorkijken.

zoek eens naar de functie: ignore_user_abort

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Bedankt voor je "vriendelijke" input.

PHP wordt dus inderdaad gestopt als de connectie met de client verbroken wordt. Daarnaast werkt de functie "ignore_user_abort" niet in safemode. Dus blijft de rest van mijn vraag staan. Ik had ook nog gekeken naar XML-RPC voor communicatie, maar is dat niet een gigantische overkill als je enkele PHP <--> Applicatie communicatie wil? Heeft iemand hier ervaring mee?

Signature van nature


  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Dan is de vraag waarom de opdrachten niet onderbroken mogen worden.

Verwijderd

bakkerl schreef op 09 september 2002 @ 13:43:
Dan is de vraag waarom de opdrachten niet onderbroken mogen worden.
Dat doet er op zich niet zo heel veel toe. Misschien dat ze wel onderbroken mogen worden (waar jij waarschijnlijk op doelt), maar het is een op zichzelf staand iets, hoe je een script door kan laten gaan.
Hij wil gewoon dat het doorgaat, daar zal hij z'n redenen wel voor hebben...

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

En volgens de online handleiding heeft safe_mode geen invloed op de functie ignore_user_abort. Safe mode heeft invloed op functies die files benaderen en functies die exec's uitvoeren.
bron: http://www.php.net/manual/en/printwn/features.safe-mode.php

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Verwijderd schreef op 09 september 2002 @ 14:11:
[...]
Dat doet er op zich niet zo heel veel toe. Misschien dat ze wel onderbroken mogen worden (waar jij waarschijnlijk op doelt), maar het is een op zichzelf staand iets, hoe je een script door kan laten gaan.
Hij wil gewoon dat het doorgaat, daar zal hij z'n redenen wel voor hebben...
Hij zal zijn redenen er wel voor hebben. Maar als er misschien als redenen is dat als de eerste functie aangeroepen is en de laatste moet de zooi opruimen, zijn er ook andere manieren om dit optelossen (rotzooi op ruimen als php script onderbroken/gestopt word).

Dus misschien zoekt die een oplossing voor iets wat php vrij makkelijk op te lossen is, zonder dat die andere dingen hoeft op te lossen.

Er zijn meerdere wegen die naar rome leiden, alleen moet je wel zeker weten dat die naar rome wil.

bakkerl

Verwijderd

Ik lees in die bron oa:
This is a still probably incomplete and possibly incorrect listing of the functions limited by safe mode
:)

edit:
bakkerl schreef op 09 september 2002 @ 14:18:
[...]

Hij zal zijn redenen er wel voor hebben. Maar als er misschien als redenen is dat als de eerste functie aangeroepen is en de laatste moet de zooi opruimen, zijn er ook andere manieren om dit optelossen (rotzooi op ruimen als php script onderbroken/gestopt word).

Dus misschien zoekt die een oplossing voor iets wat php vrij makkelijk op te lossen is, zonder dat die andere dingen hoeft op te lossen.

Er zijn meerdere wegen die naar rome leiden, alleen moet je wel zeker weten dat die naar rome wil.

bakkerl
Daar geef ik je meteen gelijk in.
Desondanks is het wel leuk/interessant om uit te zoeken hoe het wel kan, voor het geval het nog 'ns nodig is.

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

[quote]Verwijderd schreef op 09 september 2002 @ 14:20:
Ik lees in die bron oa:
[...]
:)

Uit eigen ervaring.. De ignore_user_abort en functies die daar bij horen werken met wat voor instelling van safe_mode ook.

Omdat ik zelf ook een paar php pagina's heb welke als de verwerking van gegevens is gestart, netjes afgebroken moet worden, anders gaat het de volgende keer fout.

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Oke, meteen als opmerking naar Sircuri.

Als je uitvoer naar je browser gestart is, en er wordt op stop gedrukt. Kan je nergens meer regelen dat de uitvoer naar de browser door gaat. Je kan als server geen data naar de client foceren.

Als je het over uitvoer naar bestanden/database/wat ever op de server of niet client. Dan zijn er dingen te regelen.

bakkerl

Verwijderd

ff kleine opmerking op bakkerl: Er bestaat hier ook een editknop (Afbeeldingslocatie: http://images.tweakers.net/forum/templates/got/images/icons/edit.gif).
Van de laatste 5 posts zijn er 4 van jou, dat lijkt me niet de bedoeling.

Verder hoef je niet steeds je naam onder een post te zetten.
Voor nog meer handig tips ed: lees de faq.

// poeh, 'k lijk wel 'n mod :+

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
De opdrachten die uitgevoerd moeten worden zijn allemaal server side database bewerkingen. Maar als er 1 SQL uitgevoerd gaat worden in dat PHP bestand, dan MOETEN de daar op volgende 2 SQL OOK uitgevoerd worden. Het heeft niet echt iets te maken met het opruimen van rommel of iets dergelijks.

Even een simpel voorbeeld.
in PHP bestand doe ik 3x een INSERT statement. Als de eerste INSERT is uitgevoerd, moeten die laatste 2 dus ook uitgevoerd worden om de data in de DB consistent te houden.

ps. Wat betreft die safe_mode heb ik in de user-notes (onder die functie ignore_user_abort) gelezen dat dit deze functie uitschakelt. Dus safe mode heeft wel degelijk invloed.

Signature van nature


Verwijderd

Sircuri schreef op 09 september 2002 @ 16:09:
De opdrachten die uitgevoerd moeten worden zijn allemaal server side database bewerkingen. Maar als er 1 SQL uitgevoerd gaat worden in dat PHP bestand, dan MOETEN de daar op volgende 2 SQL OOK uitgevoerd worden. Het heeft niet echt iets te maken met het opruimen van rommel of iets dergelijks.

Even een simpel voorbeeld.
in PHP bestand doe ik 3x een INSERT statement. Als de eerste INSERT is uitgevoerd, moeten die laatste 2 dus ook uitgevoerd worden om de data in de DB consistent te houden.

ps. Wat betreft die safe_mode heb ik in de user-notes (onder die functie ignore_user_abort) gelezen dat dit deze functie uitschakelt. Dus safe mode heeft wel degelijk invloed.
Hmm, dat klinkt niet echt lekker. Is je datamodel wel goed?
Kun je aangeven hoe het in elkaar zit en waarom je dan per se 3x moet inserten?

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Sircuri schreef op 09 september 2002 @ 16:09:
De opdrachten die uitgevoerd moeten worden zijn allemaal server side database bewerkingen. Maar als er 1 SQL uitgevoerd gaat worden in dat PHP bestand, dan MOETEN de daar op volgende 2 SQL OOK uitgevoerd worden. Het heeft niet echt iets te maken met het opruimen van rommel of iets dergelijks.

Even een simpel voorbeeld.
in PHP bestand doe ik 3x een INSERT statement. Als de eerste INSERT is uitgevoerd, moeten die laatste 2 dus ook uitgevoerd worden om de data in de DB consistent te houden.
Welke database heb je dan. Dan zou je moeten gaan kijken of je database transacties ondersteunt. Dan worden de allemaal pas uitgevoerd na een commit. En de commit kun je geven na de laatste opdracht. En anders kun je een rollback geven wordt de pagina halverwege afgebroken, en is de eerste dus ook niet uitgevoerd.

tevens kun je kijken of je van die 3xinsert, 1x een insert kan maken, voor de 3 tabellen tegelijk. Tenzij dit niet kan omdat het verschillende databases zijn.
Maar je zou je SQL statement anders ook wel kunnen aanpassen.

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
In principe is het datamodel wel goed. Ik zal even een beetje insight geven waar van ik denk dat het relevant is (applicatie is een beetje omvangrijk :) )

Ik heb een aantal objecten in PHP die stuk voor stuk data representeren vanuit de DB. Tijdens het uitvoeren van een PHP bestand is het gewoon mogelijk dat ik in een 3-tal objecten parameters wijzig. Deze moeten na afloop (aan het einde van de PHP pagina) gesynchronized worden met de DB. Maar dat MOET dus wel gebeuren. Het kan dus gebeuren dat er na het afsluiten van de objecten 3 verschillende tabellen worden aangepast in de DB.

Ik hoop daty het nu duidelijk is wat ik bedoel. Deze objecten moeten dus persee de kans hebben om hun data weer weg te schrijven in de DB.

[update]
update voor bakkerl: Ik gebruik MySQL 3.XX en die ondersteund geen transacties. Ik heb op dit moment geen mogelijkheid om over te gaan naar een andere DB zoals MySQL 4.0 of postgresql.
[/update]

[ Voor 0% gewijzigd door Sircuri op 09-09-2002 16:28 . Reden: Extra info toegevoegd ]

Signature van nature


Verwijderd

Sircuri schreef op 09 september 2002 @ 16:26:
In principe is het datamodel wel goed. Ik zal even een beetje insight geven waar van ik denk dat het relevant is (applicatie is een beetje omvangrijk :) )

Ik heb een aantal objecten in PHP die stuk voor stuk data representeren vanuit de DB. Tijdens het uitvoeren van een PHP bestand is het gewoon mogelijk dat ik in een 3-tal objecten parameters wijzig. Deze moeten na afloop (aan het einde van de PHP pagina) gesynchronized worden met de DB. Maar dat MOET dus wel gebeuren. Het kan dus gebeuren dat er na het afsluiten van de objecten 3 verschillende tabellen worden aangepast in de DB.

Ik hoop daty het nu duidelijk is wat ik bedoel. Deze objecten moeten dus persee de kans hebben om hun data weer weg te schrijven in de DB.
Dan is het inderdaad (zoals bakkerl ook al zei) handig om transactions te gebruiken. Dan zou je ook van je probleem af zijn.

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Je zou ook eerst die 3 opdrachten uit kunnen voeren en dán pas de output laten starten ?
misschien dat ob-start helpt ..

Verwijderd

TheRookie schreef op 09 september 2002 @ 16:29:
Je zou ook eerst die 3 opdrachten uit kunnen voeren en dán pas de output laten starten ?
misschien dat ob-start helpt ..
Maar ik denk dat het script dan nog steeds afgebroken wordt...

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 03-07 18:45

bakkerl

Let there be light.

Sircuri schreef op 09 september 2002 @ 16:26:
In principe is het datamodel wel goed. Ik zal even een beetje insight geven waar van ik denk dat het relevant is (applicatie is een beetje omvangrijk :) )

Ik heb een aantal objecten in PHP die stuk voor stuk data representeren vanuit de DB. Tijdens het uitvoeren van een PHP bestand is het gewoon mogelijk dat ik in een 3-tal objecten parameters wijzig. Deze moeten na afloop (aan het einde van de PHP pagina) gesynchronized worden met de DB. Maar dat MOET dus wel gebeuren. Het kan dus gebeuren dat er na het afsluiten van de objecten 3 verschillende tabellen worden aangepast in de DB.

Ik hoop daty het nu duidelijk is wat ik bedoel. Deze objecten moeten dus persee de kans hebben om hun data weer weg te schrijven in de DB.

[update]
update voor bakkerl: Ik gebruik MySQL 3.XX en die ondersteund geen transacties. Ik heb op dit moment geen mogelijkheid om over te gaan naar een andere DB zoals MySQL 4.0 of postgresql.
[/update]
Als de objecten persee hun data moeten kunnen opslaag ongeacht wat er gebeurt, moet toch naar de eerdere ingore_user_abort kijken. Er anders kun je dit nooit doen. Want zelf als je dit buiten php laat doen (iets wat door gaat), kun je nooit garanderen dat de (extrene) call gemaakt wordt om het uit te laten voeren.

Dus:
a) Moet je data altijd opgeslagen worden, wat er ook gebeurt, dan zul je moeten gaan werken met ignore_user_abort gaan werken. Omdat je dat anders nooit kan garanderen

b) Moet je data alleen worden weggeschreven worden als je php pagina aan het einde komt en wil je dat dit zeker gebeurt, dan zul je een externe call (naar een scripje?) moeten maken en die de data weg laten schrijven (met controle, en rollback mogelijkheid, maar dat moet je zelf maken dan in je scripje). Het is dan belangrijk dat je alle data in 1x meegeeft aan je scriptje die allemaal weggeschreven moet worden.
Al wordt een externe call ook weer lastig gemaakt omdat je in safe_mode config zit.
maar met externe calls kun je vanuit php wachten op een result en daar nog wat mee willen doen in je php.

b2) als je toch je dat in geval van b in 1x bij elkaar kunt krijgen, dan kun je ook kijken of je je insert-sql kunt aanpassen, zodat die het allemaal in 1x doet.
Pagina: 1