0

次のように、書き込み用に開いているファイルがあります。

if (!$idHandle = fopen($fileName, 'w')) {
        echo "Cannot open file ($fileName)";
        die();
    }

$beerId次に、反復ごとに変数 をインクリメントするループに入ります。その変数を開いているファイルに保存したいので、次のコードを使用します。

if (fwrite($idHandle, $beerId) === FALSE) {
    echo "Cannot write to file ($fileName)";
    die();
    }
$beerId++;

ただし、これにより、遭遇するすべてのbeerIdの大量の文字列が作成されます。私が望むのは、最後に中断したIDのみをファイルに入力することです。

書き込みをループの外に置くことができることはわかっていますが、スクリプトは揮発性であり、エラーで途中で終了する可能性が高いため、スクリプトを終了するエラーが発生した場合でも、最後の $beerId 変数への参照が必要ですループが適切に終了する前に。

4

2 に答える 2

1

可能であれば、memcache->increment() を試してください。

http://php.net/manual/en/memcache.increment.php

$memcache->add('beer_id', 0);ゼロに初期化するために使用します。次に、最初のサニティ チェックの$beer_idようにフェッチし、次の.$memcache->get('beer_id')$memcache->increment('beer_id');$beer_id

file_get_contents()それ以外の場合は、 andに固執しfile_put_contents()ます。

于 2013-05-02T14:55:58.723 に答える
1

fwriteはファイル内の場所を追跡するため、ファイルの先頭に戻る必要があります。fseekを使用します。ループ内でファイルを数回開いたり閉じたりするのはコストがかかります。この場合、そうする理由がわかりません。もちろん、作業が終わったらファイルを閉じる必要があります。

ファイルに書き込む直前にこれを追加する必要があります。

fseek($idHandle, 0);

これにより、ファイルの先頭に移動します。増分値により、前の値を削除することを心配する必要がないからです。

EDIT 上記 の私の答えでは、遭遇したIDは増分値であると想定していますが、そうは言わないでid=10ください. str_padを使用して書いている文字列に:id=110

str_pad($value_to_write, 10); //or whatever value is reasonable.
于 2013-05-02T14:48:07.317 に答える