mkdir
Een vraagje. Als het niet lukt om een directory aan te maken dan geeft mkdir false terug. Echter, de reden kan verschillend zijn. Het kan zijn dat de directory al bestaat, of dat de maprechten van de parent directory het niet toestaan. Nu kan ik eerst controleren of de directory al bestaat en zo niet, dan pas mkdir() uitvoeren. Dus:
Nu is het zo dat PHP meerdere processen (requests) tegelijk uitvoert. Zou het nu kunnen dat proces A constateert dat directory "foo" niet bestaat, direct daarna proces B directory "foo" aanmaakt en proces A vervolgens de mkdir() zal uitvoeren wat resulteert in false omdat proces B zojuist de directory heeft aangemaakt? Anders gezegd, kan in de onderstaande regel op de plek van het sterretje * een ander proces de directory "foo" aanmaken?
Ik hoop dat mijn vraag duidelijk is. Zo niet, laat het dan even weten dan probeer ik het nog beter uit te leggen.
Gewijzigd op 25/12/2013 23:22:44 door Ozzie PHP
Sinds wanneer kan php meerdere processen tegelijkertijd aan?
Sowieso zegt men altijd: een computer (processor) kan maar 1 ding tegelijk.
Deze vraag wordt ook wel eens gesteld met SQL queries, ook daar is hier rekening mee gehouden.
Gewijzigd op 25/12/2013 23:35:10 door Mark Hogeveen
>> Bij multithreading zou je dit probleem kunnen hebben, maar voor zover ik weet gaat bij PHP alles echt achter elkaar.
Volgens anderen op het forum doet PHP wél aan multithreading.
Zie hier een antwoord op een eerdere vraag die ik hierover stelde:
http://www.phphulp.nl/php/forum/topic/processen/90311/#647988
Quote:
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.
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.
Hieruit leid ik af dat er meerdere requests tegelijkertijd kunnen worden afgehandeld. Of zie ik het verkeerd?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// 'foo' is geen bestand of map
if ( ! file_exists('foo'))
{
// is_dir() wordt alleen uitgevoerd als mkdir mislukt
if (mkdir('foo') OR is_dir('foo'))
{
// success, 'foo' is een map (ik negeer de mogelijke race conditie waar 'foo' tussen die twee checks verwijders is, anders blijven we bezig
}
}
else
{
// 'foo' bestaat al, geen idee of het een bestand of een map is
}
//
if (is_dir('foo') OR mkdir('foo'))
{
// 'foo' is een map
}
?>
// 'foo' is geen bestand of map
if ( ! file_exists('foo'))
{
// is_dir() wordt alleen uitgevoerd als mkdir mislukt
if (mkdir('foo') OR is_dir('foo'))
{
// success, 'foo' is een map (ik negeer de mogelijke race conditie waar 'foo' tussen die twee checks verwijders is, anders blijven we bezig
}
}
else
{
// 'foo' bestaat al, geen idee of het een bestand of een map is
}
//
if (is_dir('foo') OR mkdir('foo'))
{
// 'foo' is een map
}
?>
Gewijzigd op 26/12/2013 01:11:06 door Dos Moonen
Ik dacht ook nog eventueel aan deze oplossing:
Code (php)
Hierbij probeer ik eerst zonder enige controle de directory aan te maken. Als het niet lukt ga ik kijken of dat komt omdat de directory al bestaat, of omdat de directory niet kon worden aangemaakt (wegens verkeerde maprechten).
Is mijn variant ook goed?
Nu ik nog even naar jouw variant kijk mis ik de optie om een exception te gooien als het misgaat.
Gewijzigd op 26/12/2013 01:23:38 door Ozzie PHP
Er is gerede kans dat mkdir dan mislukt omdat er al een *file* is met die naam, maar is_dir() geeft dan warschijnlijk false....
En waarom zou je een directory willen aanmaken die de naam van een bestand heeft? :-s
>> Er is gerede kans dat mkdir dan mislukt omdat er al een *file* is met die naam, maar is_dir() geeft dan warschijnlijk false....
Dat zal inderdaad false opleveren, maar met mijn code (zie hierboven) komt ie dan dus in de "else" terecht. Precies wat je zou willen lijkt mij.
Dos zegt hierboven "Dat zijn van individuele processen die het OS in theorie precies op het sterretje zou kunnen onderbreken om een andere worker even aan de beurt te laten."
Het kan volgens Dos dus zo zijn dat deze situatie optreedt:
Code (php)
Kan de situatie zoals hierboven geschetst "in het echie" voorkomen? Dus dat je een if-statement hebt dat in true resulteert omdat een directory bestaat, en dat ondertussen terwijl het if-statement wordt uitgevoerd een andere proces de directory verwijdert, waardoor je binnen de if-statement ineens geen directory meer hebt? Als dit zo is, is het eigenlijk toch heel vreemd? Zou PHP zelf dan niet voorkomen dat tijdens de uitvoering van een if-statement het ene proces het andere proces niet kan onderbreken?
Eigenlijk kan ik mijn vraag nog iets ruimer stellen. Moet ik in het codeblok hierboven eenmalig controleren of de directory bestaat, of moet ik dubbel controleren?
Niet alleen als 2 php processen elkaar in de wielen rijden, maar ook als iemand via de command prompt de directory aanpast/verwijdert, of misschien wel de heel schijf unmount.
Hoe korter de tijd tussen regel 5 en 9 hoe kleiner de kans.
Als je eerst controleert of de dir bestaat en daarna op je gemak een pdf van 100 pagina's gaat bakken, dan kun je zo maar 1 of 2 minuten verder zijn.
Doe je niet heel veel tegen.
Ivo, dankjewel voor je reactie. Dan zal ik er toch maar rekening mee houden...