2012-08-04 4 views
2

Ok, ok .. donc maintenant je panique.PHP accès aux fichiers simultanés

index1.php

<? 
function write_file($filepath,$filecontent) { 
    $openedfile = fopen($filepath,"w+"); //replace with $openedfile = fopen($filepath,"a"); just in case 
    flock($openedfile, LOCK_EX); 
//add here fclose($openedfile); to work 
//add here $openedfile = fopen($filepath,"w+"); to work 
    fwrite($openedfile,$filecontent); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
} 
function read_file($filepath) { 
    $openedfile = fopen($filepath,"r+"); 
    flock($openedfile, LOCK_SH); 
    sleep(10); 
    $filecontent = file_get_contents($filepath); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
    return $filecontent; 
} 
write_file("Readme.txt","test 1"); 
$f1 = read_file("Readme.txt"); 
echo $f1; 
?> 

index2.php

<? 
function write_file($filepath,$filecontent) { 
    $openedfile = fopen($filepath,"w+"); //replace with $openedfile = fopen($filepath,"a"); to work 
    flock($openedfile, LOCK_EX); 
//add here fclose($openedfile); to work 
//add here $openedfile = fopen($filepath,"w+"); to work 
    fwrite($openedfile,$filecontent); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
} 
function read_file($filepath) { 
    $openedfile = fopen($filepath,"r+"); 
    flock($openedfile, LOCK_SH); 
    $filecontent = file_get_contents($filepath); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
    return $filecontent; 
} 
write_file("Readme.txt","test 2"); 
$f1 = read_file("Readme.txt"); 
echo $f1; 
?> 

je lance index1.php, puis après 2 secondes je lance index2.php. Index2.php attend index1.php comme prévu mais index1.php ne montre rien après 10 sec, tandis que index2.php affiche "test 2". Que se passe-t-il?

EDIT: Je l'ai compris: D. J'ai changé

$openedfile = fopen($filepath,"w+"); 

à

$openedfile = fopen($filepath,"a"); 

deuxième php et il ne nettoie pas readme.txt lors de l'exécution index2.php plus.

+0

On dirait que vous relâchez le verrou avant l'écriture du fichier. Voir aussi ['fflush'] (http://de.php.net/fflush). – hakre

Répondre

1

Cela ne doit-il pas faire quelque chose du fait que votre fichier readme.txt est réellement vide pendant une très courte période lorsque vous ouvrez le fichier pour y écrire? Je pensais que PHP a sorti tout le texte, et l'a remplacé par le texte entier + ajouts. Quand index1.php veut lire le fichier, index2.php l'a peut-être effacé? Vous pouvez vérifier cela dans les journaux apache en passant.

EDIT: aussi, immédiatement après le déverrouillage du fichier, index2.php prend le contrôle sur elle, TEST 1 avec écrasement 2. ESSAI

+0

Vous avez raison. J'ai vérifié encore et readme.txt est vide après que j'exécute index2.php. J'ai été raté parce que plus tôt quand j'ai vérifié readme.txt via FTP (le serveur n'est pas local) après l'exécution de index2.php, readme.txt contenait "test 1". FTP a-t-il du cache ou quelque chose? – user148823

+0

FTP? Sans mot dans votre question, vous avez mentionné que cela est lié à FTP. Et oui, FTP fait des choses différentes de celles du système de fichiers local car il s'agit juste d'un protocole et d'un serveur qui parle avec. Cela dépend alors du serveur FTP et de sa configuration. Vérifiez la configuration et la documentation de votre serveur FTP pour savoir comment vous pouvez influencer son comportement pour votre bien. – hakre

+0

Pas que je sache réellement. Mais peut-être est-il simplement plus simple de mettre le contenu de readme.txt dans une base de données? C'est plus rapide à modifier et à modifier. –