2011-10-26 3 views
1

Existe-t-il un moyen rapide de charger chaque ligne d'un fichier dans un tableau à partir d'un fichier déjà ouvert?Chargement des lignes de fichier dans un tableau APRES l'ouverture et le verrouillage du fichier (PHP)

Par exemple:

$handle = fopen("file", "r+"); 
flock($handle, LOCK_EX); 
$array = load_lines($handle); <- need this 
// compute on the array 
fwrite($handle, $array); 
flock($handle, LOCK_UN): 
fclose($handle); 

La raison pour laquelle je en ai besoin parce que j'utilise actuellement la fonction fichier() pour récupérer le contenu d'un fichier et les mettre dans un tableau. Cependant, j'ai besoin d'incorporer le verrouillage de fichier dans mon design et j'espère ne pas avoir à le changer trop (c'est basé sur le tableau actuel). Y a-t-il un moyen facile de faire ceci?

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser 'file()' après l'avoir verrouillé? –

+0

Je pensais à cela, mais je ne suis pas sûr de savoir comment cela fonctionne si mon fichier est verrouillé. Techniquement, j'ai un flux avec le fichier ouvert, ne produirait pas une autre demande de lecture qui serait bloquée? – n0pe

+0

Pourquoi ne pas envisager d'utiliser une base de données pour le traitement des verrous? – ajreal

Répondre

1

Sur php < 5.3, ou si vous choisissez de avec LOCK_NB, serrures de fichiers en php sont indicatives. Autrement dit, vous devez tester le verrou vous-même .. ils ne vous empêchent pas de mettre à jour le fichier. Cela fera:

$fh = fopen(__FILE__, 'r+'); 
if (flock($fh, LOCK_EX)) { 
    $array = file(__FILE__); 
    fwrite($fh, implode($array)); 
    flock($fh, LOCK_UN); 
    flcose($fh); 
} 
else { 
    echo "Could not acquire the lock!" 
} 

J'ai également testé cela sur PHP 5.3. Il semble que file() ignore le verrouillage.

+0

Donc, si elle ignore le verrouillage, il devrait être sûr à utiliser? Je suis à la recherche d'une fiabilité à 100%. – n0pe

+0

@MaxMackie le script ci-dessus fonctionne comme prévu dans 5.3.6. Le script ci-dessus devrait également être compatible avec les versions inférieures de php. En 5.3, le script bloquera sur la ligne 'flock()' (si vous n'utilisez pas non-bloquant, voir php.net pour plus d'infos) et continuera normalement une fois qu'il pourra acquérir le verrou. –

0

Essayez ceci:

function load_lines($handle) 
{ 
    $array = array(); 

    while(!feof($handle) 
    { 
     $array[] = fgets($handle); 
    } 

    return $array; 
} 
Questions connexes