1

fopen()通常の状態では、すべて問題ありません。新しいファイルを書き込んで作成できますfwrite()が、「重い」DDOS 攻撃の下では、ファイル ポインターが 0 にあると、file.eg に何も書き込めません。"w" mod を使用すると、結果は空のファイルになりますが、 "a" または "c" mod を使用すると、ファイルが存在しないか空の場合、何も書き込まれません (また、空のファイルも作成するだけです)。いくつかの文字があり、文字の後に書き込むか、新しい文字をそれぞれクリアして書き換えます。DDOS が停止すると、すべてが正常になります。ここに私がテストに使用している簡単なコードがありますが、何が問題なのですか? 直せますか?

私はApacheとlighttpdでubuntuでphp5を使用しています...

<?php
$fp = fopen('data.txt', 'w');
fwrite($fp, '1');
fputs($fp, '23');
fclose($fp);
?>
4

1 に答える 1

1

私が質問を理解した方法は、.php ファイル (つまり、書き込み先のファイル) に同時にアクセスする複数の要求がある場合、このコードの実行に問題があるということです。

今、それは絶対確実ではありませんが、flock()はこれを助けるためにあります。基本的な概念は、次のように、書き込みの前にファイルのロックを要求し、そのファイルへのロックを取得できる場合にのみファイルに書き込むことです。

$fp = fopen( $filename,"w"); // open it for WRITING ("w")
if (flock($fp, LOCK_EX | LOCK_NB)) {
    // do your file writes here

    // when you're done, 
    // flush your file writes to a file before unlocking
    fflush($fp);  
    // unlock the file
    flock($fp, LOCK_UN);
} else {
    // flock() returned false, no lock obtained
    print "Could not lock $filename!\n";
}
fclose($fp);

詳細については、マニュアル エントリまたはこの記事を参照してください。

于 2012-11-13T09:35:31.190 に答える