Forum und email

Connection handling

Note: Het volgende is alleen actief in PHP 3.0.7 en hoger.

Intern in PHP wordt de connectie status bijgehouden. Er zijn 3 mogelijke statussen mogelijk:

  • 0 - NORMAL
  • 1 - ABORTED
  • 2 - TIMEOUT

Als een PHP script normaal draait is de NORMAL status actief. Zogauw een gebruiker de HTTP connectie sluit is de ABORTED status actief. Dit gebeurt meestal als de gebruiker op z'n STOP knop klikt. Als de door PHP bijgehouden tijdlimiet (zie set_time_limit()) overschreden word, is de TIMEOUT status actief.

Je kunt er voor kiezen jouw script te beëindigen wanneer een gebruiker de connectie met de server sluit, echter is het soms handig om een script door te laten lopen, zelfs als er geen browser is om de output te ontvangen. Standaard wordt echter jouw script gestopt wanneer de gebruiker de connectie sluit. Dit gedrag kan gewijzigd worden met de ignore_user_abort php.ini directive of met de corresponderende php_ignore_user_abort Apache .conf directive of het makkelijkst met de ignore_user_abort() functie. Als je PHP niet vertelt het sluiten van een connectie te negeren zal je script gestopt worden zogauw dit gebeurd. Er is een uitzondering, als je een shutdown functie hebt geregistreerd met de register_shutdown_function() functie zal PHP zogauw hij ontdekt dat er geen connectie meer is, proberen deze shutdown functie aan te roepen. Deze functie wordt echter ook aangeroepen als je script op een normale manier eindigt. Als je alleen actie wilt ondernemen als de gebruiker de connectie sluit kun je gebruik maken van de connection_aborted() functie. Deze functie geeft TRUE als de connectie gesloten is.

Jouw script kan ook beëindigd worden door de ingebouwde script timer. De standaard timeout is 30 seconden. Dit kan veranderd worden met de max_execution_time php.ini directive of met de corresponderende php_max_execution_time Apache .conf directive alsmede met de set_time_limit() functie. Als de toegestane tijd word overschreden wordt het script beëindigd en net zoals in het geval dat de gebruiker de connectie sluit word er een shutdown functie aangeroepen mits deze geregistreerd is. In deze shutdown functie kun je controleren of een timeout de oorzaak is van het aanroepen van de shutdown function. Dit doe je met de connection_timeout() functie. Deze functie geeft TRUE als een timeout de oorzaak was.

Een ding om te onthouden is dat de ABORTED status en de TIMEOUT status allebei actief kunnen zijn op het zelfde moment. Dit is pas mogelijk als je PHP verteld om zgn. 'user aborts' (gebruikt sluit connectie) te negeren. PHP zal merken dat de gebruiker de connectie gesloten heeft maar het script blijft draaien. Als het tijdslimiet bereikt word, wordt het script beëindigd en de shutdown functie aangeroepen. Je zal merken dat als dit het geval is zowel connection_timeout() als connection_aborted() TRUE geven. Je kunt deze statussen met 1 functie controleren, namelijk connection_status(). Deze functie geeft een bitfield met de huidig actieve statussen. Dus als beide statussen actief zijn zou het 3 geven.