Apaches-standpunt
Apache heeft één bovenliggend proces. Dit proces creëert onderliggende processen die alle verzoeken die naar de webserver komen, zullen verwerken. Het aanvankelijke aantal onderliggende processen dat wordt gestart wanneer de webserver start, wordt geconfigureerd door de StartServers
richtlijn in de apache-configuratie. Het aantal gaat indien nodig omhoog met een toenemend aantal verzoeken dat de webserver bereikt tot ServerLimit
is bereikt.
PHP en permanente verbindingen
Als PHP (uitgevoerd als mod_php, aangezien CGI alle bronnen vrijmaakt aan het einde van de uitvoering van het script) nu wordt verteld om een permanente verbinding met een database tot stand te brengen voor een verzoek, wordt deze verbinding vastgehouden, zelfs nadat het script is voltooid. De verbinding wordt nu hold is een verbinding tussen het apache-kinderproces waarmee het verzoek is afgehandeld en de databaseserver en kan opnieuw worden gebruikt door elk verzoek dat door dit exacte onderliggende proces wordt afgehandeld.
Als, om de een of andere reden (vraag me niet precies waarom), het kindproces langer wordt gebruikt dan het eigenlijke verzoek en er komt een ander verzoek binnen, dan leidt het bovenliggende apacheproces dit verzoek om naar een (nieuw) kindproces dat mogelijk niet is vastgesteld een verbinding met de database tot op dat moment. Als het tijdens de uitvoering van het script moet, verhoogt het de SID zoals u hebt waargenomen. Nu zijn er twee verbindingen die worden vastgehouden door twee verschillende onderliggende processen van apache.
Houd er rekening mee dat...
Het is belangrijk om te weten dat dit ook veel problemen kan veroorzaken. Als er een eindeloze lus is of een afgebroken transactie of een andere zelfs onvoorspelbare fout tijdens de uitvoering van het script, wordt de verbinding geblokkeerd en kan deze niet opnieuw worden gebruikt Het kan ook gebeuren dat alle beschikbare verbindingen van de database worden gebruikt, maar dat er een ander onderliggend proces van de apache-server is die toegang probeert te krijgen tot de database. Dit proces wordt voorlopig geblokkeerd totdat een verbinding wordt vrijgegeven door de database of apache (time-out of vrijwillig door beëindiging). Meer informatie over dit onderwerp op deze pagina:http://www.php.net/manual/en/features.persistent-connections.php
Ik hoop dat ik alles wat we hebben besproken in ons commentaargesprek correct heb samengevat en niets ben vergeten. Als dat zo is, laat me dan een hint achter en ik zal het toevoegen. :)
Bewerken:
Ik ben net klaar met het lezen van het artikel @MonkeyZeus dat in deze opmerking wordt genoemd. Het beschrijft het proces dat ik hierboven heb samengevat en biedt nuttige informatie over hoe u uw apache-server kunt optimaliseren om beter samen te werken met permanente verbindingen. Het kan worden gebruikt met of zonder Oracle-database-backends, hoewel.Je zou eens een kijkje moeten nemen:http://www.oracle.com/technetwork/articles/coggeshall-persist-084844.html