processen
Ik heb zojuist een functie gemaakt die een complete directory (dus inclusief alle bestanden en subdirectories) verwijdert. So far so good. Werkt allemaal prima.
Waar je goed op moet letten, is dat je eerst alle bestanden in de hoofddirectory en de subdirectories verwijdert, en daarna pas de subdirectories. Als er namelijk nog bestanden in een subdirectory staan, dan kun je deze subdirectory niet verwijderen en kun je dus niet de complete directory niet verwijderen met alle gevolgen van dien.
Zoals ik al zei werkt het allemaal prima. Maar ik vroeg me het volgende af...
Ik wil een directory leegmaken waar cache bestanden in worden weggeschreven. Mijn functie verwijdert allereerst recursief alle bestanden uit alle directories. Zou het nu zo kunnen zijn dat nadat alle bestanden verwijderd zijn, er heel toevallig op datzelfde moment een andere gebruiker een actie triggert waardoor er een cache bestand wordt weggeschreven in een van de subdirectories... en waardoor die subdirectory dus niet meer kan worden verwijderd (omdat deze niet meer leeg is)?? Of is dat technisch onmogelijk?
Om mijn vraag wat breder te trekken, kan het zo zijn dat er tegelijkertijd meerdere processen worden uitgevoerd? Of is het zo dat de processen op elkaar "wachten"?
Stel we hebben 2 gebruikers en die roepen "gelijktijdig" dezelfde pagina aan. Moet bezoeker B dan wachten totdat het request van bezoeker A is afgehandeld? Of lopen de processen door elkaar heen en wordt alles gelijktijdig uitgevoerd?
Als de bezoekers op elkaar moeten wachten, dan hoef ik niet bang te zijn dat er tijdens het verwijderen van de bestanden door een andere bezoeker een cache bestand wordt weggeschreven. Als alle processen echter door elkaar heen lopen, zou dat wel kunnen gebeuren en heb ik een probleem.
Wie weet het antwoord?
Gewijzigd op 18/04/2013 04:12:24 door Ozzie PHP
Als de kans bestaat dat er een cache-bestand wordt weggeschreven in een directory die je wilt wissen, vraag ik me af of de structuur van je programma wel goed inelkaar zit. Waarom zou je een cache-directory willen verwijderen in een actief systeem? Ik kan me voorstellen dat je de directory wilt leegmaken, maar de directory zelf verwijderen is een ander verhaal.
Wat je wel kan doen om te voorkomen dat een ander proces naar de directory schrijft, is eerst de directory hernoemen en hem dan verwijderen.
Gewijzigd op 18/04/2013 07:53:11 door Willem vp
Willem vp op 18/04/2013 07:52:26:
Als de kans bestaat dat er een cache-bestand wordt weggeschreven in een directory die je wilt wissen, vraag ik me af of de structuur van je programma wel goed inelkaar zit. Waarom zou je een cache-directory willen verwijderen in een actief systeem? Ik kan me voorstellen dat je de directory wilt leegmaken, maar de directory zelf verwijderen is een ander verhaal.
Iedere website krijgt zijn eigen cache directory. Stel nu dat ik straks vanuit mijn CMS een bepaalde cache directory van een bepaalde site wil leegmaken (omdat er om een of andere reden verkeerde/verouderde data in staat). Dan druk ik op een knop en de functie wordt uitgevoerd. Eerst worden dan alle bestanden uit de directory en subdirectories verwijderd. Maar nu zou het best zo kunnen zijn dat op datzelfde moment iemand die website bezoekt en er automatisch weer een nieuw cache bestand wordt aangemaakt (het zojuist door mijn functie verwijderde bestand wordt niet gevonden en dus wordt er een nieuw cache bestand aangemaakt). Als het aanmaken van dat nieuwe cache bestand plaatsvindt nog voordat mijn functie de subdirectories heeft verwijderd, dan zal dat er toe leiden dat die subdirectory niet verwijderd kan worden en de directory niet kan worden leeggemaakt / verwijderd. Maar de vraag is dus of terwijl de functie die de directory leegmaakt er gelijktijdig een functie kan worden aangeroepen die een cache bestand wegschrijft. Kan het zo zijn dat er dus 2 functies tegelijk worden uitgevoerd? Moet ik eerst de directory renamen?
(Iedere website krijgt een eigen cache directory. Als de complete cache moet worden verwijderd, dan verwijder ik de complete cache directory. Dit kan bijv. voorkomen als ik een bepaalde website van mijn server wil verwijderen. Die cache directory is dan niet meer nodig. Op het moment dat er wél iets gecachet moet worden, dan wordt eerst gekeken of de directory bestaat. Zo niet dan wordt die automatisch aangemaakt.)
Ozzie PHP op 18/04/2013 11:04:38:
Maar de vraag is dus of terwijl de functie die de directory leegmaakt er gelijktijdig een functie kan worden aangeroepen die een cache bestand wegschrijft. Kan het zo zijn dat er dus 2 functies tegelijk worden uitgevoerd? Moet ik eerst de directory renamen?
Ik denk dat het antwoord hierop volmondig ja moet zijn. Een webserver is een multithreaded omgeving dus die kan meerdere requests tegelijk aan. Uiteraard niet oneindig veel, maar zeker meer dan 1.
Dit kan je simpel zelf testen door van 1 device een aanvraag naar je server te doen die je in een lange (desnoods oneindige) loop laat komen en vanaf een andere device een pagina op te vragen. Die pagina krijg je vast te zien -> twee requests tegelijk uitgevoerd dus.
Dankjewel Erwin! Dat is een zeer helder antwoord. Dan ga ik het renamen er toch maar even inbouwen! :)
Je krijgt dan bijvoorbeeld onderstaande uitput:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
root@webserver:~# ps -ef |grep apache
root 6514 1 0 Apr09 ? 00:01:24 /usr/sbin/apache2 -k start
www-data 12134 6514 0 Apr14 ? 00:00:05 /usr/sbin/apache2 -k start
www-data 12192 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12193 6514 0 Apr14 ? 00:00:04 /usr/sbin/apache2 -k start
www-data 12325 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12328 6514 0 Apr14 ? 00:00:02 /usr/sbin/apache2 -k start
www-data 12329 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12330 6514 0 Apr14 ? 00:00:04 /usr/sbin/apache2 -k start
www-data 13140 6514 0 Apr14 ? 00:00:02 /usr/sbin/apache2 -k start
www-data 17722 6514 0 Apr15 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 22633 6514 0 11:20 ? 00:00:00 /usr/sbin/apache2 -k start
root 22667 22656 0 11:28 pts/1 00:00:00 grep apache
root 6514 1 0 Apr09 ? 00:01:24 /usr/sbin/apache2 -k start
www-data 12134 6514 0 Apr14 ? 00:00:05 /usr/sbin/apache2 -k start
www-data 12192 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12193 6514 0 Apr14 ? 00:00:04 /usr/sbin/apache2 -k start
www-data 12325 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12328 6514 0 Apr14 ? 00:00:02 /usr/sbin/apache2 -k start
www-data 12329 6514 0 Apr14 ? 00:00:03 /usr/sbin/apache2 -k start
www-data 12330 6514 0 Apr14 ? 00:00:04 /usr/sbin/apache2 -k start
www-data 13140 6514 0 Apr14 ? 00:00:02 /usr/sbin/apache2 -k start
www-data 17722 6514 0 Apr15 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 22633 6514 0 11:20 ? 00:00:00 /usr/sbin/apache2 -k start
root 22667 22656 0 11:28 pts/1 00:00:00 grep apache
Het aantal processen (overigens eigenlijk geen threads) is een instelling in je httpd.conf of apache2.conf
Hier kan je de default en het max aantal processen instellen.
Ah oke... is iedere regel die eindigt met "start" een proces? Zo ja, dan zijn het er bij mij 7.
met ps -ef zie je alle processen op je server.
pipe grep apache filtert alleen de processen op het woordje 'apache'
Ozzie, Je kunt er volgens mij dan ook voor kiezen om alleen de bestanden te verwijderen. Je ruimt je cache dan wel op maar hebt geen probleem met het nieuwe cache bestanden die verwijderd moeten worden.
• Applicatie A voor het legen van de cache wordt gestart.
• Applicatie B slaat een nieuw cachebestand op.
• Applicatie A komt het cachebestand van B tegen en verwijdert het.
• Applicatie B wil het cachebestand gebruiken en staat met lege handen.
@TJVB: ik snap niet helemaal wat je bedoelt. Ik wil de complete directory verwijderen.
@Ward: dat kun je voorkomen door de juiste logica. Als een cache bestand niet bestaat, laad ik eerst de juiste gegevens in en die stop ik in een variabele $foo. Vervolgens sla ik de inhoud van $foo op in het cachebestand en voor de rest van de code gebruik ik gewoon $foo.
John D op 18/04/2013 11:33:05:
Het aantal processen (overigens eigenlijk geen threads) is een instelling in je httpd.conf of apache2.conf
Hier kan je de default en het max aantal processen instellen.
Hier kan je de default en het max aantal processen instellen.
Processen staan inderdaad niet gelijk aan threads; wel kan een proces meerdere threads hebben (bij Apache is dat standaard ook wel het geval). Als de statusmodule geconfigureerd is, kun je die gegevens ook opvragen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
PID Connections Threads Async connections
total accept busy idle writing keep-alive closing
22525 24 yes 5 27 0 9 9
28332 10 yes 0 32 0 4 6
32673 13 yes 4 28 0 3 6
19882 13 yes 4 28 0 6 4
19883 11 yes 4 28 0 4 3
19884 5 yes 0 32 0 1 4
Sum 76 17 175 0 27 32
total accept busy idle writing keep-alive closing
22525 24 yes 5 27 0 9 9
28332 10 yes 0 32 0 4 6
32673 13 yes 4 28 0 3 6
19882 13 yes 4 28 0 6 4
19883 11 yes 4 28 0 4 3
19884 5 yes 0 32 0 1 4
Sum 76 17 175 0 27 32
Je ziet hier dat er 6 httpd-processen draaien (nou ja, op OS-niveau eigenlijk 8, maar daarvan houden 2 zich niet bezig met http-requests) en dat die 6 processen op dit moment 76 connecties hebben, waarvan 17 busy (die anderen zijn net klaar of wachten op meer data). Elk proces heeft 32 threads; er kunnen met die 6 processen dus bijna 200 connecties worden afgehandeld. Is dat te weinig, dan worden er automatisch meer processen gestart; in dit geval maximaal 60 processen. Zijn er meer dan 250 threads idle, dan worden er processen gestopt.
Het aantal processen dat op je server draait zegt dus niet direct iets over het aantal connecties op je site. En het aantal connecties zegt op zijn beurt ook niet direct iets over het aantal gebruikers, want als je een pagina hebt met 20 plaatjes, wordt voor elk plaatje (of wat voor object dan ook) een aparte connectie gemaakt. En (en dan komen we weer terug bij je oorspronkelijke vraag) die gaan niet op elkaar staan wachten tot er een klaar is, want dan zou de browser net zo goed alle requests 1 voor 1 kunnen doen.
Thanks voor de toelichting Willem! Wel grappig. Dit is een wereld waar ik helemaal niet in thuis ben. Zo leer je nog eens wat (alhoewel ik niet alles wat je zegt precies begrijp, maar de grote lijnen gelukkig wel).
Ozzie PHP op 18/04/2013 11:04:38:
Stel nu dat ik straks vanuit mijn CMS een bepaalde cache directory van een bepaalde site wil leegmaken (omdat er om een of andere reden verkeerde/verouderde data in staat). Dan druk ik op een knop en de functie wordt uitgevoerd. Eerst worden dan alle bestanden uit de directory en subdirectories verwijderd. Maar nu zou het best zo kunnen zijn dat op datzelfde moment iemand die website bezoekt en er automatisch weer een nieuw cache bestand wordt aangemaakt
Blijft de vraag: waarom wil je per se de cache-directory verwijderen als je alleen de cache maar leeg wilt maken? Ik kan me voorstellen dat je (ter voorkoming van al teveel bestanden) onder je cache-directory 256 subdirectories 00 t/m ff hebt, en dat die ook allemaal subdirectories 00 t/m ff hebben, en dat je die hele structuur onder je cache-directory wilt leeggooien. Maar stel nu dat je bezig bent om cache/00 leeg te gooien en op het moment dat je directory cache/00/a4 aan het verwijderen bent, wordt er een nieuw bestand aangemaakt onder cache/00/8f (die je daarvoor dus al gewist hebt). Dat betekent dat je straks cache/00 niet meer kunt wissen. Maar dat is toch niet erg, want de oude data die erin stond is toch al verwijderd?
Quote:
(Iedere website krijgt een eigen cache directory. Als de complete cache moet worden verwijderd, dan verwijder ik de complete cache directory. Dit kan bijv. voorkomen als ik een bepaalde website van mijn server wil verwijderen.
En als je een site verwijdert loop je dus ook niet het risico dat er tijdens het wissen iets naar de cache wordt geschreven, want die site is er immers niet meer. ;-)
Tja, eigenlijk gewoon omdat het me wel handig lijkt. Stel dat ik op een gegeven moment voor een site helemaal geen cache meer wil gebruiken, dan gooi ik met een druk op de knop de hele cache weg. Ik zou ook alleen de bestanden kunnen weggooien, maar dat is eigenlijk gewoon een keuze. En het verwijderen gebeurt dus per site. Stel je zo'n structuur voor:
Dan wil ik met een druk op de knop bijv. de complete cache van site2.nl kunnen verwijderen, terwijl site 1 en 3 gewoon blijven bestaan.
"En als je een site verwijdert loop je dus ook niet het risico dat er tijdens het wissen iets naar de cache wordt geschreven, want die site is er immers niet meer. ;-)"
Lol, dat is waar :-)
Ik kan me echter voorstellen dat er andere situaties zijn waarin dit verhaal wel van toepassing is.
Gewijzigd op 18/04/2013 13:24:46 door Ozzie PHP