2011-10-26 5 views
1

すでにファイルを開いた後、ファイルの各行をファイルの配列に簡単にロードできますか?例えばファイルを開いてロックした後にファイルをロードする(PHP)

$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); 

私は現在、ファイルの内容を取得し、配列にそれらを置くために、ファイル()関数を使用しているため、これは必要な理由。しかし、私はデザインにファイルロックを組み込む必要があります。私はそれをあまり変更する必要がないことを望んでいます(現在の配列ベースです)。これを行う簡単な方法はありますか?

+0

'file()'をロックした後で使用できない理由はありますか? –

+0

私はそれについて考えていましたが、私のファイルがロックされているとどうすればよいのか分かりません。技術的には、ファイルを開いた状態のストリームがあります。ファイルを読み込まないと、別の読み込み要求がハングアップします。 – n0pe

+0

ロック処理にデータベースを使用することを検討してみませんか? – ajreal

答えて

1

、またはあなたがLOCK_NBとすることを選択した場合、PHPのファイルロックが助言しています。つまり、自分でロックをテストする必要があります。実際にファイルを更新することはできません。これは次のようになります:

$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!" 
} 

私はこれもPHP 5.3でテストしました。 file()はロックを無視しているようです。

+0

ロックを無視すれば、安全に使用する必要がありますか?私は100%の信頼性を求めています。 – n0pe

+0

@MaxMackie上記のスクリプトは、5.3.6で期待通りに動作します。上記のスクリプトはまた、PHPのより低いバージョンと互換性があります。 5.3では、スクリプトは 'flock()'行でブロックされます(ノンブロッキングを使用しない場合はphp.netを参照してください)。 –

0

これを試してみてください:PHP < 5.3で

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

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

    return $array; 
} 
関連する問題