Toon posts:

[Apache/PHP] Slapende scripts geforceerd beindigen; hoe? *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een webserver opgezet, en die draait aardig. Inmiddels werken er meerdere gebruikers op, Helaas groeien met het aantal gebruikers ook het aantal problemen. Zo zijn er gebruikers die scripts draaien die hierop neerkomen:
PHP:
1
2
3
4
5
6
<?php
while(true) {
 sleep(10);
 echo "a";
}
?>

Wanneer zoiets maar vaak genoeg aangeroepen wordt, gaat de boel vanzelf traag lopen. Een script als deze loopt uren door, terwijl er ondertussen door Apache aan systemresources wordt geknabbeld.

Om dit te voorkomen heb ik de volgende dingen uitgezocht:
Max_execution_time in PHP. Werkt niet omdat sleep een syscall is, en niet wordt meegeteld bij deze tijd.
Time-out in Apache. Werkt niet omdat dit meer betrekking heeft op de verbinding, en niet op de uitvoertijd van scripts.
Elke x minuten een graceful restart. Werkt niet omdat zoiets niet gracefully wil restarten.
Gezocht op 'php hard execution limit' en 'apache hard-limit sethandler', maar niets gevonden dat deed wat ik wou.

Ik kan mij niet voorstellen dat grote hosters hier ook mee zitten. Er zal dus wel een manier zijn dit op te lossen (afgezien van elke x minuten apache stoppen, en daarna weer starten). Ik heb echter gezocht, maar kan het niet vinden. Heeft iemand een idee?

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Nette topicstart :) Ik pas je topictitel nog ietswat aan in de hoop dat deze het probleem iets duidelijker omschrijft. Om welke versie van Apache op welk OS gaat het trouwens? En geldt dit probleem alleen voor PHP scripts; of sta je ook nog andere scripts toe? :)

[Apache] Hard time-out limit > [Apache/PHP] Slapende scripts geforceerd beindigen; hoe? *

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Spider.007 schreef op zaterdag 19 februari 2005 @ 20:40:
Om welke versie van Apache op welk OS gaat het trouwens?
Op het moment om Windows XP (Pro) icm Apache 2.0.x, maar ditzelfde probleem doet zich ook voor op andere operating systems (gereproduceerd op FreeBSD 4.9 met Apache 1.3.x).
En geldt dit probleem alleen voor PHP scripts; of sta je ook nog andere scripts toe?
Op het moment alleen PHP, en ik verwacht niet dat ik dit ooit uit ga breiden. Een oplossing zou dus zowel in Apache als in PHP gezocht kunnen worden.

Verwijderd

Topicstarter
schopje :)

  • Eijkb
  • Registratie: Februari 2003
  • Laatst online: 29-07 17:11

Eijkb

Zo.

Ik neem aan dat dit scripts zijn die niet via een browser werken maar in de CGI versie van php? Anders zou zo'n script stoppen wanneer de browser gesloten wordt. Heb je overigens een voorbeeld waarom iemand zo'n script zou gebruiken? Vind het een beetje een rare manier van werken eerlijk gezegd en zie zo geen toepassing.

.


Verwijderd

Topicstarter
Eijkb schreef op maandag 21 februari 2005 @ 14:31:
Ik neem aan dat dit scripts zijn die niet via een browser werken maar in de CGI versie van php? Anders zou zo'n script stoppen wanneer de browser gesloten wordt.
Helaas: na het sluiten van de browser gaat het gewoon door, en ik ben er vrij zeker van dat het niet om de CGI versie gaat.
Heb je overigens een voorbeeld waarom iemand zo'n script zou gebruiken? Vind het een beetje een rare manier van werken eerlijk gezegd en zie zo geen toepassing.
Het gebeurt meer per ongeluk dan opzettelijk.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

In hoeverre zou een 'omweg' zoals het gescheduled afschieten van processen een idee zijn? Verder zal ik eens kijken of ik dit probleem kan reproduceren :)

edit:
Kun je bij elk script geen header file opnemen; en daarin een call doen naar ignore_user_abort :?

[ Voor 34% gewijzigd door Spider.007 op 21-02-2005 21:16 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Spider.007 schreef op maandag 21 februari 2005 @ 21:08:
In hoeverre zou een 'omweg' zoals het gescheduled afschieten van processen een idee zijn?
Het probleem is dat zo'n script vaak erg vaak achter elkaar aangeroepen wordt. Als ik dus elke 5 minuten alles afschiet, kan het zo zijn dat er (maximaal) gedurende 5 minuten geen pagina opvraagbaar is doordat de system resources op zijn.
Verder zal ik eens kijken of ik dit probleem kan reproduceren :)
Bij mij was het op 3 servers geen probleem. Met behulp van mod_status kun je zien of en hoelang Apache ermee bezig is.
edit:
Kun je bij elk script geen header file opnemen; en daarin een call doen naar ignore_user_abort :?
Getest, en dit lijkt geen effect te hebben.

[ Voor 2% gewijzigd door Verwijderd op 21-02-2005 21:49 . Reden: quote-tag gefixt ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op maandag 21 februari 2005 @ 21:37:
[...]

Het probleem is dat zo'n script vaak erg vaak achter elkaar aangeroepen wordt. Als ik dus elke 5 minuten alles afschiet, kan het zo zijn dat er (maximaal) gedurende 5 minuten geen pagina opvraagbaar is doordat de system resources op zijn.

[...]
Hmm; dat is inderdaad niet handig. Het zou overigens mogelijk moeten zijn om en een eventuele timeout via apache af te dwingen; maar ik ben bang dat die ook zal gelden voor scripts waar de user nog wel op een reactie wacht
[...]

Getest, en dit lijkt geen effect te hebben.
Je had hem op FALSE gezet zonder effect? De functienaam zou verwarring kunnen opwekken zoals ook in de notes omschreven:
The function name is the authoritative one: a value of TRUE will ignore the user's abort.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Spider.007 schreef op maandag 21 februari 2005 @ 22:03:
Het zou overigens mogelijk moeten zijn om en een eventuele timeout via apache af te dwingen; maar ik ben bang dat die ook zal gelden voor scripts waar de user nog wel op een reactie wacht
'Time-out' is de enige httpd.conf setting die ik over time-outs heb kunnen vinden, en die heeft betrekking op de verbinding zelf, niet op een script. Bij het zoeken op 'apache addhandler time-out' heb ik een dergelijke instelling ook niet gevonden. Hoe zou ik zo'n timeout via apache kunnen regelen?
Je had hem op FALSE gezet zonder effect? De functienaam zou verwarring kunnen opwekken zoals ook in de notes omschreven:
Voor de zekerheid heb ik zowel true als false geprobeerd, maar zonder resultaat :)

Verwijderd

Topicstarter
schopje :)

Verwijderd

Topicstarter
Spider.007 schreef op maandag 21 februari 2005 @ 22:03:
Hmm; dat is inderdaad niet handig. Het zou overigens mogelijk moeten zijn om en een eventuele timeout via apache af te dwingen; maar ik ben bang dat die ook zal gelden voor scripts waar de user nog wel op een reactie wacht
Ik ben nog steeds erg benieuwd hoe dit zou gaan :)
Pagina: 1