1

在正常情况下,一切正常,我可以使用但在“重度”DDOS 攻击下写入和创建新文件fopen()fwrite()当文件指针位于 0 时,我无法向 file.eg 写入任何内容。使用 "w" mod ,结果将是一个空白文件,但是通过使用 "a" 或 "c" mod ,如果文件不存在或为空,则不会写入任何内容(也只会创建一个空白文件),但如果文件有一些字符,它会在字符之后写入或分别清除和重写新字符。当 DDOS 停止时,一切都会好起来的。这是我用于测试的简单代码,有什么问题?我可以修复它吗?

我在 ubuntu 中使用 php5 和 apache 和 lighttpd ......

<?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 回答