2016-06-08 1 views
0

Je cherche un algorithme simple qui dit:fichier bloc PHP à la lecture

Fichier1: (lock.php)

  • Ouvrir un fichier
  • verrouillage du fichier, de sorte qu'aucun autre fichier PHP peut lire ce
  • sommeil
  • déverrouillage

Fichier2: (lockstatus.php)

  • Essayez d'ouvrir le fichier.
  • Si l'ouverture ne
    • Attendez verrouillage pour libérer
  • Else
    • Lire le fichier

Ma mise en œuvre du code:

Lock.php:

<?php 
$f = fopen("key",'a'); 
if (flock($f, LOCK_EX | LOCK_NB)) { 
    echo "File Locked. For Next 60 Seconds\n"; 
    sleep(60); 
    var_dump(flock($f, LOCK_UN)); //release lock 
    echo "lock released"; 
} else { 
    echo "blocked"; 
} 
?> 

Lockstatus.php

<?php 
do { 
    echo "\n"; 
    $f = fopen("key",'a'); 
    if ($f) { 
     echo "Readable\n"; 
     fclose ($f); 
    } else { 
     echo "Blocked! I am waiting\n"; 
     sleep(10); 
    } 
} while (!$f); //wait until fopen does not work 
?> 

Problème: Même, flock est appliqué, le Lockstatus.php est en mesure d'ouvrir le fichier.

Question:

Comment bloquer le fichier à lire Lockstatus.php une fois qu'il est verrouillé par Lock.php?

Répondre

2

Le problème est que flock() fournit uniquement un verrouillage de conseil. L'autre programme peut complètement ignorer ceci et procéder à fopen et à fread ou à n'importe quoi d'autre. La clé est d'utiliser flock dans votre Lockstatus.php ainsi après votre faire le fopen pour vérifier s'il existe des verrous existants. flock dans Lockstatus.php échouerait et alors vous sauriez qu'il existe un verrou existant.

1

Cette fonction flock() a un comportement différent sous Linux et Windows.

Jetez un coup d'œil à "Notes" sur les documents PHP. Cela pourrait être votre problème.

flock on PHP Docs

Après cela, faites attention au paramètre r +, ESt obligatoire pour la lecture + verrouillage.

$fp = fopen('/tmp/lock.txt', 'r+'); 

Il ne fonctionnera pas avec un .

+0

J'utilise Linux. Par conséquent, je suppose que cela devrait fonctionner dans mon cas. Et fait "r +" cependant, ça ne marche pas. –

+0

Jetez un oeil au premier commentaire sur les docs: "La fonction flock suit la sémantique de l'appel système Unix portant le même nom.Flock n'utilise que le verrouillage ADVISORY, c'est-à-dire que d'autres processus peuvent ignorer complètement le verrou. appelle l'appel du troupeau. " –